systemVerilog知識(shí)匯總
掃描二維碼
隨時(shí)隨地手機(jī)看文章
interface
Verilog語(yǔ)言使用端口名字連接各個(gè)模塊;
systemVerilog中使用“.*”可以自動(dòng)匹配具有相同名字的線網(wǎng)和端口,自動(dòng)連接的名字必須具有相同的端口位寬,連接的端口類(lèi)型必須兼容;也可以使用“.name”進(jìn)行連接,.name必須滿足端口名字和位寬一直;
Verilog傳統(tǒng)連接的缺點(diǎn):通信協(xié)議接口在多個(gè)模塊中使用,在多個(gè)模塊中都要聲明相應(yīng)的端口,同時(shí)不匹配的聲明會(huì)導(dǎo)致編譯錯(cuò)誤,設(shè)計(jì)文檔修改端口名后需要修改所有的模塊;
interface中集合了多個(gè)Verilog類(lèi)型的信號(hào),是一個(gè)獨(dú)立的端口類(lèi)型,可以簡(jiǎn)化端口連接。interface包含了連接,同步,甚至多個(gè)塊之間的通信,只要在interface里面聲明過(guò)的信號(hào)與端口,在其它模塊中都可以使用。
interface的優(yōu)勢(shì):
接口便于設(shè)計(jì)重用,當(dāng)兩個(gè)塊之間有兩個(gè)以上的信號(hào)連接,并且使用特定的協(xié)議通信的時(shí)候,應(yīng)當(dāng)考慮接口;如果接口組一次又一次的重復(fù)出現(xiàn),應(yīng)該考慮虛擬接口;
接口可以用來(lái)替換原來(lái)在模塊或者程序中反復(fù)聲明并且位于代碼內(nèi)部的一系列信號(hào),減少了連接錯(cuò)誤的可能性;
要增加一個(gè)信號(hào)時(shí),只需要在借口中聲明一次,不需要在更高層聲明,這減少了連接錯(cuò)誤的可能性;
modport允許一個(gè)模塊很方便的將接口中一系列信號(hào)捆綁在一起,也可以為信號(hào)指明方以便工具自動(dòng)檢查。
interface的劣勢(shì):
必須同時(shí)使用接口名和信號(hào)名,可能會(huì)使模塊變得更加冗長(zhǎng);
如果連接的兩個(gè)模塊使用的是一個(gè)不會(huì)被重用的專用協(xié)議,使用接口需要做更多的工作;
連接兩個(gè)接口很困難;
對(duì)于點(diǎn)對(duì)點(diǎn)的連接,使用modport的接口描述跟使用信號(hào)列表的端口一樣的冗長(zhǎng)。
modport為接口內(nèi)部的信號(hào)提供了不同的視圖,在interface中可以提供任意數(shù)量的modport。
clocking可以保證測(cè)試平臺(tái)在正確的時(shí)間點(diǎn)和信號(hào)交互(驅(qū)動(dòng)過(guò)早或者過(guò)晚都會(huì)引起競(jìng)爭(zhēng)),將信號(hào)同步到一個(gè)特定的時(shí)鐘上。interface可以包含多個(gè)clocking。
program block的好處
將驗(yàn)證平臺(tái)與待測(cè)設(shè)計(jì)分隔開(kāi);
在不同的時(shí)間域運(yùn)行,減少了競(jìng)爭(zhēng)現(xiàn)象;
數(shù)據(jù)類(lèi)型
在Verilog中,初學(xué)者經(jīng)常分不清reg和wire兩者的區(qū)別,在sv中對(duì)此進(jìn)行了改進(jìn),這種新的數(shù)據(jù)類(lèi)型為logic,但要求logic不能有多個(gè)結(jié)構(gòu)性的驅(qū)動(dòng)。logic有四種狀態(tài):0,1,x,z。
二值變量(只有兩種狀態(tài),不用做rtl設(shè)計(jì),提供仿真性能,減少內(nèi)存使用量):bit,byte,shortint,int,longint
邏輯仿真特性:
四值狀態(tài)變量的默認(rèn)初始值為x,二值狀態(tài)變量的默認(rèn)初始值為0;
二值初始變量不能表示未初始化狀態(tài);
四值狀態(tài)變量可以賦值給二值狀態(tài)變量,x和z會(huì)轉(zhuǎn)換成0;
$isunknown()可以檢測(cè)表達(dá)式中是否存在x或者z。
固定數(shù)組
支持多維數(shù)組;
超過(guò)邊界的寫(xiě)操作會(huì)被忽略;
超過(guò)邊界的讀操作返回值為x;
byte,shortint,int存放在32位的存儲(chǔ)空間中;
longint存放在64位的存儲(chǔ)空間中
填充數(shù)組
混合數(shù)組
動(dòng)態(tài)數(shù)組
隊(duì)列
隊(duì)列具有排序和搜索的功能;
迅速分配額外的空間和額外的元素;
支持push和pop的操作;
支持add和remove元素操作;
可支付之固定數(shù)組和動(dòng)態(tài)數(shù)組的值給隊(duì)列;
不需要new函數(shù)
當(dāng)滿足以下條件時(shí),動(dòng)態(tài)數(shù)組和固定數(shù)組可以互相復(fù)制:相同的數(shù)據(jù)類(lèi)型和相同數(shù)目的元素。
結(jié)構(gòu)體
具有一組變量或者常數(shù)組成的集合,可以作為一個(gè)整體進(jìn)行操作,也可以操作其中的一部分;
將邏輯上相關(guān)的信號(hào)放在一起,比如一些總線協(xié)議;
可以利用結(jié)構(gòu)體的名字操作整個(gè)變量。
枚舉
抽象變量代表一個(gè)數(shù)值序列;
用戶可以定義每一個(gè)值;
增加了可閱讀性;
支持first,last,next,prev操作;
枚舉類(lèi)型默認(rèn)為int,所有數(shù)值需要唯一
function
函數(shù)執(zhí)行過(guò)程中不消耗仿真時(shí)間,所以函數(shù)中不能有控制時(shí)間的語(yǔ)句。
task
含有input,output或者inout語(yǔ)句;
消耗仿真時(shí)間
封裝:類(lèi)可以把自己的數(shù)據(jù)和方法只讓可信的類(lèi)或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。通過(guò)這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無(wú)關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分;
繼承:是指可以讓某個(gè)類(lèi)型的對(duì)象獲得另一個(gè)類(lèi)型的對(duì)象的屬性的方法。繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。通過(guò)繼承創(chuàng)建的新類(lèi)稱為“子類(lèi)”或“派生類(lèi)”,被繼承的類(lèi)稱為“基類(lèi)”、“父類(lèi)”或“超類(lèi)”。繼承的過(guò)程,就是從一般到特殊的過(guò)程。
多態(tài):就是指一個(gè)類(lèi)實(shí)例的相同方法在不同情形有不同表現(xiàn)形式,比如build_phase中的create。體現(xiàn)不同的效果;
虛函數(shù)
參數(shù)化類(lèi)
隨機(jī)化
rand關(guān)鍵字聲明隨機(jī)變量(指定范圍內(nèi)均勻分布)。
周期性關(guān)鍵字randc(數(shù)據(jù)類(lèi)型只能是bit或者enum)。
constraint語(yǔ)句約束塊。
randomize將對(duì)象中的隨機(jī)變量賦值。
seed隨機(jī)種子。
dist數(shù)值分布操作符(randc的隨機(jī)變量不能設(shè)置權(quán)重)。
:=指定的數(shù)值具有相同的分布權(quán)重;:/指定的數(shù)值均分權(quán)重。
雙向約束
solve before
random_mode()
constraint_mode()
并發(fā)線程
并發(fā)線程沒(méi)有固定的先后執(zhí)行順序;
join
join any
join none
當(dāng)一個(gè)線程執(zhí)行時(shí),只有遇到wait語(yǔ)句才會(huì)停止;
當(dāng)正在執(zhí)行的線程遇到等待語(yǔ)句時(shí),在隊(duì)列中的ready 狀態(tài)的線程可以執(zhí)行;
當(dāng)所有的線程進(jìn)入wait狀態(tài)時(shí),仿真時(shí)間更新,進(jìn)入到下一個(gè)仿真周期;
wait fork:等待所有的并發(fā)進(jìn)程執(zhí)行完成;
disable fork:停止所有并發(fā)子線程的執(zhí)行;
線程內(nèi)部通信
Verilog event:觸發(fā)事件的操作符:->;等待事件的操作符:@
事件 event
不需要聲明為全局變量,就可以將event作為共享資源使用;
觸發(fā)事件的操作符:->(阻塞觸發(fā):觸發(fā)一個(gè)事件不會(huì)阻塞當(dāng)前等待事件的所有進(jìn)程,邊沿敏感信號(hào))和->>(非阻塞觸發(fā):在事件發(fā)生的時(shí)間點(diǎn)創(chuàng)建一個(gè)非阻塞賦值);
等待一個(gè)事件被觸發(fā)的操作符:@和wait;
triggered函數(shù)用來(lái)檢查一個(gè)事件是否被觸發(fā)過(guò),返回值是一個(gè)狀態(tài);
wait_order;
事件變量:Event是一個(gè)獨(dú)立的數(shù)據(jù)類(lèi)型,可以進(jìn)行賦值,當(dāng)把一個(gè)事件復(fù)制給另外一事件時(shí),原事件與目的事件共享原事件,兩個(gè)事件合并為一個(gè)事件;當(dāng)事件合并時(shí),賦值操作僅僅會(huì)影響目的事件的執(zhí)行或等待操作;
取消事件:當(dāng)一個(gè)事件賦值為null,與該事件變量同步的進(jìn)程無(wú)效;
比較事件:不同的事件可以進(jìn)行比較;
旗語(yǔ) semaphore
semaphore通常用于對(duì)共享資源的分配和同步;
共享資源在不同的進(jìn)程中是互斥使用的;
new();get();put();try_put();
在驗(yàn)證平臺(tái),常用semaphore對(duì)共享資源進(jìn)行分配,比如系統(tǒng)總線,在同一個(gè)時(shí)間點(diǎn),只能有一個(gè)驅(qū)動(dòng)使用總線;
郵箱 mailbox
mailbox是sv中不斷進(jìn)程間的通信方式;
將一個(gè)進(jìn)程中的數(shù)據(jù)通過(guò)mailbox傳遞給另外一個(gè)進(jìn)程,當(dāng)mailbox沒(méi)有數(shù)據(jù)時(shí),線程將等待;
mailbox類(lèi)似一個(gè)FIFO,可以設(shè)置一定的深度queue size;當(dāng)郵箱中的信息數(shù)量達(dá)到郵箱的深度時(shí),郵箱為滿;如果郵箱為滿,進(jìn)程就不能再往郵箱中存放消息,直到郵箱中的信息被取走;
new();put();get();try_put();try_get();peek();try_peek();num();
如何在兩個(gè)線程之間傳遞消息:生成器生成事務(wù)數(shù)據(jù)包,然后傳遞給驅(qū)動(dòng)器;生成器和驅(qū)動(dòng)器必須是異步操作;如果生成器和驅(qū)動(dòng)器之間需要同步,則需要額外的握手信息;