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
e unsigned
. 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 portas
Por 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 lugar
Alé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 de
Desvantagens 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, em signed
vez de número inteiro, e, portanto, geralmente os atendo.