Eliminieren nicht verwendeter Bits: Erstellen synthetisierbarer mehrdimensionaler Arrays mit unterschiedlichen Dimensionen

Dies ist eine Folgefrage vonWie kann ich iterativ Busse parametrisierter Größe erstellen, um auch iterativ erstellte Module zu verbinden?. Die Antwort ist zu komplex, um sie in einem Kommentar zu beantworten, und die Lösung kann für andere SO hilfreich sein. Diese Frage folgt derSelbstantwort Format. Zusätzliche Antworten sind erwünscht.

Der folgende Code funktioniert und verwendet ein bidirektionales Array.

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

Einige der Bits werden nie verwendet, wie zPP[0][M+N-1:M+1]. Ein Synthesizer entfernt normalerweise diese Bits während der Optimierung und gibt möglicherweise eine Warnung aus. Einige Synthesizer sind nicht weit genug, um dies korrekt auszuführen. Um dies zu beheben, muss der Designer zusätzliche Logik implementieren. In diesem Beispiel würde der Parameter für alle RippleCarryAdder auf gesetztM+N. Die zusätzliche Logik verschwendet Platz und beeinträchtigt die Leistung erheblich.

Wie können die nicht verwendeten Bits sicher beseitigt werden? Können mehrdimensionale Arrays mit unterschiedlichen Dimensionen verwendet werden? Wird der Endcode lesbar und debugfähig sein?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage