Нет ничего плохого в использовании целых чисел для RTL как таковых , но есть причины, по которым некоторые избегают этого. Это действительно вопрос о субъективной «наилучшей практике», и вам в конечном итоге придется выяснить, что вы предпочитаете. В помощь этому я поделюсь своим опытом и мыслями по этому поводу.
В принципе , я за использование целых чисел (с ограничениями), в том числе и при написании для синтеза. Я иногда делаю это, но на практике , обычно я придерживаюсь signed
иunsigned
. Я уточню почему.
Вам все равно придется использовать векторизованные типы данных в части вашего проекта:
Вряд ли какой-либо вендор или сторонний IP будет использовать integer
тип для портов
Например, при отправке данных через BlockRam, даже если вы выводите их и, следовательно, никогда не должны взаимодействовать с каким-либо IP / макросом / примитивом, вам, скорее всего, все равно придется преобразовывать их в векторизованный тип.
Даже если ничего из вышеперечисленного не применимо, вам, в основном, придется взаимодействовать с чем-то другим по адресу какой - то момент (порт верхнего уровня, если ничего другого)
Так как вы не можете использовать integer
для полного дизайна, вы можете пропустить все это вместе, потому что:
В некоторых случаях вам все равно придется выполнять преобразования, и это отнимает часть смысла использования integer
в первую очередь
Кроме того, для моделирования эти преобразования обычно будут вызываться с векторами 'U'
или'X'
, либо до сброса, либо в другое время, и каждый такой вызов функции будет генерировать предупреждающие сообщения из функции пакета, загромождая предупреждения / подсказки моделирования
Недостатки использования integer
:
В отличие от векторизованных типов, целые числа не имеют 'U'
и 'X'
; Я нахожу это очень полезным в симуляции. Вы видите, как неинициализированные сигналы распространяются по проекту, и вы, вероятно, будете реагировать, если увидите много неинициализированных сигналов после сброса. Это не будет иметь место, если использовать целые числа.
С целыми числами существует больший риск несоответствия симуляции / синтеза при сложении или вычитании, что приводит к недостаточному / переполнению. (Как уже было указано кем-то еще.)
Типичные случаи, когда я нахожу integer
действительно хорошим вариантом:
Для отладочных сигналов / счетчиков, которые вы отслеживаете через chipScope / signalTap и т. Д.
Полностью внутреннее представление счетчиков, которые никогда не входят или не выходят из вашего собственного кода. Да, бывают такие случаи, например, если вы пишете FIFO, и вы считаете, что пишете / считываете без остатка, чтобы сформировать сигналы full
, empty
и almostFull
т. Д. (Однако в этом случае арифметика с указателями - лучший способ, чем счет без учета счета). ..)
Мои собственные выводы: я иногда использую целые числа, но экономно, и в основном в случаях, описанных выше. Я не вижу больших накладных расходов при использовании unsigned
и signed
вместо целого числа, и, следовательно, обычно придерживаюсь их.