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

构建PC CHIP遇总线宽度不匹配错误,寻求技术协助

问题排查与修复

错误提示Line 19, out(8) and out(16) have different bus widths的核心原因是存在未定义的信号incIn,工具默认将未定义信号视为8位宽度,而与之连接的16位组件(如Mux16的输入)要求16位,导致总线宽度不匹配。此外,代码的信号连接逻辑也存在顺序错误,需要调整。

具体问题点

  1. 未定义的incIn信号:Inc16(in=incIn, out=incOut);中incIn没有被任何信号赋值,工具默认其为8位,和Inc16要求的16位输入不匹配,进而引发后续连接的总线宽度错误。
  2. 信号连接逻辑顺序错误:当前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”开始,依次向上处理“加载”和“重置”逻辑,形成正确的依赖链:
    1. 先通过Mux16处理inc信号,选择原寄存器值或加1后的值
    2. 再通过Mux16处理load信号,选择上一步结果或输入值in
    3. 最后通过Mux16处理reset信号,选择上一步结果或全0值
  • 将b[0..15]=false简化为b=false,工具会自动将单个布尔值扩展为16位的全0信号,写法更规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:26