Altifigence Academy

5 / 24 · Concepto

Interpreta las transferencias entre registros en los flancos de reloj

Separa el estado anterior del siguiente y sigue cómo las habilitaciones conservan los valores almacenados.

Todos los registros leen el estado anterior

Empieza por identificar la información que debe sobrevivir entre ciclos. Un acumulador, los operandos capturados, un contador de iteraciones y la validez de salida son estado. La suma del acumulador actual y un operando es un valor combinacional. Escribir una variable no explica por sí solo el almacenamiento; especifica el evento que captura su valor.

Este acumulador suma x únicamente en los flancos ascendentes con en activado. Con en a nivel bajo, conserva su valor. Un resultado intermedio de nueve bits hace explícita la suma; seleccionar sus ocho bits menos significativos define el comportamiento módulo 256. Las asignaciones no bloqueantes en always_ff programan el estado siguiente usando los valores leídos en el flanco actual. Interpretar el bloque como asignaciones inmediatas de software lleva a una interpretación incorrecta cuando intervienen varios registros.

SystemVerilog
logic [7:0] acc;
logic [8:0] next_sum;
assign next_sum = {1'b0, acc} + {1'b0, x};
always_ff @(posedge clk) begin
  if (rst) acc <= 8'd0;
  else if (en) acc <= next_sum[7:0];
end

El reinicio es síncrono y tiene prioridad sobre la habilitación. Omitir una asignación secuencial cuando en está a nivel bajo significa que el registro conserva su valor. En cambio, omitir una asignación en una ruta combinacional puede implicar un latch no deseado. Para la lógica combinacional del estado siguiente, establece valores predeterminados y después sustitúyelos en condiciones específicas.

Flancorstenxacc anterioracc nuevo
0119Desconocido0
101707
20010077
30125071

En el flanco 2, la entrada visible 100 no se aceptó. En el flanco 3, 7+250=257 se reduce a 1. Distinguir la presentación de la aceptación sigue siendo esencial cuando en pasa a ser valid AND ready.

Para a<=x; b<=a;, a anterior=5 y x=9 producen a nuevo=9 y b=5. Si b debe recibir 9, conecta su entrada a x. Completa primero la columna del estado anterior y después calcula conjuntamente todos los valores del estado siguiente; así se detectan desfases de un ciclo entre los datos y el control.

Inténtalo tú

Inicialmente a=4 y b=0. Las entradas x son 8 y después 12, con a<=x; b<=a en cada flanco. ¿Cuánto valen a y b tras el segundo flanco?

Leer la explicación

Tras el primer flanco, a=8 y b=4. Tras el segundo, a=12 y b=8. Cada actualización de b usa el valor anterior de a, de modo que x=12 no atraviesa ambos registros en un solo flanco.

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