在 SystemVerilog 断言(SVA)中,|-> 和 |=> 都是蕴含操作符 ,用于连接前提条件(antecedent)和后续条件(consequent)。它们的核心区别在于检查后续条件的起始时间点。
1. 重叠蕴含 |->
-
含义 :若前提条件在当前时钟周期成立,则在同一时钟周期开始检查后续条件。
-
时间关系 :前提和后续的第一个时钟周期重叠。
示例
property p_overlap;
@(posedge clk) a |-> b;
endproperty
-
当
a在时钟周期T为真,则在同一个周期T检查b是否为真。 -
如果后续条件是一个序列(如
##1 c),则从周期T开始匹配序列:b在T周期成立,c在T+1周期成立。
2. 非重叠蕴含 |=>
-
含义 :若前提条件在当前时钟周期成立,则从下一个时钟周期开始检查后续条件。
-
时间关系 :前提和后续的第一个时钟周期间隔一个周期。
示例
property p_nonoverlap;
@(posedge clk) a |=> b;
endproperty
-
当
a在周期T为真,则在下一个周期T+1检查b是否为真。 -
这等价于
a |-> ##1 b。
3. 对比表
| 操作符 | 后续检查起始点 | 等价写法 | 典型应用场景 |
|---|---|---|---|
| ` | ->` | 同一周期 | `a |
| ` | =>` | 下一周期 | `a |
4. 举例说明
假设一个简单的协议:请求 req 拉高后,同一周期内 允许 gnt 为高(流水线响应),或者下一个周期 gnt 必须为高。
-
使用
|->检查立即响应:req |-> gnt; // gnt 必须在 req 的同一周期有效 -
使用
|=>检查延迟响应:req |=> gnt; // gnt 必须在 req 的下一周期有效
5. 注意事项
-
序列嵌套 :后续条件可以是复杂序列。
|->序列的起点是当前周期,|=>的起点是下一周期。 -
多周期延迟 :若需要延迟多拍,推荐用
|-> ##n ...,更清晰。|=>仅用于正好一拍延迟。 -
常见错误:混淆两者会导致断言在错误的时间点检查,产生误报或漏报。
总结
-
用
|->:前提满足后立即检查后续(同一周期开始)。 -
用
|=>:前提满足后下一拍才开始检查后续。
选择哪个取决于设计时序:响应是组合逻辑路径(同拍)还是寄存输出(下一拍)。