本文分享一些SystemVerilog的coding guideline。
1、Use a descriptive typedef for variables
在數字電路中,萬物皆為二進制,甚至在Systemverilog的演進過程中連wire和reg都不做區分,統一成logic。有利也有弊,因為在統一的過程其實也丟失了一些信息。也許可以在注釋中進行增補描述,但總是不夠直接,而且變量聲明出錯的話,也無法進行檢查。
有以下兩種情況容易出現編碼錯誤:
1、例如地址變量,地址的位寬變化時可能需要大面積的修改(或者用宏代替)
2、相同位寬的信號,可能意義完全不同。例如,logic [4:0] cnt,fsm;
對此,引入自定義類型語法typedef。
基本格式為:
typedef 已有類型 新類型;
一般自定義類型后面添加一個_t,方便區分。
typedeflogic[31:0]word_t;//32位data typedeflogic[15:0]addr_t;//16位addr
2、Use an end label for methods, classes and packages
task local_task(); $display("Insidetask"); endtask:local_task
在systemverilog中應該在方法的聲明開始和結束加上label,方便代碼review時清晰地看出來task聲明的語句塊范圍。
3、Use `includes to compile classes into packages
4、Define classes within packages
5、Only `include a file in one package
6、Import packages to reference their contents
7、Avoid `including the same class in multiple locations
在systemverilog驗證環境中如果使用到一些公共組件,建議采用下面這個形式,即package+`include,將同一個組件內的多個class都編譯進一個package。
避免在多個地方去include 一個class的定義,不然很容易導致類型重復定義的問題。
package A; `include "A_driver.sv"; `include "A_monitor.sv"; ... endpackage : A importA::A_driver; A_drivera_driver;
8、Define one class per file
顯而易見,一個文件只定義一個class會更加清晰。例如我們經常定位uvm源碼問題時很難通過vcs.log里面的編譯文件名稱直接找到相應的class定義位置。
9、Check that $cast() calls complete successfully
當我們使用類的多態特性時,需要始終使用$cast()。判斷返回值,以確定是否確實是其子類。類似:
if(!$cast(color,c)) $display("cast failedforc=%0d",c);
10、Check that randomize() calls complete succesfully。
在使用class的randomize()方式隨機變量時,建議始終檢查隨機的結果。不然就只能依賴仿真工具報Warning。
if(p.randomize() == 0); $display("Randomize fail!!!!");
11、Use if rather than assert to check the status of method calls。
在判斷方法執行結果時,建議使用if-else,而不是使用assert。一般對于assert fail時,工具只是上報warning,而不是error。
12、Wrap covergroups in class objects
在class里面構造功能覆蓋率,因為如果直接抽取RTL信號的話,那么后仿真時這個信號可能就會丟失了。而且功能覆蓋率的構造會被設計的RTL信號牽引。
13、Only samplecovergroups using the sample() method
對于cover group的采樣要非常精細地控制采樣時刻,不然會覆蓋很多非關鍵時刻點的數據值,也會誤導覆蓋率分析。
14、Label covergroup coverpoints and crosses
和前面的class加上label一樣,coverpoint也要手動加上label,方便verdi打開vdb文件時清晰地看出未覆蓋的場景。
classtest; logic[3:0]port_a; covergroup demo_cg with function sample(bit[3:0] i); label:coverpoint i; endgroup ... port_a=1; demo_cg.sample(port_a); endclass
15、Don't rely on static initialization order
SV或者UVM中某些代碼執行時刻是同一個step,但是執行順序仍然是確定性的。但是建議盡量不要依賴這樣工具行為。
審核編輯:劉清
-
二進制
+關注
關注
2文章
803瀏覽量
42151 -
Verilog
+關注
關注
28文章
1366瀏覽量
111812 -
數字電路
+關注
關注
193文章
1637瀏覽量
81578 -
UVM
+關注
關注
0文章
182瀏覽量
19430
原文標題:SystemVerilog的coding guideline
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論