System verilog 握手用SVA

System verilog 握手用SVA,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我正在尝试为握手过程编写SVA断言 在我的搜索中,我发现了以下内容: property p_handshake(clk,req,ack); @(posedge clk) req |=> !req [*1:max] ##0 ack; endproperty assert property(p_handshake(clock,valid,done)); 但是,我的“完成”信号允许在有效周期变高后的许多周期内出现。您如何使此语句确保在断言valid之后的任意点断言“done”,而不取消断言va

我正在尝试为握手过程编写SVA断言

在我的搜索中,我发现了以下内容:

property p_handshake(clk,req,ack);
@(posedge clk)
req |=> !req [*1:max] ##0 ack;
endproperty
assert property(p_handshake(clock,valid,done));
但是,我的“完成”信号允许在有效周期变高后的许多周期内出现。您如何使此语句确保在断言valid之后的任意点断言“done”,而不取消断言valid

$rose(req) |=> req[*1:$] ##0 ack;
$rose
将在
req
的上升沿上启动断言<代码>[*1:$]表示在1到无限时钟范围内,左侧必须为真。您可以使用
[+]
,这相当于
[*1:$]

其他一些书写棋盘格的方式有:

$rose(req) |-> req[*1:$] ##1 (ack && req);
$rose(req) |-> ##1 req throughout ack[->1];

您是否还需要SVA来确保当$rose有效时,done未被断言? 如果你这么做了,请考虑一下这个 $rose(有效)|->完成##1$stable(~done)[*949:950]##[1:$]完成


上述操作需要在一段时间内不进行断言,然后在将来的某个时候进行断言。

这里有趣的一点是,您(正确地)使用了
$rose()
作为启用条件。这样做的原因,不仅仅是
req |->…
,是为了避免在
req
较高的每个周期(只有第一个周期)生成断言线程。这是一场巨大的表演胜利。