VERILOG的參數可以用define和parameter的方式定義,這種方法要求我們在編譯前將變量必須定義好,編譯完成之后再也不能修改;
然而,有時候我們在進行仿真時,需要從外部傳遞參數,這個要求怎么滿足呢?
我們來看下 $test$plusargs和$value$plusargs的功能,首先來看一個簡單的例子:
`timescale 1ns/1psmodule tb;reg[255:0] testname;initial begin$display("**********************RESULT IS BELOW*********************");if($test$plusargs("TAISHAN"))$display("****************TAISHAN is selected******************");else$display("**********************$test$plusargs FAIL**************");if ($value$plusargs("TESTNAME=%s", testname[255:0]))??$display("*****************Running test %0s.********************", testname);?else$display("**********************$value$plusargs FAIL**************");$finish;endendmodule
以synopsis的VCS工具為例,正常編譯后,
在仿真時,不同命令的結果如下:
命令:simv?
輸出:
**********************$test$plusargs FAIL***************
**********************$value$plusargs FAIL**************命令:simv +TAISHAN
輸出:
****************TAISHAN is selected******************
**********************$value$plusargs FAIL**************命令:simv +TAISHAN +TESTNAME=HUASHAN
輸出:
****************TAISHAN is selected******************
*****************Running test HUASHAN.********************
跑完以上例子,對$test$plusargs和$value$plusargs已經有一個初步的了解。
注意,simv有一個bug,假如一段程序中有如下代碼:
if($test$plusargs("TAISHAN")) begin。。。end
if($test$plusargs("TAISHANHAO")) begin。。。end
在仿真時,若采用命令
simv +TAISHANHAO
TAISHANHAO也會觸發分支if($test$plusargs("TAISHAN")) begin。。。end
因此,建議大家在命名時前綴盡量不要一致。