Estou um pouco confuso sobre se devo usar números inteiros em VHDL para sinais e portas de síntese, etc.
Eu uso std_logic nas portas de nível superior, mas internamente eu estava usando números inteiros variados em todo o lugar. No entanto, deparei-me com algumas referências a pessoas dizendo que você só deve usar assinados / não assinados para código direcionado à síntese.
Voltei e reformulei meu projeto atual para usar assinaturas ... e, bem, é visivelmente mais feio.
É uma prática ruim usar números inteiros? Qual é o problema? Existe alguma incerteza sobre qual largura a ferramenta mapeará números inteiros?
Respostas:
Inteiros são bons em síntese, eu os uso o tempo todo.
Isso é bom!
Estar ciente:
unsigned
signed
No lado positivo:
Quando você usa tipos de vetores, você está usando
ieee.numeric_std
, nãoieee.std_logic_arith
é?Eu uso
integer
s onde posso, mas se eu quiser explicitamente "contadores de n bits de rolagem", eu costumo usá-lounsigned
.fonte
Jan Decaluwe escreveu um white paper inteiro sobre os problemas de números inteiros versus vetores de bits. Espero que as respostas dele usem números inteiros sempre que possível . http://www.jandecaluwe.com/hdldesign/counting.html
fonte
Não há nada errado em usar números inteiros para RTL em si , mas há razões para que alguns a evitem. Esta é realmente uma pergunta sobre as "melhores práticas" subjetivas e, eventualmente, você precisará descobrir o que prefere. Como ajuda, compartilharei minha experiência e pensamentos sobre isso.
Principalmente , sou a favor do uso de números inteiros (restritos), também ao escrever para síntese. Às vezes faço isso, mas, na prática , geralmente me ater a
signed
eunsigned
. Vou elaborar o porquê.Você será forçado a usar tipos de dados vetorizados em parte do seu design de qualquer maneira:
Dificilmente qualquer IP de fornecedor ou IP de terceiros usará o
integer
tipo para portasPor exemplo, ao enviar dados através do BlockRam, mesmo que você os deduza e, portanto, nunca precise fazer interface com nenhum IP / macro / primitivo, você provavelmente precisará converter para o tipo vetorizado de qualquer maneira
Mesmo que nenhuma das opções acima se aplique, você precisará fazer a interface com outra coisa em algum momento (uma porta de nível superior, se nada mais)
Como você não pode usar
integer
o design completo, você pode ignorar tudo isso porque:Em alguns momentos, você precisará fazer as conversões de qualquer maneira, e isso tira parte do ponto de usar
integer
em primeiro lugarAlém disso, para simulação, essas conversões normalmente são chamadas com vetores de
'U'
ou'X'
, antes reset, ou em outras vezes, e cada tal chamada de função irá gerar mensagens de aviso da função pacote, bagunçando seus avisos de simulação / prompt deDesvantagens do uso
integer
:Ao contrário dos tipos vetorizados, números inteiros não têm
'U'
e'X'
; Acho isso muito útil em simulações. Você vê como os sinais não inicializados se propagam pelo design e provavelmente reagirá se vir muitos sinais não inicializados após a redefinição. Este não será o caso se estiver usando números inteiros.Com números inteiros, há um risco maior de incompatibilidade de simulação / síntese ao adicionar ou subtrair resultando em sub / transbordamento. (Como já apontado por outra pessoa.)
Casos típicos em que considero
integer
realmente uma boa opção:Para sinais / contadores de depuração que você monitora através do chipScope / signalTap etc.
Representação totalmente interna de contadores, que nunca entra ou sai do seu próprio código. Sim, existem tais casos, por exemplo, se você estiver escrevendo um FIFO e você são escritas cálculo de posição / lê para formar os sinais
full
,empty
,almostFull
etc. (no entanto aritmética sobre os ponteiros é uma maneira melhor do cálculo de posição neste caso. ..)Minhas próprias conclusões: uso números inteiros algumas vezes, mas com moderação e principalmente nos casos descritos acima. Não vejo muita sobrecarga no uso
unsigned
e, emsigned
vez de número inteiro, e, portanto, geralmente os atendo.fonte