Каких особенностей SystemVerilog следует избегать в синтезе?
SystemVerilog представил некоторые очень полезные конструкции для улучшения стиля кодирования. Однако, как всегда говорит один из моих коллег: "вы не пишете программное обеспечение, вы описываете аппаратное обеспечение."Имея это в виду, что особенности языка следует избегать, когда конечный результат должен быть синтезирован? Это статьи показывает, какие функции в настоящее время синтезируются инструментами Synopsys, но для безопасности я думаю, что следует использовать только функции, которые синтезируются всеми крупнейший поставщик. Кроме того, какие конструкции будут давать странные результаты в netlist, которые будет трудно следовать в ECO?
in summary: мне нравится компактный и простой в обслуживании код, но не если это вызывает проблемы в задней части. Чего мне следует избегать?
Edit: в ответ на близкое голосование я хочу попытаться сделать это немного более конкретным. Этот вопрос был вдохновлен этой ответ. Я большой поклонник использования "сахара", как называет его Дэйв, чтобы уменьшить сложность кода, но не в том случае, если некоторые инструменты синтеза будут искажать имена сигналов и затруднять работу с результатом. Я ищу больше примеров, подобных этому.
2 ответов
теоретически, если вы можете написать программное обеспечение, которое синтезируется в машинный код для запуска на аппаратном обеспечении, это программное обеспечение может быть синтезировано в аппаратное обеспечение. И наоборот, в Verilog-1995 есть аппаратные конструкции, которые не считаются синтезируемыми просто потому, что ни один из крупных поставщиков никогда не удосужился его поддержать (например,assign
/deassign
). У нас все еще есть люди, использующие //synopsis translate on/off
потому что им потребовалось так много времени, чтобы поддержать `ifdef SYNOPSYS
.
большинство из того, что я считаю быть безопасное для синтеза в SystemVerilog-это то, что я называю синтаксический сахар для Verilog. Это просто более удобные способы написания одного и того же кода Verilog с гораздо меньшим набором текста. Примерами могут служить:
- типы данных: typedef, struct, enum, int, byte
- использование этих типов в качестве портов, аргументов и возвращаемых значений функций
- операторы присваивания: ++ -- +=
- тип литья и бит-потокового
- пакетов
- интерфейсы
- порт для подключения клавиш
- по умолчанию для аргументов функции/задачи/макроса и соединений портов
большинство конструкций, которые попадают в эту категорию, взяты из C и на самом деле не изменяют, как код синтезируется. Просто удобнее определять и опорные сигналы.
место, которое трудно синтезировать, - это место, где динамически выделяется место хранения. Это будут объекты класса, очереди, динамические массивы и строки. а также динамически создаваемые процессы с fork / join.
Я думаю, что некоторые люди имеют неправильное представление о SystemVerilog мышления это только для проверки, когда на самом деле первая версия стандарта была синтезируемым подмножеством, и корпорация Intel был одним из первых пользователей этого языка как языка дизайна.
SystemVerilog(SV) может использоваться как HDL(язык описания оборудования), так и HVL (язык проверки оборудования), поэтому его часто называют HDVL.
в SV есть очень хорошее количество интересных конструктивных конструкций, которые синтезируются и могут использоваться вместо конструкции Verilog, которые полезны для оптимизации кода и достижения более быстрого результата.
- перечисление SV vs параметр verilog при моделировании ФШМ.
- использование логики вместо reg и провода.
- использование always_ff,always_comb,описывать разные типы аппаратуры на месте проведения одиночный всегда блок Verilog. 4.Использование оператора unique и priority вместо Verilog полный и параллельный случай.
- широкий диапазон типов данных доступных в SV.
теперь то, что я обсуждал выше, - это те конструкции SystemVerilog, которые используются в RTL-дизайне
но конструкции, которые используются в проверке Окружающая среда не синтезируется.Они таковы: -
1.Динамический массив и ассоциативный массив. 2.Программный блок и блок синхронизации. 3.Почтовый ящик 4.Семафор 5.Классы и все связанные с ними функции. 6.Задачи 7.Тип данных Chandle. 8.Очереди. 9.Ограниченные случайные функции. 10.Инструкция Delay, wait и event control.