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