【原創】關於$test$plusargs和$value$plusargs的小結
Abtract
$test$plusargs和$value$plusargs作為進行Verilog和SystemVerilog仿真運行時調用的系統函數,可以在仿真命令直接進行賦值,並且不局限於不同仿真器對於參數在仿真命令中定義格式不同的限制,也避免了調換參數帶來的頻繁編譯等問題。使用這兩條函數對於搭建測試平台有一定的便利,同時對於理解Factory中用例是如何傳遞進Proxy Class有一定的幫助。
本文將對$test$plusargs和$value$plusargs使用過程中遇到的問題進行小結。
Introduction
首先,在進行宏定義時,我們經常使用`ifdef等命令在代碼中,參看下例:
如果要能夠成功調用$dump等函數,需要在編譯(compile)時指定`define的宏定義,其使用方法如下:
<compile-option> -define dumpon test.v
但是,在仿真過程中不需要該部分定義時該如何處理呢?
當需要改變編譯條件時,經常需要重新編譯。並且一旦編譯通過,在編譯階段指定的宏定義在整個仿真運行過程中一直有效,因此,如果需要修改宏定義,則需要重新進行編譯,從而降低了仿真的效率。
為此,可以使用$test$plusargs和$value$plusargs進行解決,該函數的調用發生在仿真運行(run)階段。這樣僅需要對設計進行一次編譯即可,如果需要改變相應的條件,可以在run的時候動態指定,這樣有利於腳本處理進行回歸的驗證,同時也有利於object的動態construct。
1.$test$plusargs
在運行(run)仿真時指定要選擇的條件,即只需要在仿真運行命令(run-options)中指定參數需要選擇的條件即可,例如下例中,如果要將test01.dat、test02.dat、test03.dat分別load到各自的men中,僅需要如下命令在運行命令中加入“<+test01+test02+test03>”即可,當仿真運行時,$test$plusargs會在命令行中搜索指定的字符,若找到相應字符,在函數返回“1”,否則返回“0”。如果下次仿真時不需要test01時,僅需要將test01從運行命令中刪除即可。
<run-options>+test01+test02+test03...
2.$value$plusargs
$value$plusargs可以講運行命令(run-options)中的參數值傳遞給指定的信號或者字符,其語法格式如下:
Integer=$value$plusargs(“string”,signalname);
其中string=”plusarg_format”+”format_string”,”plusarg_format”指定了用戶定義的要進行傳遞的值,”format_string”指定了要傳遞的值的格式(類似$display中定義的%s、%h、etc.),並且string中”plusarg_format”和”format_string”格式應該為”plusarg_format”(=/+)”format_string”。如果轉換后的位寬和傳遞的值不一致,則按照如下規則轉換:
plusarg位寬與sigalname的關系 |
Signalname值 |
< |
plusarg左補零 |
> |
plusarg截位 |
plusarg為負數 |
按照正數處理 |
不匹配 |
若為指定默認值,則reg類型為x |
$value$plusargs使用示例如下:
若使用的運行命令如下:
<run-options>+FINISH=10000+TESTNAME=this_test+FREQ=5.6666
則上例的運行結果為:
stop_clk : 10000
testname:this_test
frequency:5.6666(如果run-options中沒有增加“FREQ=5.6666”,那么frequency為8.333333)。
3.Conclusion
在實際使用$test$plusargs和$value$plusargs時,需要在編寫代碼初期考慮好使用的范圍,否則,則實際仿真時未必可以對仿真帶來便捷。
【參考文獻】
Synosys.Chris Spear.Extracting Values of Plusargs inside a simulation.