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

Verilog编写三路比较器输出恒为x的故障排查

三路比较器输出始终为x的错误定位

你的代码存在两个核心问题,直接导致输出恒为未知态:

  • 信号位宽定义不足:所有信号a/b/out都被定义为1位logic类型,1位信号仅能表示0、1两个值,既无法存储测试用例中给b赋值的2,也无法承载比较结果需要输出的2,赋值超出位宽表示范围时信号会直接变为未知态x。
  • 测试激励无等待延时:initial块中信号赋值和$display打印是零延时顺序执行的,给a、b赋值后组合逻辑还没完成输出更新就执行打印,读到的是信号初始的x值。

修正方案
  1. 把所有参与比较、输出的信号位宽改成至少2位(2位信号可表示0-3,完全覆盖0/1/2三个需求值)
  2. 在每次赋值后添加1个单位时间的延时,等待组合逻辑输出稳定后再打印结果;如果不想加延时,也可以把$display替换为$strobe,该系统函数会在当前时间步所有赋值完成后再执行打印,也能读到正确输出。

修正后的完整代码如下:

module test_bench;
  // 调整为2位位宽
  logic [1:0] a, b, out;

  compare compare (
      .a  (a),
      .b  (b),
      .out(out)
  );

  initial begin
    a = 1;
    b = 0;
    #1; // 等待组合逻辑输出稳定
    $display("a>b => out=%d", out);

    a = 1;
    b = 1;
    #1;
    $display("a=b => out=%d", out);

    a = 1;
    b = 2;
    #1;
    $display("a<b => out=%d", out);
  end
endmodule

module compare (
    // 端口调整为2位位宽
    input  logic [1:0] a, b,
    output logic [1:0] out
);

  always_comb begin
    if (a > b) out = 0;
    else if (a == b) out = 1;
    else out = 2;
  end

endmodule

运行修正后的代码,仿真打印结果符合预期:

a>b => out=0
a=b => out=1
a<b => out=2

内容的提问来源于stack exchange,提问作者haltack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:24:23