Подход к автоматизации разработки HDL проектов

Добрый день уважаемые коллеги!!

Часто начинающие плисоводы, начав изучать какой либо из HDL языков, задаются вопросом почему в них громоздко и не оптимально описываются соединения блоков между собой. Рассмотрим это на примере языка Verilog.

Действительно, при создании любого компонента, нужно объявить его интерфейс, т.е. описать его порты(имена, типы, направления). Для синтеза, только эти порты и будут видны компонентам более высокого уровня. Дальше этих интерфейсов прыгнуть нельзя. Почему так?

ИМХО потому что это и составляет объектную парадигму языков описания аппаратуры. Т.е. всё, что внутри модуля, скрыто от других компонентов, обмениваться компоненты могут только через интерфейсы/порты. Подозреваю, что концепция ООП была подсмотрена её авторами именно у HDL щиков.

Поэтому, если вам нужно получить доступ к сигналу модуля, которого нет в его интерфейсе, вам потребуется сначала добавить его в интерфейс, потом подключить в нужном вам объекте (instance) модуля. Например, если вы хотите вывести сигнал из модуля с глубиной иерархии 10, то вам потребуется тащить этот сигнал с самых низов. И ничего вы тут не сделаете, надо было думать раньше :)

Нет позвольте, скажет кто-то, но в Verilog есть иерархический доступ к сигналам любого модуля вида top.pipa.popa.signal.  Да всё правильно, но сделано это только для моделирования и средствами синтеза не поддерживается. Потому что в этом случае, сама парадигма объектного программирования теряет смысл. 

Средства HDL предлагают различные решения данной проблемы: это record в VHDL, struct/interface в SystemVerilog. Это позволяет собрать несколько сигналов в один "веник" и соединить этот "веник" только один раз. В том случае если нужно добавить сигнал, то он добавляется в определение этого "веника" и автоматический протаскивается через иерархию. У этих решений есть свои плюсы и минусы.

Что мне не нравится в решениях на структурах. Это жесткое ограничение структур. Т.е. определив один раз размеры полей структуры, нужно будет везде использовать только их (хотя в SV это не совсем так), нужно изменить размер поля, делайте новую структуру и т.д.

Что мне не нравится в решениях на интерфейсах. Интерфейс это не тип сигнала, а независимый объект, большей частью заточенный под шинные реализации, а не под соединение вида точка-точка, точка-частичная многоточка. Т.е. не расплетая "веник" интерфейса, вы можете соединить его только целиком. Если вам надо из него всего один, два сигнала то получается сильно коряво. Хотя и не является ошибкой.

Что же делать спросите вы? Мой ответ такой, развивать культуру разработки и использовать средства автоматизации. Ниже описан мой подход, основанный на личном опыте. Разработку проекта я веду по следующим шагам:

1. Написание краткого ТЗ, которое отвечает на вопрос "Что надо сделать?". Хочу отметить что вопрос стоит не "Как делать", а "Что делать". Даже если это проект для себя, я завожу небольшой файл readme.txt в котором описываю основные пункты будущего проекта.

2. Разработка функциональной схемы высокого уровня абстракции. Здесь я начинаю отвечать на вопрос "Как это делать?". Рассматриваю различные варианты, делаю прикидки, рисую схемы. Схемы я рисую от руки на бумаге, потом переношу в Visio.

3. Разработка функциональных схем среднего уровня абстракции. На этом этапе я начинаю строить каркас основных модулей из которых будет состоять проект. Я не опускаюсь на уровень отдельных регистров, проводников и т.д. Я указываю только необходимые функциональные модули (например счетчики чего-то там, фильтры, FSM и т.д.).

Хочу отметить, что на этом этапе еще не написано ни строчки иерархического кода, который пойдет в итоговый проект. Да какие то наброски существуют, но они представляют собой разрозненные модули. 

4. На этом этапе идет проработка интерфейсов модулей на функциональной схеме. Я указываю категории групп сигналов каждого функционального модуля. В это же время, с помощью разработанного скрипта veriloginit я веду генерацию шаблонов и сборку модулей верхнего уровня иерархии. На этом этапе функциональность модулей не описывается. Все модули это всего лишь шаблоны в виде декларации модуля и его инстанса. Если на этом этапе всплывает недочет в интерфейсе модуля, то он заново генерируется, а сигнал добавляется. Все делается копипастом из шаблона, на вставку модуля тратиться 10-20 секунд.

5. На этом этапе уже есть собранные файлы верхнего уровня и теперь можно вписывать их функциональность. При генерации и написании модуля, я стараюсь учитывать как можно большее количество возможных ситуаций его использования. Параметризую порты, внутренние настройки и т.д., т.е. делаю модуль универсальным, в пределах разумного естественно. 

Дальше идет моделирование и запуск на железе. Такой подход помогает мне работать достаточно быстро, комфортно и с малым количеством ошибок при сборке иерархии проекта. 

В увеличении скорости разработки и уменьшении количества ошибок, мне также помогает разработанные для себя Coding Rules & Styles и генератор конечных автоматов psm_compiler. КА на количество состояний больше 5-6 я руками не пишу, предпочитаю их генерировать из текстового описания.

В аттаче я приложил используемые мной скрипты для автоматизации разработки. Все скрипты идут в категории free for use. Для запуска скриптов необходимо иметь установленный интерпретатор языка Python не ниже версии 2.4 %)

PS. Скрипты для генерации сделаны для Verilog/SystemVerilog. Для VHDL извиняйте, это перевернутая страница в моей жизни %)

UPD1. Добавил в скрипт veriloginit знаковые типы

ПредпросмотрВложениеРазмер
psm_compiler.zip70.52 КБ
veriloginit.zip16.15 КБ

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

instance (Computer En-Ru) - экземпляр (объекта некоторого типа)

Слово "экземпляр" лучше подошло бы вместо инстанс. За остальное - спасибо! Приступаю к "штудированию", изучаю ваши примеры verilog как эталонные образцы!

"VHDL извиняйте, это

"VHDL извиняйте, это перевернутая страница в моей жизни"

 Если не сложно, какие причины убедили вас что  Verilog  позволяет вам лучше выполнять проекты. (Это не холивар просто хочется услышать мнение компетентного человека)

des00 аватар

Извините за задержку, времени

Извините за задержку, времени не было %)

На ваш вопрос сложно ответить однозначно и просто. В моей работе я прошел следующиую школу хдлщиков:
1. Рисовал схемы в MaxPlus целых два дня, пока не надоело

2. Писал на языке AHDL и моделировал все в квартусе (где-то 2 года), в это время начал изучить Verilog. Но для работы не использовал.

3. Начал вплотную заниматься разработкой на VHDL, внедрением технологий автоматического тестирования разрабатываемых компонентов(делал под Active HDL), принципами быстрого прототипирования, повышением качества кода и т.д.. За 3 года достиг в этом деле определенных успехов. Это привило мне, так называемый, академический стиль написания сорцов. Который сохраняется и сейчас.

4. Чем дальше я шел по лестнице увеличения сложности выполняемых проектов, тем больше ощущалась недостаточность VHDL для моделирования и прототипирования. Порой его маниакально параноидальная страсть к приведениям типов начинала доставать. Вставал вопрос двигаться дальше к SystemC, но тут появился SV и средсва его поддерживающие. Начал его изучать, осознал его возможности, красоту и краткость. Вкурил кучу литературы по SV (штудировал стандарт с конспектом, до сих пор где то валяется с записями). Ну и пошло поехало.


Многие пишут что отстутствие строгой типизации SV это минус, но это только по началу, когда лень следить за разрядностями сигналов. Достаточно быстро вырабатывается привычка отслеживать это и читать сообщения синтезатора, которые показывают потенциальные проблемы.


Ничего не имею против VHDL, но, в том виде, в котором его преподносят он мягко говоря устарел. Анонсированное обновление VHDL и его поддержка в EDA тоже буксует.... В общем для меня время, когда VHDL еще можно было "спасти" ушло %)

Спасибо, что откликнулись.

Спасибо, что откликнулись. Дело в том что занимаюсь этим делом примерно год и серьезных проектов не делал. И хочется как то привести в порядок процесс работы над проектом. Так что за статью спасибо.

P.S. C Наступающим Вас и желаю успехов

Ы. браво сенсей.

Признаться, до такого уровня абстракции я не дошел. Впрочем лучшую фразу по поводу абстракций сказал лучший программист, которого я знаю: "В программировании любая проблема решается повышением уровня абстракции кода. Единственная проблема, которую нельзя решить таким образом - слишком высокий уровень абстракции кода существующего".

А протаскивание веника через иерархию прекрасно делает в автоматическом режиме мой любимый Identify, из-за етого и не могу с него слезть. В папке rev_1_identify как раз лежит проект, где все сигналы, подлежащие рассмотрению в логическом анализаторе, уже введены в проект автоматически, для етого в древе проекта достаточно лишь потыкать мышкой в визуальном редакторе. Несколько раз порывался расстаться с ним и собирался использовать его лишь как управлятель вениками. Повредило то, что identify по прежнему поддерживает все кристаллы, что мне нужны, а также маленькая практика, так и сижу на нем, как нарк(

Второй аспект проблемы, видимо, состоит в том, что все психологически все пользователи ПК подразделяются на мышкателей, и клавателей - мышкатели стараются свести весь процесс разработки к мышканию, а клаватели - к клаве. Это объясняет успех и неустранимость любой из ветвей софта - как мелкомягкого, aldec и fpga advantage, так и линухов, vsim и квесты))

Причем заметьте, какие негодяи Mentor - влезли в обе ветки. Видно знают, гады, что такое инь и ян(


Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <s> <strike> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <caption> <tbody> <tr> <td> <em> <b> <u> <i> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike>
  • Использовать как разделитель страниц.

Подробнее о форматировании