🔥 SystemVerilog事件机制深度解析:为什么@e和wait(e.triggered())会导致完全不同的结果?
核心结论:
@e(边沿敏感等待)不响应已触发的事件,而wait(e.triggered())(电平敏感等待)会立即检测历史触发。这是导致两个代码片段执行结果差异的本质原因。
🌟 问题背景:两个关键代码片段
❌ 代码片段1(未打印21)
event e1, e2;
initial begin
$display("10");
->e1; // 触发e1
@e2; // 等待e2触发(边沿敏感)
$display("11");
end
initial begin
$display("20");
->e2; // 触发e2
@e1; // 等待e1触发(边沿敏感)
$display("21"); // 未执行!
end
✅ 代码片段2(全部打印)
event e1, e2;
initial begin
$display("10");
->e1;
wait(e2.triggered()); // 等待e2是否已触发(电平敏感)
$display("11");
end
initial begin
$display("20");
->e2;
wait(e1.triggered()); // 等待e1是否已触发(电平敏感)
$display("21"); // 正常打印
end
🔍 问题一:为什么代码片段1死锁(21未打印)?
⚠️ 执行流程关键点(仿真时间0)
| 进程 | 语句 | 事件状态 | 等待行为 |
|---|---|---|---|
| 进程1 | ->e1; |
e1 已触发< |

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



