Eliminación de bits no utilizados: creación de matrices multidimensionales sintetizables de diferentes dimensiones

Esta es una pregunta de seguimiento de¿Cómo puedo crear iterativamente buses de tamaño parametrizado para conectar módulos también creados iterativamente?. La respuesta es demasiado compleja para responder en un comentario y la solución puede ser útil para otras SO. Esta pregunta está siguiendo elrespuesta propia formato. Se recomienda la respuesta de adición.

El siguiente código funciona y utiliza una matriz bidireccional.

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

Algunos de los bits nunca se utilizan, comoPP[0][M+N-1:M+1]. Un sintetizador usualmente eliminará estos bits durante la optimización y posiblemente dará una advertencia. Algunos sintetizadores no son lo suficientemente avanzados para hacer esto correctamente. Para resolver esto, el diseñador debe implementar lógica adicional. En este ejemplo, el parámetro para todos los RippleCarryAdder se establecería enM+N. La lógica extra desperdicia área y degrada potentemente el rendimiento.

¿Cómo se pueden eliminar con seguridad los bits no utilizados? ¿Se pueden utilizar matrices multidimensionales con diferentes dimensiones? ¿El código final será legible y depurable?

Respuestas a la pregunta(1)

Su respuesta a la pregunta