构建PC CHIP遇总线宽度不匹配错误,寻求技术协助
问题排查与修复
错误提示Line 19, out(8) and out(16) have different bus widths的核心原因是存在未定义的信号incIn,工具默认将未定义信号视为8位宽度,而与之连接的16位组件(如Mux16的输入)要求16位,导致总线宽度不匹配。此外,代码的信号连接逻辑也存在顺序错误,需要调整。
具体问题点
- 未定义的
incIn信号:Inc16(in=incIn, out=incOut);中incIn没有被任何信号赋值,工具默认其为8位,和Inc16要求的16位输入不匹配,进而引发后续连接的总线宽度错误。 - 信号连接逻辑顺序错误:当前Mux的连接形成反向依赖,比如
resetMuxOut依赖loadMuxOut,而loadMuxOut又依赖incMuxOut,但incMuxOut需要的incOut来源未正确连接,逻辑链断裂。
修复后的代码
// This file is BASED ON part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: project03starter/a/PC.hdl /** * A 16-bit counter with load and reset control bits. * if (reset[t] == 1) out[t+1] = 0 * else if (load[t] == 1) out[t+1] = in[t] * else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition) * else out[t+1] = out[t] */ CHIP PC { IN in[16],load,inc,reset; OUT out[16]; PARTS: // 寄存器保存当前值,输出到regOut和模块out Register(in=mux_reset_out, load=true, out=regOut, out=out); // 对寄存器输出值加1 Inc16(in=regOut, out=inc_out); // 选择:是保持加1后的值,还是原寄存器值 Mux16(a=regOut, b=inc_out, sel=inc, out=mux_inc_out); // 选择:是加载输入值,还是使用加1/保持的值 Mux16(a=mux_inc_out, b=in, sel=load, out=mux_load_out); // 选择:是重置为0,还是使用加载/加1/保持的值 Mux16(a=mux_load_out, b=false, sel=reset, out=mux_reset_out); }
修复说明
- 移除了未定义的
incIn,将Inc16的输入直接连接到寄存器的输出regOut,确保16位总线宽度匹配。 - 调整了Mux的连接顺序,从最底层的“保持/加1”开始,依次向上处理“加载”和“重置”逻辑,形成正确的依赖链:
- 先通过
Mux16处理inc信号,选择原寄存器值或加1后的值 - 再通过
Mux16处理load信号,选择上一步结果或输入值in - 最后通过
Mux16处理reset信号,选择上一步结果或全0值
- 先通过
- 将
b[0..15]=false简化为b=false,工具会自动将单个布尔值扩展为16位的全0信号,写法更规范。
内容的提问来源于stack exchange,提问作者Sean Pilan
相关产品推荐
相关产品推荐

