如何在Verilog中监测power_a与power_b为低窗口内q信号的全程值
解决方案
你原有代码仅在power_b刚拉低的时刻采样一次q,自然无法覆盖后续50ns的整个低电平窗口。可以通过Verilog的并行线程(fork-join)实现无时钟下的持续信号监测,修改后的任务代码如下:
task power_task; #1; power_a = 0; #5; // skew power_b = 0; fork // 监测线程:窗口内持续检测q的电平 begin: q_monitor while (power_a == 0 && power_b == 0) begin @(q); // 等待q信号发生跳变 if (q == 1'b1) begin $error("检测失败:power_a、power_b均为低时q拉高,错误时间:%0t ns", $time); // 若需要错误后直接停止仿真,可取消下面注释 // $finish; end end end // 计时线程:50ns窗口结束后终止监测 begin: window_timer #50; disable q_monitor; // 关闭监测线程 $display("pass:50ns电源低窗口内q始终为低电平"); end join // 原有电源恢复逻辑 power_b = 1; #5; power_a = 1; endtask
实现逻辑说明
fork-join块会同时启动内部的两个独立线程,不需要时钟触发- 监测线程会循环等待
q的电平跳变,只要两个电源信号都处于低电平,每次q变化都会立刻检查是否符合要求 - 计时线程等50ns窗口结束后,主动终止监测线程,输出测试通过的提示
可选简化方案(SystemVerilog环境支持)
如果你的仿真工具支持SystemVerilog语法,用断言可以更简洁实现相同功能,只需要在power_b=0之后添加对应断言即可:
// 只要在power_a、power_b为低的区间内,q跳变时必须为低 assert property (@(q) disable iff(power_a != 0 || power_b != 0) (q == 1'b0)) else $error("q在电源低窗口内拉高,错误时间:%0t ns", $time); #50; // 等待窗口结束后再执行后续逻辑
内容的提问来源于stack exchange,提问作者John_cena
相关产品推荐
相关产品推荐

