Altifigence Academy

31 / 37 · Concepto

Pipeline de multiplicación y suma y alineación de datos

Divida el cálculo mediante registros y mantenga alineados los datos, valid y los operandos auxiliares de cada transacción.

De una expresión a dos etapas

Conocimientos previos: aritmética signed, asignaciones 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, condiciones de setupSetup Tiempo mínimo durante el cual la entrada debe permanecer estable antes del flanco de captura. Si se incumple, el valor almacenado no está garantizado. Más información y señales valid.

Cada transacción de entrada contiene a y b signed de 8 bits y c signed de 16 bits. El resultado es el siguiente. Se trata de una multiplicación seguida de una suma que procesa cada transacción por separado, no de un acumulador.

y=a×b+cy=a\times b+c

El producto exacto de dos operandos de 8 bits necesita 16 bits. Si la suma con c se hace entre valores de 16 bits y solo después se amplía el resultado, no pueden recuperarse los bits altos ya perdidos. Primero extienda el signo de ambos operandos a 17 bits y después súmelos.

La primera etapa almacena juntos el producto y c; la segunda suma ambos valores de la misma transacción. Si c no se retrasa, se mezcla el producto de la transacción anterior con el c de la actual.

SystemVerilog
module multiply_add_pipeline (
    input  logic               clk, rst, in_valid,
    input  logic signed [7:0]  a, b,
    input  logic signed [15:0] c,
    output logic               out_valid,
    output logic signed [16:0] y
);
    logic v1;
    logic signed [15:0] p1, c1;
    logic signed [16:0] p_ext, c_ext;
    assign p_ext = {p1[15], p1};
    assign c_ext = {c1[15], c1};

    always_ff @(posedge clk) begin
        if (rst) begin
            v1        <= 1'b0;
            out_valid <= 1'b0;
        end else begin
            v1        <= in_valid;
            out_valid <= v1;
            if (in_valid) begin
                p1 <= a * b;
                c1 <= c;
            end
            if (v1) y <= p_ext + c_ext;
        end
    end
endmodule

Esta interfaz puede aceptar una entrada en cada flanco y supone que el receptor siempre puede recibir la salida. No se compara y cuando out_valid=0. Inicializar valid permite distinguir los datos que no deben usarse, aunque no se aplique resetReset Control que devuelve el estado a un valor inicial especificado. Deben definirse su carácter síncrono o asíncrono y su prioridad frente a otros controles. Más información a los 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 de datos.

Distinguir «dos etapas» del instante de observación

La tabla registra el estado inmediatamente posterior a cada flanco que acepta una entrada. A y B son transacciones distintas.

FlancoEntrada aceptadaPrimera etapaRegistro de salida
E0AProducto y c de AInválido
E1BProducto y c de BResultado de A, válido
E2NingunaInválidaResultado de B, válido
E3NingunaInválidaInválido

El resultado de A está disponible justo después de E1. El siguiente circuito del mismo reloj lo muestrea en E2. Por tanto, entre la aceptación de entrada en E0 y la recepción de salida en E2 transcurren dos períodos. Al describir la latencia, no mezcle el instante en que cambia el registro de salida con el instante en que lo recibe el circuito siguiente.

Cada columna representa una observación de un 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. Las entradas se leen antes del flanco y los estados marcados «después», justo después de actualizarse. La alineación indica el orden de muestreo, no los retardos físicos 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. Las transacciones son A=(2,3,10) y B=(4,5,100). La primera etapa conserva el producto y c juntos; en el siguiente flanco se suman los valores de la etapa anterior. Los guiones indican intervalos inválidos.

El producto y c deben pertenecer a la misma transacción
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
entrada aceptada234.A → B → -
product1 después234.6 → 20 → -
c1 después234.10 → 100 → -
y después2345- → 16 → 120 → -
out_valid después01.0

¿Cuánto acelera la división en etapas?

Considere un modelo sencillo con 3,2 ns de retardo de multiplicación, 1,1 ns de suma y 0,2 ns de sobrecarga de registros. Son valores supuestos para el cálculo.

Tone≥3.2+1.1+0.2=4.5 nsT_{\mathrm{one}}\ge3.2+1.1+0.2=4.5\ \mathrm{ns}
Tpipe≥max⁡(3.2,1.1)+0.2=3.4 nsT_{\mathrm{pipe}}\ge\max(3.2,1.1)+0.2=3.4\ \mathrm{ns}

La cota superior de frecuencia pasa de unos 222 MHz a 294 MHz. Dos etapas no garantizan el doble de tasa de procesamiento: el período lo determinan la etapa más lenta y el coste de los registros. Los resultados reales dependen de la síntesis, la colocación y las restricciones.

Verificar por transacciones

Al aceptar una entrada, añada a una cola el resultado a×b+c de un modelo entero de referencia. En el flanco que recibe una salida válida, extraiga y compare el primer valor esperado. Intercale períodos con in_valid=0 para comprobar que las burbujas avanzan junto con los datos. Un patrón que cambia mucho c entre transacciones revela fácilmente la omisión de su retardo.

Lectura adicional: MIT OpenCourseWare — Performance Measures

Inténtalo tú

Aplique dos transacciones consecutivas: A=(a=3,b=−4,c=10) y B=(a=2,b=5,c=100). Calcule la secuencia correcta de salidas y el resultado erróneo que puede producir A si se suma el c actual sin retrasarlo.

Leer la explicación

Los resultados correctos son −12+10=−2 para A y 10+100=110 para B. Si el producto de A está en la segunda etapa mientras el c actual es el 100 de B, se obtiene 88. Retrasar correctamente valid no evita este error si los operandos de datos están desalineados.

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