當我們在創(chuàng)建動態(tài)仿真case時,使用命令行參數(shù)可以非常方便地控制DUT和TB的行為,比如配置寄存器、控制激勵的發(fā)送數(shù)量、打開或關閉某些scoreboard等。
當面對很多驗證組件,并且有很多命令行參數(shù)需要傳遞的時候,如何才能簡單地實現(xiàn)給這些組件傳遞命令行參數(shù)呢?
大家首先想到的可能是plusargs。
沒錯,plusargs的確是一個非常簡單易用的機制。對于規(guī)模小的項目,完全夠用。但是對于像包含了100個agent、涉及多個工程師共同開發(fā)的復雜大項目,plusargs的缺陷就暴露出來了。
1plusargs的缺陷
首先,plusargs使用的位置太隨意了,可以在module、class、interface等等任何能使用begin/end塊的地方解析命令行參數(shù)。這就埋下了彼此影響的坑。看過jerry之前文章“$test$plusargs(),$value$plusargs()怎么用?有什么坑?”的朋友們還記得,plusargs不僅僅認為“張三”和“張三”同名,連“張三”和“張三豐”也算同名!使用的時候,稍有不慎,可能會因為同名誤傷了其他組件。
其次,plusargs使用的時候,命令行參數(shù)的格式必須跟解析的格式一樣,否則會傳遞失敗,甚至傳遞錯誤的值。比如:按照16進制解析的參數(shù),如果按10進制傳遞,就會傳遞錯誤的值。即使傳遞16進制,到底是按照+data=‘hff00傳遞,還是按照+data=32’hff00傳遞,又或者按照+data=ff00傳遞,也需要提前約定并統(tǒng)一風格。這在大型項目里,直接增加了溝通成本。
另外,plusargs不支持數(shù)組和枚舉類型的數(shù)據(jù)。用戶必須自己編寫額外代碼進行解析。
2uvm命令行參數(shù)簡介
uvm定義了一套自己的命令行參數(shù)規(guī)則,可以非常方便地從命令行傳遞常用類型數(shù)據(jù)到tb里,完美地解決了上面提到的幾個缺陷。下面逐一舉例說明。
2.1 傳遞int類型參數(shù)
圖1 代碼片段1
如圖1代碼片段所示,32和33行定義了40-bit變量data和int變量data_vld,為了讓uvm命令行參數(shù)可以傳遞值給它們,需要添加36和37行的聲明。
這里需要注意下,uvm_field_int只是聲明這個變量按照整數(shù)數(shù)據(jù)類型解析(而不是real浮點數(shù)、string字符串、enum枚舉或者數(shù)組等類型), 大家不用擔心40比特data的高位會丟失。
然后使用下面的命令行參數(shù)就可以分別傳遞參數(shù)值給data和data_vld。
圖2 uvm命令行傳遞int參數(shù)
眼尖的朋友們有沒有發(fā)現(xiàn),這個命令行參數(shù)是不是有些眼熟?沒錯,之前我們聊uvm_info高級技巧的時候,用到的也是類似的命令行參數(shù)。(uvm_info高級技巧(1) ---如何屏蔽某些刷屏的啰嗦調試信息)
1. 等號后面第一個參數(shù)就是component的路徑,也就是當你調用get_full_name所返回的完整路徑名。因為有路徑限制,可以避免不同component的同名問題。類似之前講過的,這里的路徑可以使用星號通配符。
2. 第二個參數(shù)就是要賦值的變量名字,不用再擔心plusargs誤把“張三”和“張三豐”當作同名的問題了。
3. 第三個參數(shù)是傳遞的數(shù)值,這個值可以是10進制也可以是16進制、2進制、8進制,只要符合verilog語法就可以了,uvm會自動解析的。因為要符合verilog語法,所以16進制不能只寫ff00,可以寫32’hff00, ‘hff00, ‘shff00。除此之外,寫成0xff00也是可以的。
2.2 傳遞string類型參數(shù)
對于string類型的數(shù)據(jù),使用方法跟int類似。定義方法如圖3所示,命令行參數(shù)如圖4所示。
圖3 定義string類型參數(shù)
圖4 傳遞string類型參數(shù)
2.3 傳遞enum類型參數(shù)
對于plusargs傳參數(shù),如果要處理enum變量,要么放棄可讀性按照int傳遞,要么先按照string傳遞然后再另外寫case語句解析enum。
對于uvm命令行參數(shù),處理enum就簡單多了。閑言少敘,直接上代碼,如圖5所示。
圖5 定義枚舉類型變量
82行定義了fruit_e這個枚舉類型,85行定義了fruit_e類型的枚舉變量m_frt。88行聲明枚舉變量的時候,相比int或string類型,多了第一個參數(shù),就是枚舉變量具體的枚舉類型。
命令行參數(shù)如圖6所示,直接按照枚舉進行傳遞就好了,uvm會自動解析??闭`,下圖參數(shù)enum當為string
圖6 傳遞枚舉類型參數(shù)
2.4 傳遞int數(shù)組參數(shù)
除了單個的變量,uvm也支持命令行傳遞數(shù)組類型的參數(shù)。如圖7所示。
圖7 聲明數(shù)組類型變量
那么問題來了,對于這100個參數(shù),如果傳遞的大部分參數(shù)都是同樣的值,只有少數(shù)值不一樣,難道還要寫100個命令行參數(shù)嗎?
答案當然是否定的。uvm命令行參數(shù)不僅支持component路徑使用通配符,傳遞數(shù)組的時候,也可以通配。
圖8 使用通配符給數(shù)組傳遞參數(shù)
如圖8所示。先給所有的data元素賦值’hff, 然后單獨給data[88]賦值1。因為命令行參數(shù)后面賦值會覆蓋掉前面的賦值,所以data[88]最終傳遞的是1.
這里大家注意下,數(shù)組類型聲明的是uvm_field_sarray_int, 傳遞參數(shù)的時候還是按照int的方式傳遞,只不過變量名字帶了數(shù)組元素下表,并且支持星號通配符。
2.5 傳遞string數(shù)組和enum數(shù)組
string數(shù)組、enum數(shù)組的使用方法和int數(shù)組類似,沒什么可說的。參照圖9的聲明方法和圖10的命令行參數(shù)。
圖9 聲明string數(shù)組和enum數(shù)組
圖10 傳遞參數(shù)給string數(shù)組和enum數(shù)組
除了上面提到的這些簡單常用的參數(shù)類型,還有類似real浮點數(shù)、動態(tài)數(shù)組、關聯(lián)數(shù)組等類型。大家如果有需求,可以自行參考uvm官方文檔學習使用。限于篇幅,不再贅述。
2.6 uvm命令行參數(shù)什么時候生效的?
善于思考的朋友們,有沒有想到一個問題:既然uvm會自動解析uvm_set_config命令行參數(shù),那么這些參數(shù)值是什么時候傳遞給tb里面的變量的?會不會跟我們初始化的值沖突?
圖11的示例代碼,我們加上變量初始化和打印語句。
圖11 調試uvm命令行參數(shù)生效時間
傳遞命令行參數(shù)+uvm_set_config_int = uvm_test_top.env.agt[0],data,’hdeadbeef,根據(jù)圖12的測試結果可以看到,40行打印出的data值是32行初始化的,45行打印的data值是uvm_set_config_int命令行參數(shù)傳遞的,41行的賦值被命令行參數(shù)給覆蓋掉。
也就是說,uvm_set_config_int是在new之后,build_phase之前完成的。大家在使用的時候一定要注意這個失效時間,避免多次賦值互相干擾。
圖12 uvm_set_config參數(shù)生效時間測試結果
3uvm命令行參數(shù)的限制
1. uvm命令行參數(shù)目前只能給component傳遞,不能給object傳遞。不過大家可以換一個思路,比如sequence里面要用參數(shù)mydata的話,可以傳遞到對應的sequencer,在sequence里面通過調用p_sequencer.mydata就可以了。
圖13 間接傳遞uvm命令行參數(shù)給sequence
2. uvm命令行參數(shù)指定component路徑的時候,如果要使用星號通配符,需要格外注意。因為uvm會把env*.sequencer匹配成env.sequencer、env0.sequencer、env0.agent.sequencer、env1.sequencer、env1.agent.sequencer等等(精通正則表達式的朋友們可以繼續(xù)發(fā)散)。
3. uvm命令行參數(shù)會自動在new之后,build phase之前解析。使用的時候注意不要被覆蓋了。
總結
Q哥今天給大家安利了uvm命令行傳遞參數(shù)的小技巧。相比plusargs,uvm命令行參數(shù)當然不是完美的,但是用到恰當?shù)膱鼍跋?,還是可以事半功倍的。大家在使用的時候,注意下上面的提到的幾個問題。
審核編輯:湯梓紅
-
參數(shù)
+關注
關注
11文章
1860瀏覽量
32439 -
UVM
+關注
關注
0文章
182瀏覽量
19232 -
代碼
+關注
關注
30文章
4830瀏覽量
69090 -
命令行
+關注
關注
0文章
78瀏覽量
10422
原文標題:你還在用plusargs傳遞參數(shù)嗎?來試試這個玩法~
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
支持命令行傳遞的參數(shù)嗎?
如何獲取其它程序的命令行參數(shù)
C語言入門教程-命令行參數(shù)
caxa命令行中的應用
C語言中一個簡單的實例,檢查命令行是否有提供參數(shù)
如何從命令行獲取和解析參數(shù)
LabVIEW命令行調用exe傳入的參數(shù)如何獲取
![LabVIEW<b class='flag-5'>命令行</b>調用exe傳入的<b class='flag-5'>參數(shù)</b>如何獲取](https://file1.elecfans.com/web2/M00/A9/68/wKgZomUl-sGAX7xtAAAfL9t9gwE799.png)
評論