SystemVerilog 属性 通过引用传递
SystemVerilog property pass by reference
是否可以通过引用将信号传递给 属性?例如,我想创建一个封面 属性 来捕获寄存器的变化,并将这个 属性 重新用于几十个不同的寄存器。我想做这样的事情:
property reg_change(int num_cycles, ref bit some_reg);
@(posedge CLK)
$changed(some_reg) |-> ##num_cycles $changed(some_reg);
endproperty
Reg1Change10Cycles_cp : cover property (reg_change(10, reg1);
Reg2Change10Cycles_cp : cover property (reg_change(10, reg2);
//...
但是我在 属性 中尝试使用 'ref' 时遇到编译错误。我不认为我可以只使用 bit some_reg
因为那将是按值传递,并且永远不会看到 some_reg 变化。无论如何我可以实现这种行为而无需在每个封面 属性 中定义整个 属性?
没有办法也不需要通过引用属性和序列来传递形式参数。断言构造的形式参数被实际参数内联替换。所以从某种意义上说,它们总是被引用。请参阅第 16.8 节在 IEEE 1800-2017 SystemVerilog LRM 中声明序列。相同的参数行为适用于属性。
顺便说一句,你应该让断言参数无类型,除非你需要强类型规则来保持你的断言表达式正确评估。
是否可以通过引用将信号传递给 属性?例如,我想创建一个封面 属性 来捕获寄存器的变化,并将这个 属性 重新用于几十个不同的寄存器。我想做这样的事情:
property reg_change(int num_cycles, ref bit some_reg);
@(posedge CLK)
$changed(some_reg) |-> ##num_cycles $changed(some_reg);
endproperty
Reg1Change10Cycles_cp : cover property (reg_change(10, reg1);
Reg2Change10Cycles_cp : cover property (reg_change(10, reg2);
//...
但是我在 属性 中尝试使用 'ref' 时遇到编译错误。我不认为我可以只使用 bit some_reg
因为那将是按值传递,并且永远不会看到 some_reg 变化。无论如何我可以实现这种行为而无需在每个封面 属性 中定义整个 属性?
没有办法也不需要通过引用属性和序列来传递形式参数。断言构造的形式参数被实际参数内联替换。所以从某种意义上说,它们总是被引用。请参阅第 16.8 节在 IEEE 1800-2017 SystemVerilog LRM 中声明序列。相同的参数行为适用于属性。
顺便说一句,你应该让断言参数无类型,除非你需要强类型规则来保持你的断言表达式正确评估。