systemVerilog知識彙總
阿新 • • 發佈:2018-11-17
interface
Verilog語言使用埠名字連線各個模組;
systemVerilog中使用“.*”可以自動匹配具有相同名字的線網和埠,自動連線的名字必須具有相同的埠位寬,連線的埠型別必須相容;也可以使用“.name”進行連線,.name必須滿足埠名字和位寬一直;
Verilog傳統連線的缺點:通訊協議介面在多個模組中使用,在多個模組中都要宣告相應的埠,同時不匹配的宣告會導致編譯錯誤,設計文件修改埠名後需要修改所有的模組;
interface中集合了多個Verilog型別的訊號,是一個獨立的埠型別,可以簡化埠連線。interface包含了連線,同步,甚至多個塊之間的通訊,只要在interface裡面宣告過的訊號與埠,在其它模組中都可以使用。
interface的優勢:
- 介面便於設計重用,當兩個塊之間有兩個以上的訊號連線,並且使用特定的協議通訊的時候,應當考慮介面;如果介面組一次又一次的重複出現,應該考慮虛擬介面;
- 藉口可以用來替換原來在模組或者程式中反覆宣告並且位於程式碼內部的一系列訊號,減少了連線錯誤的可能性;
- 要增加一個訊號時,只需要在藉口中宣告一次,不需要在更高層宣告,這減少了連線錯誤的可能性;
- modport允許一個模組很方便的將介面中一系列訊號捆綁在一起,也可以為訊號指明方以便工具自動檢查。
interface的劣勢:
- 必須同時使用介面名和訊號名,可能會使模組變得更加冗長;
- 如果連線的兩個模組使用的是一個不會被重用的專用協議,使用介面需要做更多的工作;
- 連線兩個介面很困難;
- 對於點對點的連線,使用modport的介面描述跟使用訊號列表的埠一樣的冗長。
modport為介面內部的訊號提供了不同的檢視,在interface中可以提供任意數量的modport。
clocking可以保證測試平臺在正確的時間點和訊號互動(驅動過早或者過晚都會引起競爭),將訊號同步到一個特定的時鐘上。interface可以包含多個clocking。
program block的好處
- 將驗證平臺與待測設計分隔開;
- 在不同的時間域執行,減少了競爭現象;
資料型別
在Verilog中,初學者經常分不清reg和wire兩者的區別,在sv中對此進行了改進,這種新的資料型別為logic,但要求logic不能有多個結構性的驅動。logic有四種狀態:0,1,x,z。
二值變數(只有兩種狀態,不用做rtl設計,提供模擬效能,減少記憶體使用量):bit,byte,shortint,int,longint
邏輯模擬特性:
- 四值狀態變數的預設初始值為x,二值狀態變數的預設初始值為0;
- 二值初始變數不能表示未初始化狀態;
- 四值狀態變數可以賦值給二值狀態變數,x和z會轉換成0;
- $isunknown()可以檢測表示式中是否存在x或者z。
固定陣列
- 支援多維陣列;
- 超過邊界的寫操作會被忽略;
- 超過邊界的讀操作返回值為x;
- byte,shortint,int存放在32位的儲存空間中;
- longint存放在64位的儲存空間中
填充陣列
混合陣列
動態陣列
佇列
- 佇列具有排序和搜尋的功能;
- 迅速分配額外的空間和額外的元素;
- 支援push和pop的操作;
- 支援add和remove元素操作;
- 可支付之固定陣列和動態陣列的值給佇列;
- 不需要new函式
當滿足以下條件時,動態陣列和固定陣列可以互相複製:相同的資料型別和相同數目的元素。
結構體
- 具有一組變數或者常陣列成的集合,可以作為一個整體進行操作,也可以操作其中的一部分;
- 將邏輯上相關的訊號放在一起,比如一些匯流排協議;
- 可以利用結構體的名字操作整個變數。
列舉
- 抽象變數代表一個數值序列;
- 使用者可以定義每一個值;
- 增加了可閱讀性;
- 支援first,last,next,prev操作;
- 列舉型別預設為int,所有數值需要唯一
function
- 函式執行過程中不消耗模擬時間,所以函式中不能有控制時間的語句。
task
- 含有input,output或者inout語句;
- 消耗模擬時間
- 封裝:類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。通過這種方式,物件對內部資料提供了不同級別的保護,以防止程式中無關的部分意外的改變或錯誤的使用了物件的私有部分;
- 繼承:是指可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。 通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。
- 多型:就是指一個類例項的相同方法在不同情形有不同表現形式,比如build_phase中的create。體現不同的效果;
虛擬函式
引數化類
隨機化
- rand關鍵字宣告隨機變數(指定範圍內均勻分佈)。
- 週期性關鍵字randc(資料型別只能是bit或者enum)。
- constraint語句約束塊。
- randomize將物件中的隨機變數賦值。
- seed隨機種子。
- dist數值分佈操作符(randc的隨機變數不能設定權重)。
- :=指定的數值具有相同的分佈權重;:/指定的數值均分權重。
- 雙向約束
- solve before
- random_mode()
- constraint_mode()
併發執行緒
- 併發執行緒沒有固定的先後執行順序;
- join
- join any
- join none
- 當一個執行緒執行時,只有遇到wait語句才會停止;
- 當正在執行的執行緒遇到等待語句時,在佇列中的ready 狀態的執行緒可以執行;
- 當所有的執行緒進入wait狀態時,模擬時間更新,進入到下一個模擬週期;
- wait fork:等待所有的併發程序執行完成;
- disable fork:停止所有併發子執行緒的執行;
執行緒內部通訊
Verilog event:觸發事件的操作符:->;等待事件的操作符:@
- 事件 event
- 不需要宣告為全域性變數,就可以將event作為共享資源使用;
- 觸發事件的操作符:->(阻塞觸發:觸發一個事件不會阻塞當前等待事件的所有程序,邊沿敏感訊號)和->>(非阻塞觸發:在事件發生的時間點建立一個非阻塞賦值);
- 等待一個事件被觸發的操作符:@和wait;
- triggered函式用來檢查一個事件是否被觸發過,返回值是一個狀態;
- wait_order;
- 事件變數:Event是一個獨立的資料型別,可以進行賦值,當把一個事件複製給另外一事件時,原事件與目的事件共享原事件,兩個事件合併為一個事件;當事件合併時,賦值操作僅僅會影響目的事件的執行或等待操作;
- 取消事件:當一個事件賦值為null,與該事件變數同步的程序無效;
- 比較事件:不同的事件可以進行比較;
- 旗語 semaphore
- semaphore通常用於對共享資源的分配和同步;
- 共享資源在不同的程序中是互斥使用的;
- new();get();put();try_put();
- 在驗證平臺,常用semaphore對共享資源進行分配,比如系統匯流排,在同一個時間點,只能有一個驅動使用匯流排;
- 郵箱 mailbox
- mailbox是sv中不斷程序間的通訊方式;
- 將一個程序中的資料通過mailbox傳遞給另外一個程序,當mailbox沒有資料時,執行緒將等待;
- mailbox類似一個FIFO,可以設定一定的深度queue size;當郵箱中的資訊數量達到郵箱的深度時,郵箱為滿;如果郵箱為滿,程序就不能再往郵箱中存放訊息,直到郵箱中的資訊被取走;
- new();put();get();try_put();try_get();peek();try_peek();num();
- 如何在兩個執行緒之間傳遞訊息:生成器生成事務資料包,然後傳遞給驅動器;生成器和驅動器必須是非同步操作;如果生成器和驅動器之間需要同步,則需要額外的握手資訊;