10 / 37 · Concepto
RTL combinacional y asignaciones completas
Exprese la misma función con el operador condicional y always_comb y encuentre omisiones que infieren latches.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
La lógica combinacional depende de las entradas actuales
La forma más directa de un MUXMultiplexor Circuito combinacional que conecta una de varias entradas a la salida según una señal de selección. Debe especificarse la correspondencia entre los bits de selección y los números de entrada. Más información es assign y = sel ? b : a;. Para calcular varias salidas conjuntamente, puede utilizarse always_comb.
always_comb begin
y = a;
if (sel) y = b;
endEl valor predeterminado define también la ruta sel=0. Si solo queda if (sel) y = b;, con sel=0 debe conservarse la y anterior: ya no es una función puramente combinacional. No ignore avisos de la herramienta ni confíe únicamente en la palabra always_comb.
Asignar y=a por defecto y elegir b solo con sel=1 tiene la misma función combinacional 0/1 que el circuito siguiente. La salida también queda determinada con sel=0.
y = sel ? b : a
La sintaxis procedural no es solo orden de ejecución de software
En bloques combinacionales suelen calcularse resultados intermedios con asignaciones bloqueantes =. Si una expresión lee un resultado asignado antes en el mismo bloque, esa dependencia forma un camino combinacional. Distinga ese papel del de <=, la asignación no bloqueanteAsignación no bloqueante Asignación escrita con <= en RTL secuencial. Evalúa el lado derecho y programa la actualización, permitiendo que los registros del mismo flanco calculen a partir del estado anterior. Más información que actualiza registrosRegistro Circuito que almacena varios bits de estado. Los registros síncronos de este curso capturan la entrada especificada en el flanco de reloj. Más información secuenciales.
always_comb begin
next_y = sel ? b : a;
inverted_y = ~next_y;
endOtra regla básica es no controlar una misma salida desde varios bloques. Al dividir módulos, identifique en la interfaz quién es el único controlador de cada señal.
Iguale primero los anchos de los datos
Si selecciona entre 8 y 12 bits, explicite el ancho de y y la extensión de signo. Defina los rangos al diseñar, en lugar de confiar en descubrir por casualidad en la onda si la extensión implícita era correcta. Fuera del modelo 0/1, el operador condicional con sel=X puede diferir de un if simple; no generalice los resultados binarios del curso a todos los cuatro estados.
Inténtalo tú
Un always_comb contiene solo if(en) y=d;. ¿Cómo convertirlo en lógica combinacional que produzca 0 cuando no hay enable?
Leer la explicación
Asigne 0 a y al comienzo del bloque y sobrescriba con d si en está activo, o use una expresión de ancho explícito equivalente a assign y = en ? d : 0. Conservar el valor anterior con en=0 es otra especificación, de registro o latch, y no equivale a producir 0.