Altifigence Academy

15 / 37 · Concepto

Asignaciones no bloqueantes y actualización simultánea

Separe valores anteriores y siguientes para interpretar correctamente contadores y pipelines RTL.

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.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Desde 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.

a y b leen el mismo estado anterior
Ver los datos de la forma de onda
Datos de la forma de onda: cada carácter es un intervalo; un punto conserva el estado anterior; p representa un ciclo de reloj.
SeñalForma de ondaValores del bus
flanco234E0 → E1 → E2
d2345 → 9 → 2
a después2345 → 9 → 2
b después2340 → 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.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.