Verilog 来自4位超前进位(CLA)的16位加法器-来自块的Cout生成和传播

Verilog 来自4位超前进位(CLA)的16位加法器-来自块的Cout生成和传播,verilog,xilinx-ise,carryflag,Verilog,Xilinx Ise,Carryflag,我是Verilog的新手。以下是我到目前为止所做的,4位CLA工作正常。但是,16位(使用4位CLA的实例)没有。问题显然在于设置块传播(BP)和块生成(BG)中的Cout\u itermed(中间进位)值。我创建了一个模块来处理这个问题 在Xilinx ISE中,输出波形如下所示(未显示波形): 当我运行4位CLA测试台时,波形确实显示(并且正确)。谁能解释一下问题出在进位或CLA_16bit模块的哪里?进位有两个驱动程序-第一个是进位模块的进位输出,第二个是进位模块的进位输出 这同样适用于

我是Verilog的新手。以下是我到目前为止所做的,4位CLA工作正常。但是,16位(使用4位CLA的实例)没有。问题显然在于设置块传播(
BP
)和块生成(
BG
)中的
Cout\u itermed
(中间进位)值。我创建了一个模块来处理这个问题

在Xilinx ISE中,输出波形如下所示(未显示波形):


当我运行4位CLA测试台时,波形确实显示(并且正确)。谁能解释一下问题出在
进位
CLA_16bit
模块的哪里?

进位
有两个驱动程序-第一个是
进位
模块的
进位
输出,第二个是
进位
模块的
进位
输出

这同样适用于
CLA\u 16bit
中的
Cout
(虽然两个驱动程序最终是同一个信号,
Cout\u itermed[3]
,in
CLA\u 16bit
携带

请记住,在Verilog中,您描述的是物理电路,您永远不应该将两个源(驱动程序)连接到同一根导线上-这就是短路的原因

以下是基于。 您要做的是定义从
CLA\u 16bit
s中的
Cout
端口删除
Cout\u itermed[x]
(您可以让端口挂起)。您应该将确定
Cout\u itermed[3]
(即
BG[3]|(BP[3]&Cout\u itermed[2])
)的逻辑移动到
模块

module CLA_4bit(
        output [3:0] S,
        output Cout, PG, GG,
        input [3:0] A, B,
        input Cin
        );

        wire [3:0] G,P,C;

        assign G = A & B; //Generate
        assign P = A ^ B; //Propagate

        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]);

        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 S = P ^ C;

        assign PG = P[3] & P[2] & P[1] & P[0]; // block generate
        assign GG = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]); // block propagate
endmodule

module CLA_16bit(
        output reg [15:0] S,
        output reg Cout,
        input [15:0] A, B,
        input Cin
        );

        reg [3:0] BP, BG;

        reg [3:0] Cout_itermed;

        carries my_carries(BP, GP, Cin, Cout_itermed, Cout);

        CLA_4bit cla0(S[3:0], Cout_itermed[0], BP[0], BG[0], A[3:0], B[3:0], Cin);

        CLA_4bit cla1(S[7:4], Cout_itermed[1], BP[1], BG[1], A[7:4], B[7:4], Cout_itermed[0]);

        CLA_4bit cla2(S[11:8], Cout_itermed[2], BP[2], BG[2], A[11:8], B[11:8], Cout_itermed[1]);

        CLA_4bit cla3(S[15:12], Cout_itermed[3], BP[3], BG[3], A[15:12], B[15:12], Cout_itermed[2]);

        Cout = Cout_itermed[3];
endmodule

module carries (
        input [3:0] BP,
        input [3:0] BG,
        input Cin,
        output reg [3:0] Cout_itermed,
        output reg Cout
        );

        assign Cout_itermed[0] = BG[0] |  (BP[0] & Cin);
        assign Cout_itermed[1] = BG[1] |  (BP[1] & Cout_itermed[0]);
        assign Cout_itermed[2] = BG[2] |  (BP[2] & Cout_itermed[1]);

        assign Cout = Cout_itermed[3]; 

endmodule