Устранение неиспользуемых битов: создание синтезируемых многомерных массивов с различными измерениями

Это дополнительный вопрос отКак я могу итеративно создавать шины параметризованного размера для соединения итеративно созданных модулей?, Ответ слишком сложен, чтобы ответить в комментарии, и решение может быть полезным для других SO. Этот вопрос следует засамостоятельно ответ формат. Дополнение ответ приветствуется.

Следующий код работает и использует двунаправленный массив.

module Multiplier #(parameter M = 4, parameter N = 4)(
  input [M-1:0] A, //Input A, size M
  input [N-1:0] B, //Input B, size N
  output [M+N-1:0] P );  //Output P (product), size M+N

wire [M+N-1:0] PP [N-1:0]; // Partial Product array
assign PP[0] = { {N{1'b0}} , { A & {M{B[0]}} } }; // Pad upper bits with 0s
assign P = PP[N-1]; // Product

genvar i;
generate
for (i=1; i < N; i=i+1)
begin: addPartialProduct
    wire [M+i-1:0] gA,gB,gS;  wire Cout;
    assign gA = { A & {M{B[i]}} , {i{1'b0}} };
    assign gB = PP[i-1][M+i-1:0];
    assign PP[i] = { {(N-i){1'b0}}, Cout, gS}; // Pad upper bits with 0s
    RippleCarryAdder#(M+i) adder( .A(gA), .B(gB), .S(gS), .Cin(1'b0), .* );
end
endgenerate

endmodule

Некоторые биты никогда не используются, такие какPP[0][M+N-1:M+1], Синтезатор обычно удаляет эти биты во время оптимизации и, возможно, выдает предупреждение. Некоторые синтезаторы не достаточно продвинуты, чтобы сделать это правильно. Чтобы решить эту проблему, дизайнер должен реализовать дополнительную логику. В этом примере параметр для всех RippleCarryAdder 's будет установлен наM+N, Дополнительная логика тратит впустую область и сильно ухудшает производительность.

Как можно безопасно удалить неиспользованные биты? Можно ли использовать многомерные массивы с разными размерами? Будет ли конечный код доступен для чтения и отладки?

Ответы на вопрос(1)

Ваш ответ на вопрос