Non c'è niente di sbagliato nell'usare numeri interi per RTL in sé , ma ci sono ragioni che alcuni lo evitano. Questa è davvero una domanda sulle "migliori pratiche" soggettive e alla fine dovrai scoprire tu stesso cosa preferisci. Come aiuto a questo, condividerò la mia esperienza e pensieri su questo.
Principalmente , sono a favore dell'uso di numeri interi (vincolati), anche quando scrivo per la sintesi. A volte lo faccio, ma in pratica , di solito mi attengo a signed
e unsigned
. Elaborerò il perché.
Sarai costretto a utilizzare un tipo di dati vettoriali in parte del tuo progetto comunque:
Quasi nessun IP fornitore o IP di terze parti utilizzerà il integer
tipo per le porte
Ad esempio, quando si inviano dati tramite BlockRam, anche se lo si deduce e quindi non è mai necessario interfacciarsi con alcun IP / macro / primitiva, è molto probabile che si debba convertire comunque in tipo vettoriale
Anche se nessuna delle precedenti condizioni si applica, sarà necessario per lo più interfacciarsi con qualcos'altro ad un certo punto (una porta di livello superiore, se non altro)
Dal momento che non puoi utilizzarlo integer
per il design completo, potresti voler saltare tutto insieme, perché:
In alcuni punti, dovrai comunque fare le conversioni e questo toglie parte del punto di utilizzo integer
in primo luogo
Inoltre, per la simulazione, queste conversioni in genere essere chiamati con vettori di 'U'
o 'X'
, sia prima del reset, o in altri momenti, e ogni singolo come chiamata di funzione genera un messaggio di avviso dalla funzione pacchetto, ingombrano i vostri avvisi di simulazione / pronta
Svantaggi dell'utilizzointeger
:
Contrariamente ai tipi vettorializzati, i numeri interi non hanno 'U'
e 'X'
; Trovo che siano molto utili nelle simulazioni. Vedi come i segnali non inizializzati si propagano attraverso il design e probabilmente reagirai se vedi molti segnali non inizializzati dopo il reset. Questo non sarà il caso se si utilizzano numeri interi.
Con gli interi, esiste un rischio maggiore di errata corrispondenza di simulazione / sintesi durante l'aggiunta o la sottrazione con conseguente under / overflow. (Come già sottolineato da qualcun altro.)
Casi tipici in cui trovo integer
davvero una buona opzione:
Per segnali / contatori di debug monitorati tramite chipScope / signalTap ecc.
Rappresentazione totalmente interna di contatori, che non entrano o escono mai dal proprio codice. Sì, ci sono questi casi, ad esempio se si sta scrivendo una FIFO e si sono scrive dead-reckoning / legge per formare i segnali full
, empty
, almostFull
ecc (però aritmetica sui puntatori è un modo migliore di dead-reckoning in questo caso. ..)
Le mie conclusioni: uso numeri interi a volte, ma con parsimonia, e soprattutto nei casi sopra descritti. Non vedo molte spese generali nell'uso unsigned
e signed
invece dell'intero, e quindi, di solito, mi attengo a loro.