Validation 系统verilog属性定义中[->;1]的含义

Validation 系统verilog属性定义中[->;1]的含义,validation,system-verilog,verification,assertion,system-verilog-assertions,Validation,System Verilog,Verification,Assertion,System Verilog Assertions,我无法找到[->]表达式的含义。我熟悉使用范围作为[a:b]或序列,例如EVENT1 |->EVENT2,但不熟悉我在开头提到的范围 上下文是一个断言属性,它确保clk1在重置为低时始终处于切换状态 @(clk2) disable iff(rst) !$stable(clk1)[->1]; 你知道[->]的真正含义吗 提前谢谢 [->N]表示“不连续的精确重复”a[->N]表示a的N次非连续重复,匹配正好发生在a的第N次重复之后 因此,例如,a##1b[->2]##1c将匹配

我无法找到
[->]
表达式的含义。我熟悉使用范围作为
[a:b]
或序列,例如
EVENT1 |->EVENT2
,但不熟悉我在开头提到的范围

上下文是一个断言属性,它确保clk1在重置为低时始终处于切换状态

@(clk2) disable iff(rst) !$stable(clk1)[->1];
你知道
[->]
的真正含义吗

提前谢谢

[->N]
表示“不连续的精确重复”
a[->N]
表示a的N次非连续重复,匹配正好发生在a的第N次重复之后

因此,例如,
a##1b[->2]##1c
将匹配

          _
a _______/ \_____________________
         |          _     _ 
b _________________/ \___/ \_____
         |                  _
c _________________________/ \___
         |                   |
         |                   |
match    |<----------------->|
[=N]
表示“非连续重复”
a[=N]
表示a的N次非连续重复,匹配发生在a的第N次重复之后的任何时间

因此,例如,
a###1b[=2]##1c
将匹配上面的第二种模式。

[->N]
表示“非连续的精确重复”
a[->N]
表示a的N次非连续重复,匹配正好发生在a的第N次重复之后

因此,例如,
a##1b[->2]##1c
将匹配

          _
a _______/ \_____________________
         |          _     _ 
b _________________/ \___/ \_____
         |                  _
c _________________________/ \___
         |                   |
         |                   |
match    |<----------------->|
[=N]
表示“非连续重复”
a[=N]
表示a的N次非连续重复,匹配发生在a的第N次重复之后的任何时间


因此,例如,
a##1b[=2]##1c
将匹配上面的第二个模式。

基本上有3个这样的运算符:

连续重复[*n]-

(a ##1 b[*2] ##1 c) = (a ##1 b ##1 b ##1 c)
这意味着,a应该被断言,然后b应该在连续的2个时钟信号上被断言,在下一个时钟信号中断言c之后

转到重复[->n]-

(a ##1 b[->2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 c)
(a ##1 b[=2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 !b[*0:$] ##1 c)
这意味着,a应该被断言,然后b应该在2个时钟信号上被断言,但不是连续地。一旦b在2个时钟信号上被断言,在下一个时钟信号上,c应该被断言

不连续重复[=n]-

(a ##1 b[->2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 c)
(a ##1 b[=2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 !b[*0:$] ##1 c)
这意味着,a应该被断言,然后b应该在2个时钟信号上被断言,但不是连续地。一旦b在2个时钟信号上被断言,c应该被断言,在b再次被断言第三次之前

请记住,[->n]&[=n]运算符之间的差异与 最后一个操作数“c”。在[->2]中,应在下一个时钟上断言c 勾选,只要b被断言两次(非连续)。但在[=2]中, 在b第三次被断言之前,c应该被断言(非 连续地)


基本上有3个这样的运营商:

连续重复[*n]-

(a ##1 b[*2] ##1 c) = (a ##1 b ##1 b ##1 c)
这意味着,a应该被断言,然后b应该在连续的2个时钟信号上被断言,在下一个时钟信号中断言c之后

转到重复[->n]-

(a ##1 b[->2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 c)
(a ##1 b[=2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 !b[*0:$] ##1 c)
这意味着,a应该被断言,然后b应该在2个时钟信号上被断言,但不是连续地。一旦b在2个时钟信号上被断言,在下一个时钟信号上,c应该被断言

不连续重复[=n]-

(a ##1 b[->2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 c)
(a ##1 b[=2] ##1 c) = (a ##1 ((!b[*0:$] ##1 b)[*2]) ##1 !b[*0:$] ##1 c)
这意味着,a应该被断言,然后b应该在2个时钟信号上被断言,但不是连续地。一旦b在2个时钟信号上被断言,c应该被断言,在b再次被断言第三次之前

请记住,[->n]&[=n]运算符之间的差异与 最后一个操作数“c”。在[->2]中,应在下一个时钟上断言c 勾选,只要b被断言两次(非连续)。但在[=2]中, 在b第三次被断言之前,c应该被断言(非 连续地)


如其他答案所述,系统verilog中基本上有3个重复运算符可用

代码

    @(clk2) disable iff(rst) !$stable(clk1)[->1];
可以解释如下:

如果“rst”为高,则“禁用”断言属性。如果不是这样,检查“1”clk2时钟变化(从高到低或从低到高)时“clk1”是否“不”稳定,不一定在连续clk2时钟变化时

这意味着断言:

  • 如果rst为1,将被禁用(即既不通过也不失败)

  • 如果clk1对于1 clk2时钟变化不稳定(保持在其状态,即高或低),则通过。但在连续的clk2时钟变化中,clk1不一定是不稳定的

  • 否则就会失败


中建议您检查clk1的工作频率是否高于clk2。

如其他答案中所述,系统verilog中基本上有3个重复运算符可用

代码

    @(clk2) disable iff(rst) !$stable(clk1)[->1];
可以解释如下:

如果“rst”为高,则“禁用”断言属性。如果不是这样,检查“1”clk2时钟变化(从高到低或从低到高)时“clk1”是否“不”稳定,不一定在连续clk2时钟变化时

这意味着断言:

  • 如果rst为1,将被禁用(即既不通过也不失败)

  • 如果clk1对于1 clk2时钟变化不稳定(保持在其状态,即高或低),则通过。但在连续的clk2时钟变化中,clk1不一定是不稳定的

  • 否则就会失败


在中,建议您检查clk1是否以高于clk2的频率运行。

这不是系统Verilog而不是Verilog吗?这不是系统Verilog而不是Verilog吗?我相信完全一样。但是,您能告诉我们非连续模式
[=N]
何时会失败吗。在整个模拟过程中,当
c
没有到达时,我看到了这种类型的断言,但从未失败过。@sharvill111一个64000美元的问题。。。如果
a###1b[=2]###1c
是条件而不是前提,那么就没有时间了