Verilog编写三路比较器输出恒为x的故障排查
三路比较器输出始终为x的错误定位
你的代码存在两个核心问题,直接导致输出恒为未知态:
- 信号位宽定义不足:所有信号
a/b/out都被定义为1位logic类型,1位信号仅能表示0、1两个值,既无法存储测试用例中给b赋值的2,也无法承载比较结果需要输出的2,赋值超出位宽表示范围时信号会直接变为未知态x。 - 测试激励无等待延时:
initial块中信号赋值和$display打印是零延时顺序执行的,给a、b赋值后组合逻辑还没完成输出更新就执行打印,读到的是信号初始的x值。
修正方案
- 把所有参与比较、输出的信号位宽改成至少2位(2位信号可表示0-3,完全覆盖0/1/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
相关产品推荐
相关产品推荐

