Каких особенностей 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, которые полезны для оптимизации кода и достижения более быстрого результата.

  1. перечисление SV vs параметр verilog при моделировании ФШМ.
  2. использование логики вместо reg и провода.
  3. использование always_ff,always_comb,описывать разные типы аппаратуры на месте проведения одиночный всегда блок Verilog. 4.Использование оператора unique и priority вместо Verilog полный и параллельный случай.
  4. широкий диапазон типов данных доступных в SV.

теперь то, что я обсуждал выше, - это те конструкции SystemVerilog, которые используются в RTL-дизайне

но конструкции, которые используются в проверке Окружающая среда не синтезируется.Они таковы: -

1.Динамический массив и ассоциативный массив. 2.Программный блок и блок синхронизации. 3.Почтовый ящик 4.Семафор 5.Классы и все связанные с ними функции. 6.Задачи 7.Тип данных Chandle. 8.Очереди. 9.Ограниченные случайные функции. 10.Инструкция Delay, wait и event control.