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

Verilog多模块仿真信号出现X值,疑端口声明问题求助

Verilog仿真X值问题排查与修复

核心问题汇总及修复方案

1. 顶层模块输入端口被内部驱动(语法冲突)

main模块中,clk2、inputsample0、inputsample1被声明为input,却用assign语句内部赋值,违反Verilog语法规则——输入端口不能被模块内部驱动,会直接导致信号状态异常。

修复:
将这些信号改为reg类型,在initial块中生成时钟和输入值:

module main(
    outvec
    );
    
parameter  N = 10;
parameter L =10;
// ... 其他变量声明 ...
reg clk2;
reg rst;
output reg outvec;
reg [3:0] inputsample0;
reg [3:0] inputsample1;
wire  [N-1 : 0] inter_port;

// 生成10ns周期时钟
initial begin
    clk2 = 0;
    forever #10 clk2 = ~clk2;
end

// 初始化复位与输入信号
initial begin
    rst = 1;
    #20 rst = 0;
    inputsample0 = 4'b0101;
    inputsample1 = 4'b0110;
end

// ... 模块实例化 ...

2. Asocciate_mem2模块inputsample端口悬空

Asocciate_mem2模块的inputsample输入端口在main模块实例化时未连接任何信号,导致该端口处于悬空状态(X值),后续feat_value[inputsample[f]]会访问非法地址,持续传递X值。

修复:
根据需求连接对应输入信号,例如合并为总线输入:

Asocciate_mem2 asocciate_mem2_inst (
    .outvec(inter_port),
    .clk(clk2),
    .rst(rst),
    .inputsample({inputsample1, inputsample0}) // 或选择单信号输入
);

3. 寄存器未初始化导致初始X值

Asocciate_mem2中的textVector、rng_seed,hamming中的sum_dis、minVal等寄存器未初始化,仿真时初始状态为X,后续运算会持续传递该无效状态。

修复:
在对应模块中添加initial块初始化寄存器:

// Asocciate_mem2模块内添加
initial begin
    textVector = 0;
    rng_seed = 32'h12345678; // 初始化随机种子
end

// hamming模块内添加
initial begin
    sum_dis = 0;
    minVal = 0;
end

4. 时钟信号恒定无跳变

原代码中assign clk2 = 1;使时钟保持恒定高电平,所有@(posedge clk)触发的时序逻辑永远不会执行,寄存器无法更新,始终保持初始X值。

修复:
参考第1点,用initial+forever生成周期性时钟信号。

5. 循环内非阻塞赋值逻辑错误

Asocciate_mem2和hamming模块的循环中使用非阻塞赋值(<=),导致循环内变量更新延迟,逻辑不符合预期。例如Asocciate_mem2中t3 <= t3 + t2,每次循环都会用旧的t3值更新,无法实现实时累加。

修复:
循环内临时变量改用阻塞赋值(=),仅最终输出寄存器保留非阻塞赋值:

// Asocciate_mem2模块中修改循环逻辑
always @(posedge clk) begin
    reg [N-1 : 0] t3_temp;
    t3_temp = 0;
    for (c =0; c<2; c = c+1)begin
        t3_temp = 0;
        for (f=0; f<2; f = f+1)begin
            t1 = feat_value[inputsample[f]];
            t2 = feat[f] ^ t1;
            t3_temp = t3_temp + t2;
        end
        textVector <= textVector + t3_temp;
    end
end

6. 位宽不匹配问题

feat_value被赋值为1000'b1101001011,但N=10,feat_value是[N-1:0]即10位宽,赋值的1000位常量远大于寄存器位宽,会导致截断,引发意外行为。

修复:
保持赋值常量位宽与寄存器位宽一致:

// Asocciate_mem2模块中修改赋值
feat_value[ 0] <=10'b1101001011;
feat_value[ 1] <=10'b1010010101;
// ... 其他feat_value赋值同理 ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:07:19