在 SystemVerilog 中即时更改变量名称

Change variable name on the fly in SystemVerilog

我想知道 system verilog 是否能够即时更改变量名称。例如,我有以下代码:

var1 = 1;
var2 = 2;
var3 = 3;

我想做以下检查

if(var1 == 1)
  $display("var1 matched");
if(var2 == 2)
    $display("var2 matched");
if(var3 == 3)
  $display("var3 matched");

所以在上面的例子中,如果我有 'n' 个变量,我将进行 'n' 个检查。

因此,出于这个原因,我正在寻找一种替代方法,它的工作原理如下:

for(int i=0; i<=3;i++)
  if($sformatf("var%0d", i) == i) //here the variable name changes on the fly
    $display("var%0d matched", i);

我试过上面的代码,没有错误,但它没有按预期运行。

我也试过这样的字符串连接

for(int i=0; i<=3;i++)
  if({var,$sformatf("%0d", i)} == i) 
    $display("var%0d matched", i);

令人惊讶的是,这也没有出错。但它是将 i 与 i 进行比较,因此总是通过。

谁能告诉我 system verilog 中是否有我可以使用的东西?

谢谢

我刚刚检查了 LRM 中与此相关的部分,但找不到任何表明它受支持的参考资料。您看到的行为是由于您在条件 "if" 语句的 "cond_predicate" 表达式中使用了 $sformatf 函数。

查看 IEEE1800-2012 规范的第 22.5.1 节。您可以使用带有 `` 的宏来从参数构造标识符。

`define  dyn_var(x) var``x
for(int i=1; i<=3;i++)
    if(`dyn_var(i) == i)
        $display("var%0d matched", i);