本文分享一些SystemVerilog的coding guideline。
1、Use a descriptive typedef for variables
在數(shù)字電路中,萬(wàn)物皆為二進(jìn)制,甚至在Systemverilog的演進(jìn)過(guò)程中連wire和reg都不做區(qū)分,統(tǒng)一成logic。有利也有弊,因?yàn)樵诮y(tǒng)一的過(guò)程其實(shí)也丟失了一些信息。也許可以在注釋中進(jìn)行增補(bǔ)描述,但總是不夠直接,而且變量聲明出錯(cuò)的話,也無(wú)法進(jìn)行檢查。
有以下兩種情況容易出現(xiàn)編碼錯(cuò)誤:
1、例如地址變量,地址的位寬變化時(shí)可能需要大面積的修改(或者用宏代替)
2、相同位寬的信號(hào),可能意義完全不同。例如,logic [4:0] cnt,fsm;
對(duì)此,引入自定義類型語(yǔ)法typedef。
基本格式為:
typedef 已有類型 新類型;
一般自定義類型后面添加一個(gè)_t,方便區(qū)分。
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中應(yīng)該在方法的聲明開(kāi)始和結(jié)束加上label,方便代碼review時(shí)清晰地看出來(lái)task聲明的語(yǔ)句塊范圍。
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驗(yàn)證環(huán)境中如果使用到一些公共組件,建議采用下面這個(gè)形式,即package+`include,將同一個(gè)組件內(nèi)的多個(gè)class都編譯進(jìn)一個(gè)package。
避免在多個(gè)地方去include 一個(gè)class的定義,不然很容易導(dǎo)致類型重復(fù)定義的問(wèn)題。
package A; `include "A_driver.sv"; `include "A_monitor.sv"; ... endpackage : A importA::A_driver; A_drivera_driver;
8、Define one class per file
顯而易見(jiàn),一個(gè)文件只定義一個(gè)class會(huì)更加清晰。例如我們經(jīng)常定位uvm源碼問(wèn)題時(shí)很難通過(guò)vcs.log里面的編譯文件名稱直接找到相應(yīng)的class定義位置。
9、Check that $cast() calls complete successfully
當(dāng)我們使用類的多態(tài)特性時(shí),需要始終使用$cast()。判斷返回值,以確定是否確實(shí)是其子類。類似:
if(!$cast(color,c)) $display("cast failedforc=%0d",c);
10、Check that randomize() calls complete succesfully。
在使用class的randomize()方式隨機(jī)變量時(shí),建議始終檢查隨機(jī)的結(jié)果。不然就只能依賴仿真工具報(bào)Warning。
if(p.randomize() == 0); $display("Randomize fail!!!!");
11、Use if rather than assert to check the status of method calls。
在判斷方法執(zhí)行結(jié)果時(shí),建議使用if-else,而不是使用assert。一般對(duì)于assert fail時(shí),工具只是上報(bào)warning,而不是error。
12、Wrap covergroups in class objects
在class里面構(gòu)造功能覆蓋率,因?yàn)槿绻苯映槿TL信號(hào)的話,那么后仿真時(shí)這個(gè)信號(hào)可能就會(huì)丟失了。而且功能覆蓋率的構(gòu)造會(huì)被設(shè)計(jì)的RTL信號(hào)牽引。
13、Only samplecovergroups using the sample() method
對(duì)于cover group的采樣要非常精細(xì)地控制采樣時(shí)刻,不然會(huì)覆蓋很多非關(guān)鍵時(shí)刻點(diǎn)的數(shù)據(jù)值,也會(huì)誤導(dǎo)覆蓋率分析。
14、Label covergroup coverpoints and crosses
和前面的class加上label一樣,coverpoint也要手動(dòng)加上label,方便verdi打開(kāi)vdb文件時(shí)清晰地看出未覆蓋的場(chǎng)景。
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中某些代碼執(zhí)行時(shí)刻是同一個(gè)step,但是執(zhí)行順序仍然是確定性的。但是建議盡量不要依賴這樣工具行為。
審核編輯:劉清
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
803瀏覽量
42128 -
Verilog
+關(guān)注
關(guān)注
28文章
1365瀏覽量
111763 -
數(shù)字電路
+關(guān)注
關(guān)注
193文章
1637瀏覽量
81547 -
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19422
原文標(biāo)題:SystemVerilog的coding guideline
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論