我正在用系统Verilog编写断言。此断言检查是否有信号“锁”,它作为测试参数通过开关$ value $ plusargs作为GPIO_SEL =“ test_bench.gpio”
传递所以我的代码是:
module ab
string abc;
$value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always @*
begin
lock = abc;
end
endmodule
这里的问题是信号锁定没有获得作为test_bench.gpio的值。有什么办法可以从testplaus args传递该信号值
答案 0 :(得分:1)
SystemVerilog是compiled语言,而不是interpreted。您不能直接使用字符串访问标识符。您可以在命令行上使用编译器指令
module ab;
bit lock;
always_comb
begin
lock = `GPIO_SEL;
end
endmodule
然后,在编译代码时,请使用+define
开关
vlog your_file.sv +define+GPIO_SEL=test_bench.gpio
如果您认为重新编译testbench / dut是一个沉重的负担(大多数工具提供了增量编译选项),并且您具有固定数量的访问路径,则可以使用case语句
module ab
string abc;
initial $value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always_comb
case (abc)
"test_bench.gpio": lock = test_bench.gpio;
"test_bench.gpio1": lock = test_bench.gpio1;
endcase
end
您可以只使用一个简单的数字而不是一个字符串来进行选择。
答案 1 :(得分:0)
看起来您需要将字符串转换为整数类型。查看字符串转换函数:atoi
,atobin
,...
例如
module parg;
string abc;
bit [3:0] sig;
initial begin
$value$plusargs("GPIO_SEL=%s" , abc);
sig = abc.atoi();
$display("sig = %b", sig);
end
endmodule // parg