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

超前进位加法器出现多驱动网线错误的技术求助

解决超前进位加法器中的“Multiple Driver Nets”错误

错误原因

你遇到的[DRC MDRV-1]错误,核心问题是**C[0]、C[1]、C[2]这几个进位信号被双重驱动**:

  • 一方面你通过assign语句用超前进位逻辑直接计算赋值
  • 另一方面又将这些信号连接到了full_adder实例的Cout输出端口

在Verilog/SystemVerilog中,wire类型信号默认只能有一个驱动源(三态驱动除外),双重驱动会导致工具报错。

修正方案

超前进位加法器的设计逻辑是:先计算每一位的传播信号P和生成信号G,再通过这两个信号直接推导出每一位的进位输入,最后计算和值。你不需要同时保留全加器的进位输出和超前进位逻辑的进位计算,二选一即可。推荐两种修正方式:

方式1:直接用超前进位逻辑计算所有结果(无需全加器)

这种方式更贴合超前进位加法器的设计本质,代码更简洁:

`timescale 1ns / 1ps

module Adder (
    input wire[3:0] A,
    input wire[3:0] B,
    input wire Cin,
    output wire[3:0] F,
    output wire Cout
    );

    wire[3:0] P, G; // Propagate and Generate signals
    wire[3:0] C;    // C[0]是第0位进位输入,C[1]-C[3]是后续位进位输入

    // 计算传播信号P和生成信号G
    assign P = A ^ B;
    assign G = A & B;

    // 超前进位逻辑计算进位
    assign C[0] = Cin;
    assign C[1] = G[0] | (P[0] & C[0]);
    assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]);
    assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]);
    // 计算最终进位输出Cout
    assign Cout = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) | (P[3] & P[2] & P[1] & P[0] & C[0]);

    // 计算每一位的和值
    assign F = P ^ C;

endmodule

方式2:保留全加器,悬空其Cout输出

如果你坚持使用已有的full_adder模块,只需将全加器的Cout端口悬空,不再连接到C信号,让C信号仅由超前进位逻辑驱动:

`timescale 1ns / 1ps

module Adder (
    input wire[3:0] A,
    input wire[3:0] B,
    input wire Cin,
    output wire[3:0] F,
    output wire Cout
    );

    wire[3:0] P, G; // Propagate and Generate signals
    wire[2:0] C;    // Carry signals

    // 计算传播信号P和生成信号G
    assign P = A ^ B;
    assign G = A & B;

    // 超前进位逻辑计算进位
    assign C[0] = G[0] | (P[0] & Cin);
    assign C[1] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & Cin);
    assign C[2] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & Cin);
    // 计算最终进位输出Cout
    assign Cout = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) | (P[3] & P[2] & P[1] & P[0] & Cin);

    // 例化全加器,悬空Cout端口
    full_adder adder0 (
        .A(A[0]),
        .B(B[0]),
        .Cin(Cin),
        .F(F[0]),
        .Cout() // 悬空,不驱动任何信号
    );

    full_adder adder1 (
        .A(A[1]),
        .B(B[1]),
        .Cin(C[0]),
        .F(F[1]),
        .Cout()
    );

    full_adder adder2 (
        .A(A[2]),
        .B(B[2]),
        .Cin(C[1]),
        .F(F[2]),
        .Cout()
    );

    full_adder adder3 (
        .A(A[3]),
        .B(B[3]),
        .Cin(C[2]),
        .F(F[3]),
        .Cout()
    );

endmodule

验证说明

两种方式都能解决双重驱动问题,方式1的综合效率更高,因为直接用组合逻辑计算结果,避免了全加器的冗余进位计算;方式2则可以复用你已有的full_adder模块,适合学习阶段验证逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:37:29