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.