VHDL: целые числа для синтеза?


17

Я немного сбит с толку, если я должен использовать целые числа в VHDL для синтеза сигналов и портов и т. Д.

Я использую std_logic в портах верхнего уровня, но внутренне я был с помощью варьировались целые повсюду. Однако я наткнулся на несколько ссылок на людей, говорящих, что вы должны использовать только подписанный / неподписанный для кода, предназначенного для синтеза.

Я пошел и переделал свой текущий проект, чтобы использовать unsigned ... и, ну, это заметно уродливее.

Это плохая практика использовать целые числа? В чем проблема? Есть ли некоторая неопределенность, на какую ширину инструмент будет отображать целые числа?


Хороший вопрос. Мне было интересно, что сам. Я начал с использования целочисленных, положительных и других типов повсеместно, но оказалось, что правильно синтезироваться очень сложно. Я надеюсь, что кто-то может объяснить, почему все заканчивают тем, что использовали std_logic на языке с высокой степенью типизации.
Trygve Laugstøl

1
Да. Разве это не безумие? Высокая типизация в текущей практике приводит к большому количеству DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); набирать вещи ... это никого не беспокоит? :) Это, кажется, кажется ненужным багажом. (Особенно при добавлении STD_LOGIC_VECTOR () к этому) Я объявил мой тип и размер, это должно быть DATA_I <= 32010; Это должно быть неявным. Переход между подписанным / неподписанным и т. Д. Может и должен быть явным ... но прямое однозначное присваивание или операция над целыми числами должна быть неявной.
Даррон

Ответы:


15

Целые числа хороши в синтезе, я использую их все время.

Я использую std_logic на портах верхнего уровня, но внутренне я использовал целочисленные ранги повсюду

Все в порядке!

Быть в курсе:

  • Сначала вы симулируете, не так ли? - Целочисленные типы не автоматически «переворачиваются» при симуляции - ошибка выходить за пределы диапазона, указанного для них. Если вам нужно поведение при переворачивании, вы должны явно его кодировать.
  • -(231-1)+231-1-231unsignedsigned
  • Если вы не ограничиваете их, вы можете иногда получить 32-битные счетчики, где будет меньше (если синтезатор и последующие инструменты не «видят», что они могут оптимизировать биты).

С другой стороны:

  • Они намного быстрее симулируются, чем неподписанные / подписанные векторы
  • Они не автоматически переворачиваются в симуляции (да, это в обоих списках :). Это удобно - например, вы получаете раннее предупреждение о том, что ваш счетчик слишком мал.

Когда вы используете векторные типы, вы используете ieee.numeric_std, неieee.std_logic_arith так?

Я использую integers там, где могу, но если я явно хочу «пролонгировать n-битные счетчики», я склонен использовать unsigned.


Да, я использую numeric_std. Я думаю, что я в основном беспокоюсь об инструментах Xilinx ... они все еще генерируют std_logic_vector для всего, а "UNSIGNED" даже не в подсветке синтаксиса.
Даррон

1
@darron Не беспокойтесь о подсветке синтаксиса. Редактор и его подсветка синтаксиса - это совершенно другое программное обеспечение, чем инструмент синтеза. Кроме того, unsigned - это «просто» тип данных. Это часть стандартной библиотеки, а не самого языка.
Филипп

Разве не нижняя граница -2 ^ 32 + 1? Если бы это было -2 ^ 31 - 1, вам понадобился бы еще один бит, чтобы представить только одно число - очень странно.
Брегалад

@Bregalad - хороший улов - это было неправильно в течение долгого времени!
Мартин Томпсон

@MartinThompson Или, может быть, вы можете написать это как - (2 ^ 32-1), если вы предпочитаете оставить знак минус.
Bregalad


6

Нет ничего плохого в использовании целых чисел для RTL как таковых , но есть причины, по которым некоторые избегают этого. Это действительно вопрос о субъективной «наилучшей практике», и вам в конечном итоге придется выяснить, что вы предпочитаете. В помощь этому я поделюсь своим опытом и мыслями по этому поводу.

В принципе , я за использование целых чисел (с ограничениями), в том числе и при написании для синтеза. Я иногда делаю это, но на практике , обычно я придерживаюсь signedиunsigned . Я уточню почему.

Вам все равно придется использовать векторизованные типы данных в части вашего проекта:

  • Вряд ли какой-либо вендор или сторонний IP будет использовать integerтип для портов

  • Например, при отправке данных через BlockRam, даже если вы выводите их и, следовательно, никогда не должны взаимодействовать с каким-либо IP / макросом / примитивом, вам, скорее всего, все равно придется преобразовывать их в векторизованный тип.

  • Даже если ничего из вышеперечисленного не применимо, вам, в основном, придется взаимодействовать с чем-то другим по адресу какой - то момент (порт верхнего уровня, если ничего другого)

Так как вы не можете использовать integer для полного дизайна, вы можете пропустить все это вместе, потому что:

  • В некоторых случаях вам все равно придется выполнять преобразования, и это отнимает часть смысла использования integer в первую очередь

  • Кроме того, для моделирования эти преобразования обычно будут вызываться с векторами 'U'или'X' , либо до сброса, либо в другое время, и каждый такой вызов функции будет генерировать предупреждающие сообщения из функции пакета, загромождая предупреждения / подсказки моделирования

Недостатки использования integer :

  • В отличие от векторизованных типов, целые числа не имеют 'U' и 'X'; Я нахожу это очень полезным в симуляции. Вы видите, как неинициализированные сигналы распространяются по проекту, и вы, вероятно, будете реагировать, если увидите много неинициализированных сигналов после сброса. Это не будет иметь место, если использовать целые числа.

  • С целыми числами существует больший риск несоответствия симуляции / синтеза при сложении или вычитании, что приводит к недостаточному / переполнению. (Как уже было указано кем-то еще.)

Типичные случаи, когда я нахожу integerдействительно хорошим вариантом:

  • Для отладочных сигналов / счетчиков, которые вы отслеживаете через chipScope / signalTap и т. Д.

  • Полностью внутреннее представление счетчиков, которые никогда не входят или не выходят из вашего собственного кода. Да, бывают такие случаи, например, если вы пишете FIFO, и вы считаете, что пишете / считываете без остатка, чтобы сформировать сигналы full, emptyи almostFullт. Д. (Однако в этом случае арифметика с указателями - лучший способ, чем счет без учета счета). ..)

Мои собственные выводы: я иногда использую целые числа, но экономно, и в основном в случаях, описанных выше. Я не вижу больших накладных расходов при использовании unsignedи signedвместо целого числа, и, следовательно, обычно придерживаюсь их.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.