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

Vivado中模块例化为何会影响output reg的值?

为什么Vivado中模块例化会影响output reg的值?

相关代码

被例化模块代码

module second_module(
    input [7:0] d,
    output reg [7:0] q
);
initial
        q <= ~d;
endmodule

顶层模块代码

module top_module(
    input [7:0] d,
    input [1:0] sel,
    output reg [7:0] q
   
);
    wire [7:0] w1,w2,w3;
    assign sel=1;
    assign w1=7'd0;
    assign d=7'd1;

initial
    begin
        case (sel)
            0: q = d;
            1: q = w1;
            2: q = w2;
            3: q = w3;
        endcase
        $display("%b",q);
    end
    
second_module u1(//remark later
        .d      (d),
        .q      (w1)
    );

endmodule

运行现象

  • 保留模块例化时,仿真输出为:xxxxxxxx
  • 注释掉模块例化部分后,输出恢复正常:00000000

问题分析

1. 核心原因:w1的多重驱动冲突

顶层模块中,w1同时被两个源驱动:

  • 连续赋值语句assign w1=7'd0;直接给w1赋值为0;
  • 例化的second_module u1通过输出端口.q(w1)给w1赋值为~d(即~7'd1=8'hfe)。

Verilog中,wire型信号被多个驱动源同时驱动时,会触发线网分辨率规则,最终信号值会变为未知态x。当顶层initial块中case分支选中sel=1时,q被赋值为w1的未知态,因此输出xxxxxxxx。

2. 注释例化后的正常逻辑

注释掉second_module u1后,w1仅由assign w1=7'd0;单一驱动源控制,值确定为0,因此q被赋值为0,输出00000000。

3. 额外编码问题

顶层模块中对输入端口d、sel使用assign赋值属于不良习惯:输入端口应由外部激励驱动,内部连续赋值会导致输入端口被多重驱动,虽然未直接引发本次输出问题,但在综合或复杂仿真中可能引发其他异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:42:34