Carry select adder

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire [15:0] sum_1;
    wire [15:0] sum_2;
    wire [15:0] sum_3;
    wire cout_1;
    wire cout_2;
    //低16位计算
    add16 add16_inst1(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(0),
        .cout(cout_1),
        .sum(sum_1)
    );
    //高16位计算
    add16 add16_inst2(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(0),
        .cout(cout_2),
        .sum(sum_2)
    );
    add16 add16_inst3(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1),
        .cout(),
        .sum(sum_3)
    );

    //2到1多路复用器的两种写法如下,选择一种即可
    always @(*) begin 
        case(cout_1)
            1'b0:sum = {sum_2,sum_1};
            1'b1:sum = {sum_3,sum_1};
        endcase
    end

/*
    // 使用2-to-1多路复用器选择正确的结果
    assign sum = {cout_1 ? sum_3 : sum_2, sum_1};*/
endmodule