Написання і запуск скрипта для симуляції verilog-коду в modelsim

Всім привіт! Сподіваюся, все добре провели свята і готові з новими силами підкорювати висоти FPGA розробки.

Сьогодні я хочу написати невеликий гайд по запуску тестбенчей на Verilog / SystemVerilog в ModelSim без використання GUI.







План буде такою:

Поїхали! Щоб почати, на руках треба мати наступне:


  • встановлений ModelSim;
  • готовий проект на Verilog / SystemVerilog;
  • готовий тестбенч на Verilog / SystemVerilog;

Як приклад будемо розглядати проект HappyNY

1. Додавання шляху до виконуваного файлу modelsim в PATH

Перевірити, чи потрібно це робити, можна легко: наберіть в командному рядку modelsim. якщо після цього запуститься ModelSim, значить, поточний пункт можна пропустити. В іншому випадку, для Windows це робиться в такий спосіб: відкривається командний рядок і пишеться команда

в якій вказано шлях до виконуваного файлу modelsim (після; вам потрібно вказати свій шлях до виконуваного файлу). Після виконання команди проведіть перевірку, вказану на початку цього пункту, якщо щось не так, то повторіть пункт.

2. Написання скрипта для запуску

Розберемо цей шматочок скрипта.

Команда transcript з прапором on - це те ж саме що echo. тобто після вказівки цієї команди всі наступні команди, зазначені в скрипті, друкуються при виконанні в командному рядку ModelSim, тобто стає видно, яка команда коли виконувалася і після якої з них виникла помилка (якщо виникла).

Команда vlib створює бібліотеку проекту з ім'ям work.

Команда vlog з прапорами - це виклик компілятора Verilog.

Прапор -sv. як ви вже здогадалися, вказує компілятору використовувати стандарт SystemVerilog. Компілюються файли все незалежно, на відміну наприклад від Quartus. тому якщо ви робите, наприклад, import якихось частин package. то потрібно робити їх в кожному файлі, де вони використовуються, або прямо всередині файлу, що містить package (Quartus, якщо не передбачити вартою включення, викине в цьому випадку помилку).

