15 / 37 · Concepto
Asignaciones no bloqueantes y actualización simultánea
Separe valores anteriores y siguientes para interpretar correctamente contadores y pipelines RTL.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
El lado derecho se evalúa desde el estado anterior
En un bloque secuencial de reloj, <= evalúa la expresión derecha y aplica el resultado en la fase 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.. Permite actualizar varios 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 en un mismo flanco sin que el orden de líneas haga atravesar en cascada valores recién escritos.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endDesde a=b=0 y entradas 5,9,2, los pares posteriores son (5,0), (9,5), (2,9). Interpretar que la segunda línea lee la a nueva elimina indebidamente una etapa del pipelinePipeline Estructura que divide el cálculo en etapas separadas por registros para procesar varias entradas de forma solapada. Los datos, valid y controles deben mantenerse alineados entre etapas. Más información.
Cada columna registra un flanco ascendenteFlanco ascendente Instante en que el reloj pasa de 0 a 1. Se distingue del nivel alto, que abarca todo el intervalo con CLK=1. Más información. Las entradas son anteriores; los estados «después» son posteriores a la actualización. La alineación muestra el orden de las muestras, no retardo de propagaciónRetardo de propagación Tiempo desde un cambio de entrada hasta que la salida se estabiliza en el valor correcto. La equivalencia lógica y el comportamiento temporal son propiedades distintas. Más información. Desde a=b=0, a captura d mientras b captura la a anterior: sus filas quedan desplazadas una etapa.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| flanco | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a después | 234 | 5 → 9 → 2 |
| b después | 234 | 0 → 5 → 9 |
Por qué cambiar a asignaciones bloqueantes es peligroso
Con a=d; b=a; en el mismo bloque, b puede usar la a ya modificada. El orden de ejecución respecto a otros bloques secuenciales también puede crear carreras. Use como regla bloqueantes para cálculo combinacional y no bloqueantes para estado; reserve excepciones para casos cuyo significado de eventos pueda explicar.
Evite varias asignaciones al mismo registro
Si una misma ejecución procedural asigna q varias veces mediante <=, la última asignación ejecutada puede determinar el resultado. Exponga la prioridad con if / else if / else o una variable explícita de estado siguiente, en vez de ocultarla entre if independientes. Evite controlar un registro desde varios bloques.
Al revisar RTL, escriba una ecuación de estado siguiente por registro. Si aparecen dos ecuaciones o alguna condición queda indefinida, revise la prioridad de control.
Inténtalo tú
Con a=1, b=4 inicialmente y a<=b; b<=a; en el mismo bloque de reloj, ¿qué resulta tras uno y dos flancos?
Leer la explicación
Tras uno: (a,b)=(4,1); tras dos: (1,4). Ambas asignaciones leen el mismo estado anterior e intercambian valores. Con a=b; b=a;, ambas pueden terminar con la antigua b según el orden: es otra función.