當(dāng)前位置:首頁 > > ZYNQ

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ū)動器之間需要同步,則需要額外的握手信息;


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