Прапор + incdir + .. / показує, де компілятор повинен шукати файли, що включаються (тобто файли, зазначені в коді з директивою `include).

Далі йде ім'я компилируемого файлу.

Команда vsim - це запуск симуляції.

Прапор -t задає точність тимчасової сітки.
Прапор -voptargs отримує аргументи для подальшого автоматичного виклику оптимізатора vopt, тобто відбудеться виклик vopt + acc. Цей прапор включає оптимізації для різних об'єктів в проекті і включає видимість цих об'єктів в симуляторі. Детальніше прочитати про нього можна тут на стор. 154.
В кінці йде ім'я top-level тестбенча, в даному прикладі воно збігається з ім'ям файлу.

І, нарешті, остання частина скрипта:

Спочатку ми додаємо потрібні нам сигнали на форму Wave Window командою add wave. Зверніть увагу, що у одного з сигналів змінений формат відображення на символьний за допомогою прапора -radix ASCII.

Далі ми встановлюємо одиниці шкали тимчасової сітки. Запускаємо симуляцію за сценарієм, написаним в тестбенче. Розтягуємо (або стискаємо) картинку в Wave Window так, щоб вона помістилася точно в розмір вікна.







3. Запуск ModelSim з виконанням скрипта

Насамперед потрібно відкрити командний рядок або термінал і перейти в директорію, де лежить ваш скрипт і файли проекту. Потім потрібно запустити виконуваний файл modelsim з ключем -do . у нашому випадку:

Більше нічого робити не потрібно. Якщо з якоїсь причини ви не змогли додати шлях до ModelSim в змінні середовища, замість modelsim можна вказати повний шлях до виконуваного файлу. Якщо і це не спрацювало, то, запустивши ModelSim вручну, можна в командному рядку ModelSim перейти в директорію проекту і запустити наш скрипт командою:

Після всіх описаних процедур ви повинні побачити ось таку картинку:

Дякую за увагу, удачі!

Добридень! Нещодавно намагався зробити щось схоже для VHDL і вперся в те, що на відміну від Verilog'a важливий порядок компіляції файлів. Серйозні IDE справляються з цим граючи, але «виколупати» від туди, як вони це роблять - не вийшло. У зв'язку з цим питання - чи немає якихось напрацювань подібного для VHDL?

Пи.Си.Еслі чесно, то вийшло дістатися до порядку файлів в компіляції через non-project mode Vivado, але це занадто вже костильного варіант. Якщо при цьому в проекті є кріптованние ядра, то наявність порядку файлів вже стає мало, а генерувати скрипти для симуляції Vivado в цьому режимі не може. Створювати кожен раз проект - то ж не дуже зручно.

З VHDL ніколи не працював, так що нічого конкретного підказати, на жаль, не зможу. Є думка спробувати запустити симуляцію вашого проекту, використовуючи NativeLink Квартус і подивитися, який скрипт він згенерувати, потім спробувати проаналізувати його) Що стосується наявності чіп-залежних IP, тут вже потрібні бібліотеки виробника, їх треба використовувати при вказівці бібліотек в ModelSim.

А ви спробуйте для початку в ModelSim створити проект, додати в нього всі необхідні файли, а потім запустіть Auto-Generating Compile Order. На основі розставленої черговості робіть базовий сценарій. Проектом можна більше не користуватися, а організовувати все на tcl, sh або що вам подобатися. Вході роботи робимо редакцію ручками це вже не так складно.

деякі IDE вміють автоматично компілювати вихідні (синтезується опис) для симуляції. HDL Designer точно вміє сам все скомпіліть для модельсіма, залишається тільки файли тестбенча скомпіліть, яких зазвичай набагато менше і не коштує великих праць їх в скрипт додати. зразок вівада теж вміє, але можу помилятися, давно з нею не працював

Схожий підхід до налагодження бачив ось тут.
- .bat створює і видаляє каталог для всього непотребу, пов'язаного з симуляцією;
- .tcl - оперує компіляцією, сигналами і налагодженням
Я у себе додаю тільки формування рядка vlog по частинах (щоб не в одну лінію).
Досить зручно, коли руками (в інтерфейсі) робити влом, а з make-файлами зв'язуватися ще не хочеться.

насправді скриптинг запуску тестбенчей набагато більш потужна штука. можна при запуску встановлювати параметри в залежності від який буде виконуватися конкретний тест (набір тестів) з усього тестового оточення шляхом зміни в верхньому рівні тестбенча значень змінних, на підставі обраного тесту можна вибирати різні времянки попередньо підготовлені (до речі, набагато зручніше тримати скрипт створення времянки в окремому файлі, особливо якщо багато сигналів виведено), можна відключати деякі елементи DUT, особливо якщо тестований модуль має безліч блоків, що може прискорити Сіму ляцию в деяких випадках значно)

1. Додамо, що можна не тільки .do, але і .tcl
2. Ви даремно затіваєте папку rtl_work. Багато розробники користуються дефолтной папкою / бібліотекою work і вони вас не відразу зрозуміють.
рядки:
vlib rtl_work
vmap work rtl_work

можна замінити на:
vlib work

3. Крім того видаляти бібліотеку не обов'язково, можна створювати нову поверх старої. Він звичайно напише попередження що бібліотека вже є, але нічого поганого не трапиться.
4. Навіщо брати імена компільованих файлів в фігурні дужки? Якщо це coding style, то ви не зможете підставити змінну в шлях файлу. Наприклад не спрацює.
5. -L потрібен при лінковке сторонніх (крім work) бібліотек. work лінкуются за замовчуванням.
6. У vlog -work work абсолютно зайве. Це робиться за замовчуванням.

Спасибі, поправлю сьогодні) спочатку я орієнтувався на скрипт, який генерує Квартус при використанні NativeLink, тому про деякі речі дізнаюся зараз вперше (пп. 4-6)