如何通过系统Verilog中的$ value $ plusargs传递信号名称

时间:2019-11-04 08:25:20

标签: system-verilog system-verilog-assertions

我正在用系统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传递该信号值

2 个答案:

答案 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)

看起来您需要将字符串转换为整数类型。查看字符串转换函数:atoiatobin,...

例如

 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