¿Por qué una declaración de caso no paralela pero completa usa ROM, no el MUX?

0

que yo sepa, cuando los elementos en el caso no son paralelos

compondría una red de enrutamiento de prioridad, no la red de multiplexación.

En otras palabras, debe usar múltiples MUX de 2 a 1 para representar la prioridad entre los elementos del caso.

Por ejemplo, el código a continuación tiene elementos de casos no paralelos 3'b11 y 3'b1 ?? .

module non_parallel_but_full_case
(
  input wire [2:0] s,
  output reg y
);
  always @*
  //below case is not parallel but full case
    casez (s)
      3'b111: y = 1'b1;
      3'b1??: y = 1'b0;
      default: y = 1'b1;
    endcase
endmodule

Por lo tanto, he esperado que el circuito sintetizado tenga MUX, no la ROM.

Sin embargo, cuando probé el código en el vivado y su descripción RTL muestra ROM no el MUX.

¿Por qué el caso no paralelo usa la ROM en lugar de los MUX?

=============================================== ====== Pregunta añadida.

module decoder_2_4_if (
  input wire [1:0] a,
  input wire en,
  output reg [3:0] y
);

  always @*
    if (en == 1'b0)
      y = 4'b0000;
    else if (a == 2'b00)
      y = 4'b0001;
    else if (a == 2'b01)
      y = 4'b0010;
    else if (a == 2'b10)
      y = 4'b0100;
    else
      y = 4'b1000;
endmodule

El código anterior genera los múltiples MUX de 2 a 1 en cascada.

Sin embargo, la misma lógica implementada por la declaración del caso utiliza la ROM.

module decoder_2_4_case (
  input wire [1:0] a,
  input wire en,
  output reg [3:0] y
);

  always @*
  case ({en,a})
    3'b000, 3'b001, 3'b010, 3'b011: y = 4'b000;
    3'b100: y = 4'b0001;
    3'b101: y = 4'b0010;
    3'b110: y = 4'b0100;
    3'b111: y = 4'b1000;
  endcase
endmodule

En dos ejemplos, el resultado puede determinarse estáticamente, y esto significaría que la ROM podría implementar dos módulos.

Entonces, ¿por qué genera los diferentes esquemas?

    
pregunta JaeHyuk Lee

1 respuesta

1
  

¿Por qué el caso no paralelo usa la ROM en lugar de los MUX?

¡Eso es lo que hay que hacer aquí!

Alimenta valores, obtiene valores estáticos. Caso clásico para ROM, o en el caso de FPGAs, una LUT elemental.

Un mux necesitaría la misma LUT para mux las señales estáticas correctas. Por lo tanto, la solución mux para este caso estático es menos eficiente que solo la ROM.

  

En otras palabras, debe usar múltiples MUX de 2 a 1 para representar la prioridad entre los elementos del caso.

No veo una razón por la que.

En cuanto a tu edición:

Usted define implícitamente un orden de prioridad al hacer su cosa else if , por lo que aquí, el sintetizador no tiene opción.

    
respondido por el Marcus Müller

Lea otras preguntas en las etiquetas