从零开始写riscv cpu十之最长路径时序优化(乘法代码优化) 最长路径 BRAM 读出 → load 前递 MUX → MULHSU 乘法2 级 DSP 级联→ 32 位加/减 → 寄存器堆写回选择。方案优化乘法代码乘法器实现方案对比原始三乘法器 vs 合并单乘法器两种写法在 7 系列 FPGA 上的综合结果是确定可推的——DSP48E1 的乘法位宽是 25×18任何超过这个位宽的乘法都会被拆成DSP 级联链 部分拼接逻辑拆法由操作数位宽唯一决定。原方案三个乘法器并联wire [DW*2-1:0] mul_result op1_i * op2_i ; wire [DW*2-1:0] mulh_result op1_signed * op2_signed ; wire [DW*2-1:0] mulhsu_result $signed({{32{op1_i[31]}}, op * $signed({32b0, op2_i});综合出的结构op1_i ──┬──→ [32×32 无符号乘法] DSP0─PCOUT→DSP1 ─→ mul_result[63:0] ──┐ op2_i ──┼──→ │ ├──→ [32×32 有符号乘法] DSP2─PCOUT→DSP3 ─→ mulh_result[63:0] ──┤ op1_signed─┘ ├── 64位宽 ├──→ [64×64 有符号乘法] DSP4→DSP5(→DSP6) ─→ mulhsu_result ────┘ 3选1 MUX op2扩展─┘ ↑ │ 64位操作数级联链最长 reg_wdata_o[31:0] ←─┘会综合出三个乘法器DSP12操作数互不相同无符号/有符号/扩展后有符号综合器无法共享任何一个各自独立成链32×32 超过 25×18每个都要拆成2 片 DSP48E1 级联A 的低 17 位 × B 走第一片高位 × B 加 PCIN 走第二片64×64 那条更夸张先把 op1 符号复制 32 次、op2 补 32 个 0凑成 64 位操作数然后拆成更长的级联链部分积更多高位部分还要靠 fabric 加法拼接三个 64 位结果汇入一个64 位宽 3 选 1 MUX再进写回通路。合计约6~8 片 DSP48E1、最长 3 级级联、外加一个 64 位宽的大 MUX。新方案一个共享 33×33 乘法器wire op1_sext (func3 MULH) || (func3 MULHSU); wire op2_sext (func3 MULH); wire signed [32:0] mul_op1 {op1_sext op1_i[31], op1_i}; wire signed [32:0] mul_op2 {op2_sext op2_i[31], op2_i}; wire signed [65:0] mul_full mul_op1 * mul_op2;综合出的结构op1_i ──→ [1位扩展: op1_sext op1_i[31]] ──┐ ├──→ [33×33 有符号乘法] DSP0─PCOUT→DSP1 ─→ mul_full[65:0] op2_i ──→ [1位扩展: op2_sext op2_i[31]] ──┘ │ MUL: 取 [31:0] ─────────┤ 其余: 取 [63:32] ────────┴→ reg_wdata_o扩展逻辑从32 位拼接缩成一个 AND 门控制位 符号位几乎零成本33×33 恰好是 2 片 DSP48E1 级联的最小完整结构没有任何多余的拼接逻辑输出选择退化成取高 32 位还是低 32 位——按位切片不消耗逻辑直接并入后面已有的写回 MUX。合计2 片 DSP48E1级联深度 2无输出大 MUX。结构对比表维度原方案新方案影响DSP48E1 数量6~8 片2 片资源省 60%功耗同步下降最长级联链64×64 拆出的 3 级左右固定 2 级级联传播是 DSP 最慢的路径实测A→PCOUT4.036 ns PCIN→P1.518 ns链越短传播越少输出选择64 位宽 3 选 1 MUX按位切片0 逻辑少一级宽 MUXDSP 输出负载变轻前递总线负载op1/op2 要同时喂 3 个乘法器的 A/B 端口只喂 1 个ex_op2_fwd的扇出和布线压力直接减三分之一布线拥塞3 组 64 位总线在 DSP 阵列与 MUX 间穿行1 组布线占比下降时序报告的验证修改前关键路径恰好穿过 2 片 DSP4.036 1.518 ns 级联传播 7 级 CARRY4slack-0.252 ns修改后DSP48E1 从关键路径上整个消失新路径里一片 DSP 都没有slack0.193 ns后续优化到 0.509 ns。合并乘法器不只省了资源它把前递 → 乘法 → 加法 → 写回这条最深的路径直接缩短了 5 ns 以上瓶颈才让位给了 BPU 路径。结论原方案是三条指令养三套硬件其中一套还是 64 位宽的虚胖版新方案是用数学等价性把三种符号组合统一进一个最小位宽的乘法器——DSP 数量 ÷3级联长度最短输出免 MUX前递负载 ÷3。功能逐位等价时序和资源全面占优。