¿Cuál es el código verilog eficiente en esta instrucción if?

0

Tengo el siguiente código verilog:

wire cond1;
wire cond2;

assign cond1 = a & b & c;
assign cond2 = a & b;

if (cond1)
   ...
else if (cond2)
   ...

Podemos hacer esto de otra manera:

wire cond1;
assign cond1 = a & b;

if (cond1)
  if (c)
     ...
  else
     ...

Suponiendo que la expresión de c sea lo suficientemente larga, ¿cuál es la manera eficiente desde la perspectiva del hardware ?

    
pregunta sungjun cho

1 respuesta

3

En las declaraciones Verilog if-else básicamente inferir multiplexores.

En ambos ejemplos, usted está inferiendo dos multiplexores encadenados.

La única diferencia entre los dos ejemplos de código es cómo se describen las señales de control. Sin embargo, esto puede o no hacer una diferencia en la eficiencia (ver más abajo).

ASIC

Dependiendo de las herramientas de síntesis y de si son buenas para optimizar, la primera opción puede ser menos eficiente. Si no se realizan optimizaciones, su primer código inferiría una puerta AND de 2 entradas para A & B y una puerta AND de 3 entradas para A & B & C para hacer las señales de control del Mux. Sin embargo, el segundo código inferiría solo una única puerta AND de 2 entradas para A & B , con C siendo usado directamente como una señal de control.

FPGA

Para un FPGA todo es discutible. Tus muxes y puertas se agruparán en las tablas de búsqueda de todos modos. Cualquier salida que se base en la lógica combinacional de hasta N entradas diferentes terminará en una tabla de búsqueda de bits (LUT) N , independientemente de la forma en que describa la lógica (*). Por supuesto, la LUT puede estar compuesta por varias LUT más pequeñas basadas en la estructura del FPGA.

En ambos casos, la salida dependerá exactamente del mismo número de entradas, por lo que dará como resultado una tabla de búsqueda del mismo tamaño.

(*) por ej. Si intentara describir una puerta AND de 3 entradas, y trató de describir una MUX de 2 bits, ambas se basan en 3 entradas, por lo que ambas terminarán usando exactamente los mismos recursos: una LUT de 3 entradas.

En mi humilde opinión, el segundo ejemplo es una mejor manera de escribir el código, simplemente porque es más claro para el lector. Una vez que comience a usar el comportamiento en sus descripciones, es importante que sea más fácil para un humano leer.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas