System verilog SystemVerilog在命中后禁用覆盖属性

System verilog SystemVerilog在命中后禁用覆盖属性,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我有一些封面属性,我希望它们能够非常频繁地发射,我看到它们开始影响我的模拟性能,因为它们发射得如此频繁。我不想删除它们,因为我想确保我仍然命中这些属性,但我不在乎命中它们多少次。有没有办法在覆盖属性被命中一次后禁用它,这样它就不会影响模拟性能 B2BReq : cover property ( @(posedge CLK iff !RESET) Intf.ReqValid ##1 Intf.ReqValid ); 我在想这样的事情: bit cov_disable; B2BReq :

我有一些封面属性,我希望它们能够非常频繁地发射,我看到它们开始影响我的模拟性能,因为它们发射得如此频繁。我不想删除它们,因为我想确保我仍然命中这些属性,但我不在乎命中它们多少次。有没有办法在覆盖属性被命中一次后禁用它,这样它就不会影响模拟性能

B2BReq : cover property ( 
  @(posedge CLK iff !RESET)
  Intf.ReqValid ##1 Intf.ReqValid
);
我在想这样的事情:

bit cov_disable;
B2BReq : cover property ( 
  @(posedge CLK iff !RESET) disable iff(cov_disable)
  Intf.ReqValid ##1 Intf.ReqValid |=> cov_disable = 1
);

但这是不正确的语法。有没有一种方法可以实现这样的效果?

一些工具会在覆盖指令达到某个限制时自动禁用它。我知道在Questa中,默认设置是在命中1次后禁用

此外,通过一个简单的暗示,您可能会得到您想要的更好的性能建模

B2BReq : cover property ( 
  @(posedge CLK iff !RESET)
  Intf.ReqValid |-> ##1 Intf.ReqValid;
);
顺便说一句,你要找的语法是

bit cov_disable;
B2BReq : cover property ( 
  @(posedge CLK iff !RESET) disable iff(cov_disable)
  Intf.ReqValid ##1 Intf.ReqValid |=> (1,cov_disable = 1);
);

当我试图从cover属性“只能在匹配项列表中分配局部变量”中分配全局变量时,我遇到了一个编译错误。是否可以在cover属性中设置这样的全局标志?您如何知道这是性能问题的原因?您是否尝试了我的第一个建议?我正在使用Questa coverage viewer查看cover指令的“峰值内存时间”,它位于列表的顶部。我试过你建议的改变,但我看不出峰值记忆时间有什么不同。我想这是我的问题。“峰值内存时间”是指达到峰值内存的模拟时间,而不是为此封面分配/释放内存所花费的时间。