为何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
关键修正点
- 移除inout端口:累加器的
sum是需要存储状态的输出,不需要双向端口,改用output reg类型,用寄存器持久化结果。 - 改用时序逻辑:通过时钟
clk触发累加操作,避免组合逻辑环路,同时保证结果更新的可控性。 - 添加复位与初始值:通过
rst_n和init_sum可以设置累加的初始状态,替代原inout端口的输入功能。
如果确实需要使用双向端口(不推荐用于累加场景),必须给sum添加三态驱动,确保同一时刻只有一个驱动源,但这完全不符合累加器的设计需求,因此优先推荐上述时序逻辑方案。
内容的提问来源于stack exchange,提问作者Amol Choubey
相关产品推荐
相关产品推荐

