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

为何Verilog中inout端口sum未被最后assign语句更新?求修正代码

问题分析与修正代码

你的代码核心问题是组合逻辑环路加上inout端口的错误用法:

  • sum作为inout端口,同时被用于读取(temp_sum = sum + in)和连续赋值(sum = temp_sum),形成了无限循环的组合逻辑链,仿真工具无法解析出稳定的sum值,自然无法完成更新。
  • 累加操作本质是时序逻辑(需要存储之前的结果),用组合逻辑的连续赋值实现本身就不符合设计逻辑。

修正后的代码(标准时序累加器)

module adder(
    input clk,
    input rst_n,          // 低电平有效复位
    input [63:0] in,
    input [63:0] init_sum,// 累加初始值输入
    output reg [63:0] sum // 寄存器存储累加结果
);

// 时钟上升沿触发累加,复位时加载初始值
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        sum <= init_sum;
    end else begin
        sum <= sum + in;
    end
end

endmodule

关键修正点

  1. 移除inout端口:累加器的sum是需要存储状态的输出,不需要双向端口,改用output reg类型,用寄存器持久化结果。
  2. 改用时序逻辑:通过时钟clk触发累加操作,避免组合逻辑环路,同时保证结果更新的可控性。
  3. 添加复位与初始值:通过rst_n和init_sum可以设置累加的初始状态,替代原inout端口的输入功能。

如果确实需要使用双向端口(不推荐用于累加场景),必须给sum添加三态驱动,确保同一时刻只有一个驱动源,但这完全不符合累加器的设计需求,因此优先推荐上述时序逻辑方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:28:21