Altifigence Academy

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.

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.

r2=¬v2∨out_ready,r1=¬v1∨r2r_2=\neg v_2\lor\mathrm{out\_ready},\qquad r_1=\neg v_1\lor r_2

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.

SystemVerilog
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
endmodule

Las 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_readyin_readyAcción en el flanco
00Conserva A y B; no acepta C
00Conserva A y B; no acepta C
11Entrega 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.

Contrapresión con las dos etapas llenas
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
flanco2345E0 → E1 → E2 → E3
out_ready0.1.
out_valid1...
out_data2..3A → B
in_valid1...
in_ready0.1.
in_data2..3C → 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.

Nin−Nout=v1+v2,0≤Nin−Nout≤2N_{\mathrm{in}}-N_{\mathrm{out}}=v_1+v_2,\qquad 0\le N_{\mathrm{in}}-N_{\mathrm{out}}\le2

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.

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