SystemVerilog中是否可以按引用传递信号给property实现复用?
问题原因
- SystemVerilog LRM 明确规定
property、sequence类型的形式参数不支持ref修饰符,这是编译报错的直接原因。 - 断言类结构的参数默认采用按名绑定的传递规则,和普通task/function的传值逻辑不同:调用时不会做静态值拷贝,每次属性求值时都会实时读取绑定信号的当前值,完全不需要
ref就能感知信号的实时变化,此前对参数传递方式的认知存在偏差。
复用实现方案
直接移除ref修饰符即可正常使用,示例代码如下:
property reg_change(int num_cycles, 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)); // 其余寄存器直接调用该property即可,无需重复编写逻辑
兼容性优化
如果需要适配不同位宽的寄存器/信号,可以使用无类型参数声明,不需要指定参数类型,适配性更强:
// 无类型参数支持任意位宽的信号传入 property reg_change(int num_cycles, some_reg); @(posedge CLK) $changed(some_reg) |-> ##num_cycles $changed(some_reg); endproperty
内容的提问来源于stack exchange,提问作者Melandru's Square
相关产品推荐
相关产品推荐

