2 / 20 · Conceito
Produtos com sinal e largura do acumulador
Derive a largura do acumulador a partir da faixa dos operandos no pior caso.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Inclua a entrada mais negativa
Uma entrada de W bits em complemento de dois varia de −2^(W−1) a 2^(W−1)−1. O maior produto positivo ocorre quando ambas as entradas têm o valor mais negativo. Para W=8, (−128)×(−128)=16384, que excede 127×127=16129. Um produto completo com sinal de duas entradas de W bits é representado com segurança em 2W bits.
Para uma redução contendo K termos, este curso escolhe a regra conservadora abaixo. K deve ser positivo; a regra pressupõe larguras iguais dos operandos e nenhum viés adicional.
A regra é um limite simples e seguro, não uma afirmação de largura mínima para todo K. Com W=8 e K=4, escolha dezoito bits. Quatro produtos máximos somam 65536. Um acumulador com sinal de dezessete bits chega apenas a 65535, portanto falha exatamente nesse limite. Dezoito bits cobrem −131072 a 131071. Quando K=1, nenhum bit adicional de acumulação é acrescentado.
Preserve o sinal explicitamente
Declare sinais intermediários em vez de adivinhar o dimensionamento das expressões. AW deve ser pelo menos PW.
localparam int PW = 2*W;
localparam int AW = PW + $clog2(K);
logic signed [W-1:0] a, b;
logic signed [PW-1:0] product;
logic signed [AW-1:0] addend, acc;
assign product = $signed(a) * $signed(b);
assign addend = {{(AW-PW){product[PW-1]}}, product};Um padrão de oito bits 0xFE representa −2. Multiplicá-lo por três produz −6; ampliar esse produto exige extensão de sinal. A extensão com zeros transforma um número negativo em positivo. Documente o ponto em que um padrão de bits de uma interface sem sinal se torna um valor aritmético com sinal.
A largura depende da redução completa mantida no acumulador. Dividir K em blocos não justifica reduzir a largura de um acumulador parcial se ele puder sofrer overflow antes da combinação. Adicionar um viés ou combinar várias reduções exige uma nova análise de faixa.
Teste mínimo×mínimo, mínimo×máximo, máximo×máximo e sinais alternados. Mantenha tanto a referência com inteiros amplos quanto o resultado da largura escolhida. A acumulação exata dentro da faixa especificada e o comportamento modular ou a saturação fora dela são contratos distintos; tratar todas as diferenças como overflow genérico oculta erros reais de sinal.
Experimente
Para W=4 e K=3, encontre o AW conservador e a soma positiva máxima. Qual bit estende o produto −8×7?
Ler a explicação
PW=8 e ceil(log2 3)=2, portanto AW=10. A soma positiva máxima é 3×64=192. O produto é −56 e deve ser estendido com uns. Dez bits com sinal cobrem −512..511.