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

image

Всім привіт! Сподіваюся, все добре провели свята і готові з новими силами підкорювати висоти FPGA розробки.
Сьогодні я хочу написати невеликий гайд по запуску тестбенчей Verilog/SystemVerilog ModelSim без використання GUI.
План буде такий:
  1. Додавання шляху до ModelSim в PATH.
  2. Написання скрипта з поясненням команд.
  3. Запуск ModelSim з виконанням написаного скрипта.
Поїхали! Щоб почати, на руках потрібно мати наступне:
  • встановлений ModelSim;
  • готовий проект на Verilog/SystemVerilog;
  • готовий тестбенч на Verilog/SystemVerilog;
В якості прикладу будемо розглядати проект HappyNY
Отже, приступимо.
1. Додавання шляху до виконуваного файлу modelsim в PATH
Перевірити, чи потрібно це робити, можна легко: наберіть у командному рядку
modelsim
, якщо після цього запуститься ModelSim, значить, поточний пункт можна пропустити. В іншому випадку, для Windows це робиться наступним чином: відкривається командний рядок і пишеться команда
set PATH=%PATH%; C:\Progs\ModelSim10_5\win64

в якій вказано шлях до виконуваного файлу modelsim (після; вам потрібно вказати свій шлях до виконуваного файлу). Після виконання команди проведіть перевірку, вказану на початку цього пункту, якщо щось не так, то повторіть пункт.
2. Написання сценарію для запуску
ModelSim має командую рядок, в якій ви може набирати різноманітні команди для запуску та управління симуляцією. Досить докладний гайд по командам можна подивитися ось здесь або тут. Для скриптів ModelSim прийнятий формат файлу *.do. Створюємо файл з вказаним розширенням в будь-якому текстовому редакторі (блокнот, sublime text, vim, notepad++, АЛЕ НЕ WORD!!!), та пишемо туди наступні команди:
if {[file exists sim]} {
cd sim
if {[file exists rtl_work]} {
vdel -lib rtl_work -all
}
} else {
mkdir sim
cd sim
}
vlib rtl_work
vmap work rtl_work

Розберемо цей шматочок скрипта.
Команда
transcript
з прапором
on
— це теж саме що
echo
, тобто після вводу цієї команди всі наступні команди, вказані в скрипті, друкуються при виконанні в командному рядку ModelSim, тобто стає видно, яка команда коли виконувалася і після якої з них виникла помилка (якщо виникла).
Далі ми перевіряємо, чи не існує в директорії проекту директорія
sim
, якщо існує, заходимо в неї, перевіряємо, чи немає вже в списку бібліотеки з ім'ям
rtl_work
, і якщо є, видаляємо її цілком командою
vdel
з прапором
all
. Якщо директорія
sim
не існує, створюємо її і переходимо до неї, щоб не засмічувати директорію проекту робочими файлами симулятора.
Команда
vlib
створює бібліотеку проекту з ім'ям
rtl_work
.
Команда
vmap
встановлює відповідність між бібліотекою
rtl_work
та поточної директорією (яка доступна по команді
pwd
). Поточна директорія в даному випадку — це директорія
sim
. Змінити поточну директорію можна командою
cd
(наприклад,
cd D:/Git/FPGA/HappyNY/simulation
).
Продовжуємо:
vlog -sv -work work +incdir+../ {../happyNY.sv}
vlog -sv -work work +incdir+../ {../tb.sv}

Команда
vlog
з прапорами — це виклик компілятора Verilog.
Прапор
sv
, як ви вже здогадалися, вказує компілятору використовувати стандарт SystemVerilog. Компілюються всі файли незалежно, на відміну наприклад від Quartus, тому якщо ви робите, наприклад,
import
якихось частин
package
, то потрібно робити їх у кожному файлі, де вони використовуються, або прямо всередині файлу, що містить
package
(Quartus, якщо не передбачити вартою включення, викине в цьому випадку помилки).
Прапор
work
каже, в яку бібліотеку потрібно компілювати вказаний файл.
Прапор
+incdir+../
показує, де компілятор повинен шукати включаються файли, тобто файли, зазначені в коді з директивою
`include
).
У фігурних дужках йде ім'я компилируемого файлу.
Продовжуємо:
vsim -t 1ns -L rtl_work -L work -voptargs="+acc" tb

Команда
vsim
— це запуск симуляції.
Прапор
t
задає точність тимчасової сітки.
Прапор
L
вказує, з якої бібліотеки потрібно працювати.
Прапор -voptargs отримує аргументи для подальшого автоматичного виклику оптимізатора vopt, тобто відбудеться виклик vopt +acc. Цей прапор включає оптимізації для різних об'єктів в проекті і включає видимість цих об'єктів в симуляторі. Детальніше прочитати про нього можна тут на стор 154.
Наприкінці йде ім'я top-level тестбенча, в даному прикладі він збігається з ім'ям файлу.
І, нарешті, остання частина скрипта:
add wave /tb/clk
add wave /tb/rst
add wave -radix ASCII /tb/symbol
configure wave -timelineunits us
run -all
wave zoom full

Спочатку ми додаємо потрібні нам сигнали на форму Wave Window командою
add wave
. Зверніть увагу, що у одного з сигналів змінено формат відображення на символьний з допомогою прапора
radix ASCII
.
Далі ми встановлюємо одиниці шкали тимчасової сітки. Запускаємо симуляцію за сценарієм, написаним в тестбенче. Розтягуємо (або стискаємо) картинку в Wave Window так, щоб вона помістилася точно в розмір вікна.
3. Запуск ModelSim з виконанням скрипта
Першим ділом потрібно відкрити командний рядок або термінал і перейти в директорію, де лежить ваш скрипт і файли проекту. Потім потрібно запустити виконуваний файл modelsim з ключем
do <script_name>
, в нашому випадку:
modelsim -do happyNY.do

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

Після всіх описаних процедур ви повинні побачити ось таку картинку:
image
Спасибі за увагу, удачі!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.