You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:06:03