Verilog二进制转格雷码转换器仿真输出全为x问题求助
格雷码转换器仿真输出全为
x的问题排查与解决 嘿,我来帮你搞定这个问题!你写的二进制转格雷码的组合逻辑模块本身是没问题的,但测试代码里的一个时序细节导致了仿真输出全是xxxx。
问题出在哪?
在Verilog的仿真规则里,用assign实现的组合逻辑,输出更新会发生在当前仿真时间步的末尾。你的测试代码中,刚给bin_num赋值就立刻调用$display打印结果——这时候Gray_num还没来得及根据新的bin_num完成计算,所以输出还是未知态x。
怎么解决?
只需要在给bin_num赋值后,加一个极短的时间延迟(比如#1),让仿真时间往前推一小步,等组合逻辑完成计算并更新Gray_num的取值后,再执行打印操作就行。
修改后的测试代码如下:
module gray_code_tb; reg [3:0] bin_num; wire [3:0] Gray_num; integer i; gray_code DUT(.bin_num(bin_num),.Gray_num(Gray_num)); initial begin for(i=0;i<16;i=i+1)begin bin_num=i; #1; // 加个延迟,等组合逻辑更新输出 $display("BIN = %b GRAY =%b", bin_num, Gray_num); end end endmodule
额外小建议
虽然不是当前问题的原因,但你可以在initial块开头显式初始化bin_num为4'b0,这样仿真一开始的变量状态会更清晰,避免不必要的未知态干扰。
内容的提问来源于stack exchange,提问作者Aleksandra Dimanić
相关产品推荐
相关产品推荐

