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

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仿真操作

  1. 将被测模块和测试台代码一起编译。
  2. 启动仿真时选择测试台模块tb_lfsr_prng(而非直接仿真lfsr_prng)。
  3. 将clk、rst、out、lfsr等信号添加到波形窗口。
  4. 点击运行按钮,即可看到正常的波形变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:11:13