HDLBits

100个BCD全加器。

难点:

  1. 段选:

    不能两边都用到变量,而是应该用这样的方式:

    a[开始-:位数N]:向下选择N位
    a[开始+:位数N]:向上选择N位
    
  2. 要注意大小端关系:

    reg [31:0] big_vect;
    reg [0:31] little_vect;
    
    big_vect     [0  +:   8]  // 从0 开始,升序,位宽为8     ======》》》》》
    // big_vect  [7   :   0]
    little_vect  [0  +:   8]  // 从0 开始,升序,位宽为8     ======》》》》》
    // little_vect[0  :   7]
    big_vect     [15 -:   8]  // 从15开始,降序,位宽为8    ======》》》》》
    // big_vect  [15  :   8] 
    little_vect  [15 -:   8]  // 从15开始,降序,位宽为8    ======》》》》》
    // little_vect[8  :  15]
    
  3. 生成器 generator

    Verilog中generate的使用

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    
    reg cin2, cout2;
    reg [100:0] s;
    genvar i;
    always @ (*) s[0] = cin;
    generate
        for (i = 1; i <= 100; i++) begin: gen
            bcd_fadd bcd_inst (
                .a(a[(i * 4 - 1)-:4]),
                .b(b[(i * 4 - 1)-:4]),
                .cin(s[i-1]),
                .cout(s[i]),
                .sum(sum[(i * 4 - 1)-:4])
            );
        end
    endgenerate
    always @ (*) cout = s[100];
endmodule