System verilog 如何在系统verilog中通过$value$plusargs传递信号名

System verilog 如何在系统verilog中通过$value$plusargs传递信号名,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我正在系统verilog中编写断言。此断言检查作为测试参数通过开关$value$plusargs作为GPIO_SEL=“test_bench.GPIO”传递的信号“lock” 所以我的代码是: module ab string abc; $value$plusargs("GPIO_SEL=%s" , abc); reg lock; always @* begin lock = abc; end endmodule 这里的问题是信号锁没有得到test_bench.gpio的值。是否有任何方

我正在系统verilog中编写断言。此断言检查作为测试参数通过开关$value$plusargs作为GPIO_SEL=“test_bench.GPIO”传递的信号“lock”

所以我的代码是:

module ab 
string abc;
$value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always @* 
begin
lock = abc;
end

endmodule

这里的问题是信号锁没有得到test_bench.gpio的值。是否有任何方法可以从testplaus args传递此信号值

看起来您需要将字符串转换为整数类型。查看字符串转换函数:
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
SystemVerilog是一种语言,不是。不能使用字符串直接访问标识符。您可以在命令行上使用编译器指令

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

你可以用一个简单的数字而不是字符串来选择

感谢您的输入,但是我需要在断言中使用这个信号“sig”。我有以下断言代码:property check_sig;禁用iff(!sig)//添加一些检查;endproperty:检查_sig;所以,如果我使用atoi转换,我可以使用上面的属性赋值吗?是什么阻止您在断言中使用它?该示例仅显示如何为信号分配一个plusarg值。你可以根据自己的需要扩展它。您询问了信号值。即使您提到了更改,模拟也不是“test_bench.gpio”的信号值。对不起,我不再理解您的问题。在你的例子中没有这样的信号。请提供一个可复制的示例,说明您正在尝试执行的操作。我将通过值plusargs传递GPIO_SEL,作为GPIO_SEL=test_bench.GPIO。现在我在sv测试用例中使用这个GPIO_SEL作为:字符串pll_lock_SEL$价值$plusargs(“GPIO_SEL=%s”,pll_lock_SEL);线锁0;分配lock_0=pll_lock_sel;现在,此锁定0信号未获得值test_bench.gpio。为什么会这样?我可以通过这个GPIO_SEL作为TestPlusArg吗?然后使用lock=`GPIO_SEL??不,$test$plusargs和$value$plusargs在模拟时执行。您只能在编译时创建对信号名称的引用。如果您需要引用一组固定的信号,可以使用
If/else
case
语句从信号集中进行选择。我可以使用reg来存储这些字符串吗。foreg:string lock=test_bench.gpio;reg[8*22:0]锁0;始终@*开始锁定\u 0=锁定;endNo。请使用+定义。再查询一次。当我在我的测试用例中使用直接赋值时,比如wire lock=test_bench.gpio,它会工作,但只有当我通过$value$plusargs赋值时,我才面临这个问题。为什么会这样?