31 / 37 · Conceito
Pipeline de multiplicação e soma e alinhamento de dados
Divida o cálculo por registradores e mantenha alinhados os dados, valid e os operandos auxiliares de cada transação.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
De uma expressão a dois estágios
Conhecimentos prévios: aritmética signed, atribuições não bloqueantesAtribuição não bloqueante Atribuição escrita com <= em RTL sequencial. Avalia o lado direito e agenda a atualização, permitindo que os registradores da mesma borda calculem a partir do estado anterior. Saiba mais, condições de setupSetup Tempo mínimo durante o qual a entrada deve permanecer estável antes da borda de captura. Se for violado, o valor armazenado não é garantido. Saiba mais e sinais valid.
Cada transação de entrada contém a e b signed de 8 bits e c signed de 16 bits. O resultado é o seguinte. Trata-se de uma multiplicação seguida de soma que processa cada transação separadamente, não de um acumulador.
O produto exato de dois operandos de 8 bits exige 16 bits. Se a soma com c for realizada entre valores de 16 bits e o resultado só for ampliado depois, os bits altos já perdidos não poderão ser recuperados. Primeiro estenda o sinal dos dois operandos para 17 bits e depois some.
O primeiro estágio armazena juntos o produto e c; o segundo soma os dois valores da mesma transação. Sem atrasar c, mistura-se o produto da transação anterior com o c da atual.
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 interface pode aceitar uma entrada em cada borda e supõe que o receptor sempre pode receber a saída. Não se compara y quando out_valid=0. Inicializar valid permite distinguir os dados que não devem ser usados, mesmo sem aplicar resetReset Controle que retorna o estado a um valor inicial especificado. É preciso definir se é síncrono ou assíncrono e sua prioridade em relação a outros controles. Saiba mais aos registradoresRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais de dados.
Distinguir «dois estágios» do instante de observação
A tabela registra o estado imediatamente após cada borda que aceita uma entrada. A e B são transações distintas.
| Borda | Entrada aceita | Primeiro estágio | Registrador de saída |
|---|---|---|---|
| E0 | A | Produto e c de A | Inválido |
| E1 | B | Produto e c de B | Resultado de A, válido |
| E2 | Nenhuma | Inválido | Resultado de B, válido |
| E3 | Nenhuma | Inválido | Inválido |
O resultado de A está disponível logo após E1. O circuito seguinte do mesmo clock o amostra em E2. Portanto, entre a aceitação da entrada em E0 e o recebimento da saída em E2, passam dois períodos. Ao descrever a latência, não misture o instante em que o registrador de saída muda com o instante em que o circuito seguinte recebe o valor.
Cada coluna representa uma observação de uma borda de subidaBorda de subida Instante em que o clock passa de 0 para 1. É diferente do nível alto, que abrange todo o intervalo com CLK=1. Saiba mais. As entradas são lidas antes da borda, e os estados marcados «depois», logo após a atualização. O alinhamento indica a ordem de amostragem, não os atrasos físicos de propagaçãoAtraso de propagação Tempo entre uma mudança de entrada e a estabilização da saída no valor correto. Equivalência lógica e comportamento temporal são propriedades distintas. Saiba mais. As transações são A=(2,3,10) e B=(4,5,100). O primeiro estágio mantém produto e c juntos; na borda seguinte, os valores do estágio anterior são somados. Os traços indicam intervalos inválidos.
Ver os dados da forma de onda
| Sinal | Forma de onda | Valores do barramento |
|---|---|---|
| borda | 2345 | E0 → E1 → E2 → E3 |
| entrada aceita | 234. | A → B → - |
| product1 depois | 234. | 6 → 20 → - |
| c1 depois | 234. | 10 → 100 → - |
| y depois | 2345 | - → 16 → 120 → - |
| out_valid depois | 01.0 |
Quanto a divisão em estágios acelera o circuito?
Considere um modelo simples com atraso de multiplicação de 3,2 ns, soma de 1,1 ns e sobrecarga de registradores de 0,2 ns. Esses valores são hipóteses para o cálculo.
O limite superior de frequência passa de cerca de 222 MHz para 294 MHz. Dois estágios não garantem o dobro da taxa de processamento: o período é determinado pelo estágio mais lento e pelo custo dos registradores. Os resultados reais dependem da síntese, do posicionamento e das restrições.
Verificar por transações
Ao aceitar uma entrada, insira em uma fila o resultado a×b+c de um modelo inteiro de referência. Na borda que recebe uma saída válida, retire e compare o primeiro valor esperado. Intercale períodos com in_valid=0 para conferir se as bolhas avançam junto com os dados. Um padrão que varia bastante c entre transações revela facilmente a ausência de seu atraso.
Leitura adicional: MIT OpenCourseWare — Performance Measures
Experimente
Aplique duas transações consecutivas: A=(a=3,b=−4,c=10) e B=(a=2,b=5,c=100). Calcule a sequência correta de saídas e o resultado incorreto que A pode produzir se o c atual for somado sem atraso.
Ler a explicação
Os resultados corretos são −12+10=−2 para A e 10+100=110 para B. Se o produto de A estiver no segundo estágio enquanto o c atual for o 100 de B, o resultado será 88. Atrasar valid corretamente não evita esse erro se os operandos de dados estiverem desalinhados.