Entrada variable MUX en Verilog

0

¿Cuál es la mejor manera de hacer un multiplexor N: 1 en Verilog (NO SystemVerilog), donde el máximo N es 64? Cada entrada tiene un ancho de 32 bits y hay N tales entradas. Verilog no permite matrices bidimensionales como argumentos de puerto, por lo que creo que la entrada debe tomarse como una matriz 'desviado' unidimensional. Aquí hay dos ideas que he tenido hasta ahora:

// Option 1
// Synthesizes to a multiplier and a BSEL block
module mux #(parameter N = 4)
  (
    output [31:0] y,
    input [N*32-1:0] x,
    input [5:0] s
  );

  assign y = (s < N) ? x[s*32 +: 32] : 0; 

endmodule

// Option 2
// Synthesizes to a pipeline of N 2-input MUXes
module mux #(parameter N = 4)
  (
    output reg [31:0] y,
    input [N*32-1:0] x,
    input [5:0] s
  );

  integer i;

  always @(s, x) begin
    y = 0;
    for (i = 0; i < N; i = i + 1)
      if (s == i)
        y = x[i*32 +: 32];
  end

endmodule

La primera opción elabora un circuito con un multiplicador (en Vivado) debido a la multiplicación en s. La segunda opción produce una canalización de muxes de entrada de N 2, lo que produciría un gran retraso de propagación para una gran N. ¿Hay una mejor manera?

    
pregunta pr871

0 respuestas

Lea otras preguntas en las etiquetas