O software Quartus® II versão 6.0 e 6.0 SP1 processam incorretamente o bit selecionado de variáveis assinadas devido a um problema de software conhecido. O código Verilog envolvendo seleções de bits de variáveis assinadas deve devolver valores não assinados conforme especificado no Verilog LRM (Std 1364-2001 versão C, Sec 4.5.1).
Este problema não existe nas versões 5.1 ou anteriores. O problema é corrigido a partir do software Quartus II versão 6.1.
Como exemplo deste problema, o software Quartus II versão 6.0 processa incorretamente a seguinte amostra de código:
reg [7:0] unrounded; reg [6:0] rounded; always @ (posedge clk) begin rounded <= unrounded[7:1] unrounded[0];
O software deve zerar o sinal sem extensão[0] para garantir que o valor de um bit seja adicionado à fatia de bits de unrounded[7:1]
.
As versões do software Quartus II 6.0 e 6.0 SP1 unrounded[0]
estendem o sinal em vez de estender o sinal a zero. No exemplo, unrounded[0]
se o sinal for um valor 1, o software interpretará o 1 como o sinal do número e, portanto, o converterá em uma representação assinada de 7 bits de -1 em vez de um valor não assinado. Portanto, o software adiciona -1 a unrounded[7:1]
, em vez de adicionar 1.
Para evitar esse problema (nas versões 6.0 ou 6.0 SP1), faça um dos seguintes:
- Entre em contato com o mySupport para solicitar o patch 1.20 para o software Quartus II versão 6.0 SP1.
- Coloque parênteses em torno de uma das variáveis e force toda a expressão a avaliar como não assinado usando a função Verilog-2001:
rounded <= (unrounded[7:1]) unrounded[0]
- Pade manualmente os zeros principais da seguinte forma (ou seja, estado explicitamente que os bits principais devem ser 0):
rounded <= unrounded[7:1] {{6{1'b 0}}, unrounded[0]};