61 / 63 · Concepto
Pipeline con parada y contrapresión
Calcule ready por etapa para evitar pérdidas, duplicaciones y recálculos durante las paradas y los desplazamientos simultáneos.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Si el receptor no puede aceptar siempre
Conocimientos previos: búfer ready/validHandshake Contrato que confirma una transferencia cuando valid del emisor y ready del receptor valen 1 en el mismo flanco. Incluye las reglas para conservar los datos durante la espera. Más información de una posición y alineación de datos en pipelinesPipeline 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.
Añadir out_ready a un pipeline de velocidad fija y bloquear solo su salida no basta. Si la última etapa se llena y se detiene, tampoco deben sobrescribirse las anteriores. Es necesario diseñar la contrapresiónContrapresión Mecanismo por el que el receptor indica que temporalmente no puede aceptar datos y detiene el flujo. Durante la parada deben conservarse los datos aún no transferidos. Más información, que propaga la petición de parada hacia la entrada.
Representaremos cada una de las dos etapas mediante un dato y un bit valid. La segunda puede recibir un nuevo valor si está vacía o si puede entregar la salida actual. La misma regla se aplica a la primera.
El in_ready externo es r1. Aunque r2=0, la primera etapa puede aceptar una entrada si está vacía. Así se aprovecha el espacio disponible incluso cuando la salida está detenida.
Actualizar cada etapa solo cuando tiene permiso para avanzar
El siguiente ejemplo calcula y=2(x+1) para un x unsignedunsigned Interpretación de una secuencia de bits como entero no negativo. Con n bits, el rango es de 0 a 2^n−1; puede diferir de la interpretación signed de los mismos bits. Más información de 8 bits. La primera etapa almacena x+1 en 9 bits; la segunda desplaza un bit a la izquierda y produce 10 bits. El resultado 512 de la entrada máxima 255 queda representado exactamente.
module stallable_pipeline (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic [9:0] out_data
);
logic v1, v2, r1, r2;
logic [8:0] d1;
logic [9:0] d2;
assign r2 = !v2 || out_ready;
assign r1 = !v1 || r2;
assign in_ready = r1;
assign out_valid = v2;
assign out_data = d2;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
if (r2) begin
v2 <= v1;
if (v1) d2 <= {d1, 1'b0};
end
if (r1) begin
v1 <= in_valid;
if (in_valid) d1 <= {1'b0, in_data} + 9'd1;
end
end
end
endmoduleLas asignaciones son no bloqueantesAsignació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: la segunda etapa recibe el d1 anterior, no el calculado en ese mismo flanco. Si r1=0, se conservan v1 y d1; si r2=0, se conservan v2 y d2. Mantener solo valid mientras los datos siguen cambiando es incorrecto.
Seguir el comportamiento con ambas etapas llenas
Suponga que la segunda etapa contiene el resultado de A, la primera contiene el valor intermedio de B y C espera en la entrada.
| out_ready | in_ready | Acción en el flanco |
|---|---|---|
| 0 | 0 | Conserva A y B; no acepta C |
| 0 | 0 | Conserva A y B; no acepta C |
| 1 | 1 | Entrega A, mueve B a la segunda etapa y acepta C |
El emisor conserva C e in_valid hasta que se acepta C. Si considera que lo envió en el primer flanco de parada y presenta el siguiente dato, C se pierde.
Cada columna muestra valores justo antes del flanco de subidaFlanco 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. Al principio, A ocupa la última etapa, B la primera y C espera en la entrada. En E2 se entrega A y se acepta C; antes de E3, la salida ya contiene B.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| flanco | 2345 | E0 → E1 → E2 → E3 |
| out_ready | 0.1. | |
| out_valid | 1... | |
| out_data | 2..3 | A → B |
| in_valid | 1... | |
| in_ready | 0.1. | |
| in_data | 2..3 | C → D |
Leyes de conservación que deben verificarse
Sean Nin las entradas aceptadas y Nout las salidas entregadas desde el reset. La cantidad almacenada cumple lo siguiente. No se cuentan transferencias en el flanco de reset.
Un recuento correcto puede ocultar que A se entregó dos veces y B se perdió. Compruebe también los valores y el orden mediante una cola de referencia. Varíe independientemente valid de entrada y ready de salida e incluya paradas largas, procesamiento continuo y vaciado mediante reset.
La ruta de ready también tiene restricciones temporales
Al encadenar muchas etapas se alarga la ruta combinacional inversa, como r2→r1. Retrasar ready con un registro puede exigir espacio adicional para las entradas cuya aceptación ya se había anunciado durante ese retardo. Insertar un flip-flop en ready sin considerar el almacenamiento y el protocolo no es una optimización temporal segura.
Inténtalo tú
Se tiene v1=0, v2=1 y out_ready=0. ¿Puede aceptarse una entrada con in_valid=1? Si out_ready sigue en 0 en el ciclo siguiente, ¿pueden seguir aceptándose más entradas?
Leer la explicación
Al principio r2=0, pero r1=1, por lo que se puede aceptar un elemento y llenar la primera etapa. Después del flanco, v1=v2=1 implica r1=r2=0 y ya no pueden aceptarse más entradas. Esta distinción permite aprovechar las dos posiciones de almacenamiento.