SystemVerilog 断言检查实现A和B信号 A早于B信号5拍内拉高或B早于A信号5拍内拉高都认为是正确的
时间: 2025-03-11 07:25:53 浏览: 44
### 实现 SystemVerilog 断言
为了验证信号 A 和 B 的时间关系,在 SystemVerilog 中可以通过定义 `property` 来描述这种约束条件。具体来说,可以创建两个序列分别用于检测 A 是否在 5 个时钟周期内使 B 拉高以及 B 是否在 5 个时钟周期内使 A 拉高。
#### 定义 Sequence
对于第一个需求——A 在 5 个时钟周期内使得 B 变为高电平:
```systemverilog
sequence seq_A_to_B;
@(posedge clk) $rose(A) |-> ##[1:5] B;
endsequence : seq_A_to_B
```
这段代码表示当 A 上升沿发生之后的一到五个时钟周期内的某个时刻,B 应该变为高电平[^1]。
对于第二个需求——B 在 5 个时钟周期内使得 A 变为高电平:
```systemverilog
sequence seq_B_to_A;
@(posedge clk) $rose(B) |-> ##[1:5] A;
endsequence : seq_B_to_A
```
这里 `$rose()` 函数用来捕捉上升沿事件,而 `|->` 是隐含的因果关系操作符,意味着前件一旦满足就期望后续能在指定范围内观察到后件的发生[^2]。
#### 创建 Property 并应用 Assert Statement
接下来把上述两个序列组合成属性并应用于 assert statement:
```systemverilog
property prop_AB_relation;
(seq_A_to_B throughout !B) and (seq_B_to_A throughout !A);
endproperty : prop_AB_relation
// 使用 always 块持续监控此性质
always_ff @(posedge clk or negedge rst_n)
if (!rst_n) begin
// Reset condition handling...
else assert property(prop_AB_relation) else $fatal(0, "Signal relation violated!");
```
在这部分代码里,“throughout”关键字确保在整个期间内除了特定条件下其他时候目标表达式的值都应保持不变;同时通过 `assert property(...)` 结构来进行实时监测,只要违反设定好的规则就会调用 `$fatal()` 抛出错误信息[^3]。
阅读全文
相关推荐


















