Устранение неиспользуемых битов: создание синтезируемых многомерных массивов с различными измерениями
Это дополнительный вопрос отКак я могу итеративно создавать шины параметризованного размера для соединения итеративно созданных модулей?, Ответ слишком сложен, чтобы ответить в комментарии, и решение может быть полезным для других 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
, Дополнительная логика тратит впустую область и сильно ухудшает производительность.
Как можно безопасно удалить неиспользованные биты? Можно ли использовать многомерные массивы с разными размерами? Будет ли конечный код доступен для чтения и отладки?