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.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
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.
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.
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
endmoduleEsta 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.
| Flanco | Entrada aceptada | Primera etapa | Registro de salida |
|---|---|---|---|
| E0 | A | Producto y c de A | Inválido |
| E1 | B | Producto y c de B | Resultado de A, válido |
| E2 | Ninguna | Inválida | Resultado de B, válido |
| E3 | Ninguna | Inválida | Invá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.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| flanco | 2345 | E0 → E1 → E2 → E3 |
| entrada aceptada | 234. | A → B → - |
| product1 después | 234. | 6 → 20 → - |
| c1 después | 234. | 10 → 100 → - |
| y después | 2345 | - → 16 → 120 → - |
| out_valid después | 01.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.
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.