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