Altifigence Academy

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.

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.

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

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.

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 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.

BordaEntrada aceitaPrimeiro estágioRegistrador de saída
E0AProduto e c de AInválido
E1BProduto e c de BResultado de A, válido
E2NenhumaInválidoResultado de B, válido
E3NenhumaInválidoInvá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.

O produto e c devem pertencer à mesma transação
Ver os dados da forma de onda
Dados da forma de onda: cada caractere é um intervalo; um ponto mantém o estado anterior; p representa um ciclo de clock.
SinalForma de ondaValores do barramento
borda2345E0 → E1 → E2 → E3
entrada aceita234.A → B → -
product1 depois234.6 → 20 → -
c1 depois234.10 → 100 → -
y depois2345- → 16 → 120 → -
out_valid depois01.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.

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}

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.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.