在 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);
我想知道 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);