Как разработать 64 x 64-битный множитель массива в Verilog?

Я знаю , как создать множитель массива 4x4 , но если я буду следовать той же логике, кодирование становится утомительным.

  • 4 х 4 - 16 частичных произведений
  • 64 x 64 - 4096 частично продуктов.

вместе с 8 полными сумматорами и 4 половинными сумматорами, сколько полных сумматоров и половинных сумматоров мне нужно для 64 x 64 бит. Как уменьшить количество частичных продуктов? Есть ли простой способ решить эту проблему ?

1 ответов


всякий раз, когда утомительно кодирование повторяющегося шаблона вы должны использовать оператор generate вместо:

module array_multiplier(a, b, y);

parameter width = 8;
input [width-1:0] a, b;
output [width-1:0] y;

wire [width*width-1:0] partials;

genvar i;
assign partials[width-1 : 0] = a[0] ? b : 0;
generate for (i = 1; i < width; i = i+1) begin:gen
    assign partials[width*(i+1)-1 : width*i] = (a[i] ? b << i : 0) +
                                   partials[width*i-1 : width*(i-1)];
end endgenerate

assign y = partials[width*width-1 : width*(width-1)];

endmodule

Я проверил этот модуль, используя следующий тестовый стенд: http://svn.clifford.at/handicraft/2013/array_multiplier/array_multiplier_tb.v

EDIT:

как @Debian попросил конвейерную версию-вот она. На этот раз используется цикл for в области always-region для части массива.

module array_multiplier_pipeline(clk, a, b, y);

parameter width = 8;

input clk;
input [width-1:0] a, b;
output [width-1:0] y;

reg [width-1:0] a_pipeline [0:width-2];
reg [width-1:0] b_pipeline [0:width-2];
reg [width-1:0] partials [0:width-1];
integer i;

always @(posedge clk) begin
    a_pipeline[0] <= a;
    b_pipeline[0] <= b;
    for (i = 1; i < width-1; i = i+1) begin
        a_pipeline[i] <= a_pipeline[i-1];
        b_pipeline[i] <= b_pipeline[i-1];
    end

    partials[0] <= a[0] ? b : 0;
    for (i = 1; i < width; i = i+1)
        partials[i] <= (a_pipeline[i-1][i] ? b_pipeline[i-1] << i : 0) +
                partials[i-1];
end

assign y = partials[width-1];

endmodule

Примечание. что с много инструментов синтеза также возможно как раз добавить этапы регистра (ширины) после non-pipelined сумматора и позволить инструментам зарегистрировать балансируя пропуск делает pipelining.