Modelsim波形窗口为空且显示"xxxxxx",Verilog代码问题排查求助
Modelsim波形显示
xxxxxx问题排查与解决 问题根源
波形显示xxxxxx(未知值)并非输出代码直接导致,主要来自两方面:
1. 仿真激励缺失(新手最常见问题)
如果直接在Modelsim中仿真lfsr_prng模块,未给clk和rst输入信号提供激励,这两个信号会处于默认未知态,导致模块内部逻辑全为未知值,输出自然显示xxxxxx。
2. LFSR初始化隐患
你将LFSR复位到全0状态6'b000000,虽然理论上后续逻辑会让LFSR跳出全0,但标准LFSR设计不会用全0作为初始态,容易引发异常行为。
解决步骤
第一步:修正模块代码的复位值
将复位时的LFSR初始值改为非全0,比如6'b000001:
module lfsr_prng (input clk, rst, output reg[2:0] out); reg [5:0] lfsr; always @(posedge clk or posedge rst) begin if (rst) begin // 改为非全0初始态 lfsr <= 6'b000001; end else begin // LFSR feedback logic lfsr[5:1] <= lfsr[4:0]; lfsr[0] <= lfsr[5] ^ lfsr[4] ^ 1'b1; // Assign output bits out[2] <= lfsr[2]; out[1] <= lfsr[4]; out[0] <= lfsr[0]; end end endmodule
第二步:编写测试台提供激励
必须写一个测试台(Testbench)来给模块输入信号生成时钟和复位脉冲,示例代码:
module tb_lfsr_prng; reg clk; reg rst; wire [2:0] out; // 实例化被测模块 lfsr_prng uut ( .clk(clk), .rst(rst), .out(out) ); // 生成100MHz时钟(周期10ns) initial begin clk = 0; forever #5 clk = ~clk; end // 生成复位信号:先复位20ns,再释放 initial begin rst = 1; #20 rst = 0; #100 $finish; // 仿真120ns后结束 end // 导出波形文件(可选,方便后续查看) initial begin $dumpfile("wave.vcd"); $dumpvars(0, tb_lfsr_prng); end endmodule
第三步:Modelsim仿真操作
- 将被测模块和测试台代码一起编译。
- 启动仿真时选择测试台模块
tb_lfsr_prng(而非直接仿真lfsr_prng)。 - 将
clk、rst、out、lfsr等信号添加到波形窗口。 - 点击运行按钮,即可看到正常的波形变化。
内容的提问来源于stack exchange,提问作者Kenneth Lin
相关产品推荐
相关产品推荐

