參考資料:
(1) 公眾號-芯片學堂;
(2) uvm中獲取cmdlind內容 | 駿的世界 (lujun.org.cn)
背景:當在創建動態仿真case時,使用命令行參數可以方便地控制DUT和TB的行為,比如配置寄存器、控制激勵的發送數量、打開或關閉某些scoreboard等;
1.sv系統函數($test$plusargs(arg_string)與$value$plusargs(arg_string, target_var))
(1) 通過命令行來傳遞參數在實際項目中算是常規操作,比如通過命令行參數來指定Testbench的配置信息等等。
(2) 在SystemVerilog LRM規范里,命令行提供的仿真參數要求使用加號(+)作為引導,這部分參數可以被驗證環境中的SV代碼通過系統函數訪問到。由於是額外增加的,這些參數也就被稱之為plusargs。
(3) 訪問plugargs的系統函數有$test$plusargs(arg_string)和$value$plusargs(arg_string, target_var)。這兩個系統函數都會根據用戶指定的字符串arg_string,去檢索plusargs列表。如果找到了,則系統函數返回值1;如果沒有找到,返回值0。
1.1$test$plusargs(arg_string)
$test$plusargs(arg_string)可以被用於判斷命令行是否帶了arg_string參數,以此來作為驗證環境的配置開關;
1.2$value$plusargs(arg_string, target_var)
$value$plusargs(arg_string, target_var)是在$test$plusargs的基礎上,增加了對參數arg_string的值的解析:如果匹配到了arg_string,系統函數會將其值賦給target_var;如果沒有找到,則不修改target_var的值。
2.sv系統函數($test$plusargs(arg_string)與$value$plusargs(arg_string, target_var))的缺點
(1) 位置太隨意,可以在module, class, interface等任何能使用begin/end塊的地方解析命令行參數,這樣會造成互相影響;
(2) 命令行參數的格式必須同解析的格式一樣,否則會傳遞失敗,甚至傳遞錯誤的值;比如,按照16進制解析的參數,如果按照10進制傳遞,就會傳遞錯誤的值;
(3) 不支持數組和枚舉類型的數據;
3.uvm_cmdline_processor(提供當前仿真命令行參數的接口)
(1) uvm定義的一套命令行參數規則,可以方便地從命令行傳遞常用類型數據到tb里;
(2) uvm_cmdline_processor繼承自uvm_report_object,再往上到uvm_object。
(3) uvm_cmdline_processor提供的底層函數接口,跟$test$plusargs和$value$plusargs沒有什么大的區別,不過其中有匹配功能或返回參數列表的函數,對於uvm_root解析UVM配置相關的參數很有幫助。
(4) uvm_cmdline_processor是單實例類,並提供了get_inst()靜態方法用來獲取對象句柄。UVM默認在初始化的時候,會構造uvm_cmdline_processor的全局對象,叫uvm_cmdline_proc。在實際使用中,按照習慣,先聲明一個uvm_cmdline_processor句柄,然后通過get_inst()函數來指向uvm_cmdline_processor對象。
(5) uvm命令行參數什么時候生效:new函數之后,build_phase的super.build_phase中;
(6) uvm命令行參數的限制:uvm命令行參數目前只能給component傳遞,不能給object傳遞;
3.1 function get_arg_matches
4.uvm_cmdline_processor使用示例
4.1 傳遞int類型參數
4.2 傳遞string類型參數