9 / 24 · Concepto
Almacena la transacción completa en los límites de las etapas
Divide la aritmética de suma y escalado manteniendo alineados valid, la etiqueta y las anchuras.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Un límite entre registros transporta significado además de bits
Divide f(a,b)=3(a+b) en dos etapas. La primera etapa almacena una suma de nueve bits de dos operandos sin signo de ocho bits. La segunda forma un valor escalado de once bits y almacena sus ocho bits menos significativos. El resultado ancho máximo es 1530. Reducir la suma intermedia conserva, en este caso, el valor final módulo 256 de esta expresión entera, pero perdería información necesaria para informar de desbordamientos o para comparaciones posteriores. Mantén explícita la anchura intermedia.
Cada etapa almacena valid y la etiqueta junto con los datos. Valid a cero denota una burbuja. Los bits de datos anteriores pueden permanecer en una etapa vacía, pero no deben contar como transacción. Una etiqueta requiere el mismo retardo de registros que su valor. Dos registros de datos con un solo registro de etiqueta asocian la identidad de la transacción B al resultado de la transacción A.
Este núcleo supone que no hay detenciones y que los puertos siempre están listos. Extiende s1 y dimensiona la constante antes de multiplicar. La segunda etapa lee los valores anteriores de s1 y t1; la nueva entrada no puede atravesar ambos registros en un solo flanco.
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
v1 <= in_valid;
v2 <= v1;
if (in_valid) begin
s1 <= {1'b0, a} + {1'b0, b};
t1 <= in_tag;
end
if (v1) begin
s2 <= scaled[7:0];
t2 <= t1;
end
end
endAcepta A=(1,2) en el flanco 0: después s1=3. Acepta B=(250,10) en el flanco 1: s1 pasa a valer 260 mientras s2 almacena el resultado 9 de A. A es válido después del flanco 1 y puede transferirse en el flanco 2. B produce después 780 módulo 256, es decir, 12.
Desplaza también las burbujas por los registros de validez. Conservar el antiguo v1=1 cuando falta una entrada puede duplicar una transacción. El reinicio borra el estado de validez para que los datos antiguos no se conviertan en un resultado nuevo. En cada límite, enumera todos los campos acompañantes: operación, etiqueta, excepción, dirección o marca de fin de paquete. Comprueba que estos campos sigan formando una única transacción a lo largo de toda la estructura segmentada.
Inténtalo tú
A=(1,2,tag=10) y B=(250,10,tag=11) se aceptan consecutivamente. Si se usa t2<=in_tag, ¿qué etiqueta acompaña al resultado de A? Indica la conexión correcta.
Leer la explicación
En el flanco 1, s2 calcula la transacción anterior A mientras in_tag actual vale 11, así que el resultado 9 recibe la etiqueta 11. Usa t2<=t1 para capturar la etiqueta anterior 10 de la primera etapa de A.