Altifigence Academy

9 / 24 · Conceito

Armazene a transação completa nas fronteiras do pipeline

Divida a aritmética de soma e escala mantendo valid, etiqueta e larguras alinhados.

Uma fronteira de registradores transporta significado além de bits

Divida f(a,b)=3(a+b) em dois estágios. O primeiro estágio armazena a soma de nove bits de dois operandos de oito bits sem sinal. O segundo forma um valor escalado de onze bits e armazena seus oito bits menos significativos. O resultado máximo com largura ampliada é 1530. Reduzir a largura da soma intermediária por acaso preserva o valor final módulo 256 nessa expressão inteira, mas perderia informações necessárias para indicar overflow ou para comparações posteriores. Mantenha explícita a largura intermediária.

Cada estágio armazena valid e a etiqueta junto com os dados. Valid igual a zero indica uma bolha. Bits antigos de dados podem permanecer em um estágio vazio, mas não devem ser contados como uma transação. Uma etiqueta exige o mesmo atraso em registradores que seu valor. Dois registradores de dados com apenas um registrador de etiqueta associam a identidade da transação B ao resultado da transação A.

Este núcleo pressupõe ausência de pausas e portas sempre prontas. Estenda s1 e dimensione a constante antes da multiplicação. O segundo estágio lê os valores anteriores de s1 e t1; a nova entrada não pode atravessar os dois registradores em uma única borda.

SystemVerilog
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
end

Aceite A=(1,2) na borda 0: depois dela, s1=3. Aceite B=(250,10) na borda 1: s1 torna-se 260 enquanto s2 armazena o resultado 9 de A. A é válido após a borda 1 e pode ser transferido na borda 2. B posteriormente produz 780 módulo 256, ou 12.

Propague as bolhas também pelos registradores de valid. Manter o valor anterior v1=1 na ausência de uma entrada pode duplicar uma transação. O reset limpa o estado de validade para que dados antigos não se tornem um novo resultado. Em cada fronteira, liste todos os campos acompanhantes: operação, etiqueta, exceção, endereço ou marcador de fim de pacote. Verifique se esses campos permanecem como uma única transação ao longo do pipeline.

Experimente

A=(1,2,tag=10) e B=(250,10,tag=11) são aceitos consecutivamente. Se t2<=in_tag for usado, qual etiqueta acompanhará o resultado de A? Indique a conexão correta.

Ler a explicação

Na borda 1, s2 calcula a transação anterior A enquanto o in_tag atual vale 11, portanto o resultado 9 recebe a etiqueta 11. Use t2<=t1 para capturar a etiqueta anterior 10 de A no primeiro estágio.

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