System verilog 宽度可配置时如何写入脉宽systemverilog断言

System verilog 宽度可配置时如何写入脉宽systemverilog断言,system-verilog,assertions,system-verilog-assertions,System Verilog,Assertions,System Verilog Assertions,情况是: 信号激活可以是1个周期、2个周期、3个周期或4个周期宽,具体取决于模块的配置[1:0]输入 为此写入属性的最简单方法是: property p_PropA; @(posedge clk) $rose active ##config ~active; endproperty 但这在语法上是错误的。 编写此断言的正确方法是什么?您需要使用局部变量,请参阅§16.10局部变量 下面是一个简单的例子: property p_PropA; int count; @(posedg

情况是: 信号
激活
可以是1个周期、2个周期、3个周期或4个周期宽,具体取决于模块的
配置[1:0]
输入

为此写入属性的最简单方法是:

property p_PropA;
    @(posedge clk) $rose active ##config ~active;
endproperty
但这在语法上是错误的。
编写此断言的正确方法是什么?

您需要使用局部变量,请参阅§16.10局部变量

下面是一个简单的例子:

property p_PropA;
  int count;
  @(posedge clk)
  ($rose(active),count=config) |->
    (active,count--)[*] ##1 (~active && count==0);
endproperty

谢谢,[*]是如何使用的?据我所知,[*]代表seq[*0]或seq[*1:$]。这将减少每个周期的计数,直到active不为真。但是,如果激活,则可以在6个时钟后取消设置,计数将为负数,在计数==0检查时失败。对吗?我需要确保直到最后一个活动被取消评估后模拟才会结束。
seq[*]
等同于
seq[*0:$]
(请参见中的16.9.2)。是的,计数器可能会显示为负数。要使长脉冲更快地发出失败消息,可以使用:
(活动和计数>0,计数-)[*]##1(~active和计数==0)
。您也可以用其他方式进行编码(例如my),但它们都需要局部变量。感谢您的解释:)