Когда-то давно я написал статью "Интерфейс Verilog VPI".
В ней рассказывалось, как во время симуляции проекта Verilog вызывать функции пользовательской библиотеки, написанной на языке C. В статье использовался симулятор Icarus Verilog под Ubuntu Linux.
Связка языка Verilog и языка C хоть и получается немного мудреная, но дает дополнительные возможности для симуляции. Получается можно определить свою системную функцию Verilog и делать в ней что хочешь: хоть читать файлы с произвольным доступом, хоть получать изображения из камеры и передавать их верилогу, хоть обращаться к какой-то плате для получения реальных данных, передаваемых симулятору.
Недавно мне самому потребовалось сделать доступ к двоичному файлу очень большого размера из тестбенча Verilog и я, чтобы сделать это, перечитывал свою же статью и брал ее за основу своей новой программы-библиотеки.
В этой статье я покажу:
- как скомпилировать библиотеку C/С++ с использованием Verilog Procedural Interface (VPI) под Windows;
- как использовать библиотеку с Icarus Verilog под Windows;
- как использовать библиотеку с ModelSim под Windows.
Никакой воды лить не буду.
Предположим есть текст программы, написанной на C с использованием интерфейса Verilog PLI/VPI - вот прямо беру пример mypli.c из моей старой статьи.
Чтобы скомпилировать библиотеку для использования совместно с Icarus Verilog под Windows придется установить компилятор MINGW64. Тут важно, чтобы и Icarus и компилятор MINGW были одной разрядности - следите за этим. У меня Icarus 64x разрядный, поэтому нужно компилировать библиотеку под 64х разрядную ОС.
1) запускаю командную строку CMD.EXE;
2) нужно, чтобы компилятор находился в пути поиска, возможно нужно поставить переменную окружения (у вас путь может быть другим)
set PATH=d:\Programs\mingw-w64\\mingw64\bin;%PATH%
3) нужно, определить переменную указывающую на папку с икарусом (у вас путь может быть другим)
set IVERILOG=d:\programs\iverilog
4) компилирую и линкую исходник с помощью компилятора gcc из пакета MINGW64 (получится библиотека mypli.vpi)
gcc -c -fpic -I%IVERILOG%/include/iverilog/ mypli.c
gcc -shared -o mypli.vpi mypli.o -L%IVERILOG%/lib -lvpi
Обратите внимание, что компилятору нужно указать путь к файлу vpi_user.h через опцию компилятора -I%IVERILOG%/include/iverilog/
Кроме того, при линковке нужна библиотека libvpi, поэтому ее имя и путь к ней указываются во время линковки через опции -L%IVERILOG%/lib -lvpi
д) запуск симулятора icarus verilog нужно делать так:
iverilog -o qqq testbench.v
vvp -M. -mmypli qqq
При использовании симулятора ModelSim-Intel под виндовс так же нужно скомпилировать Сишную библиотеку, но в результате компиляции должна получиться DLL. Моделсим использует кастомные, пользовательские библиотеки именно как DLL.
Есть два способа скомпилировать библиотеку.
Способ первый - используем компилятор Visual Studio.
1) Запустим "VS2013 x86 Native Tools Command Prompt" из комплекта Visual Studio Tools. Это командная строка с установленными переменными окружения, чтобы компилятор сразу мог быть запущен и находился в пути.
2) Запускаем компилятор и линковщик:
cl -c -ID:\\altera\\18.0\\modelsim_ase\\include mypli.c
link -dll -export:vlog_startup_routines mypli.obj D:\\altera\\18.0\\modelsim_ase\\win32aloem\\mtipli.lib /out:mypli.dll
Обращаю ваше внимание, что Modelsim-Intel-Starter, тот который идет в комплекте с Intel Quartus Prime Lite Edition является 32х разрядным симулятором. Значит компилировать нужно Сишную библиотеку в 32х битную DLL.
В результате компиляции и линковки получается mypli.dll. Она будет использоваться симулятором.
Способ второй - использовать компилятор, который идет в комплекте с Modelsim.
У меня установлен Quartus версии 18.0. Я вижу компилятор установлен вот здесь: D:\altera\18.0\modelsim_ase\gcc-4.2.1-mingw32vc12
Запуск компилятора и линковщика из командной строки:
D:\altera\18.0\modelsim_ase\gcc-4.2.1-mingw32vc12\bin\gcc -c -ID:\altera\18.0\modelsim_ase\include mypli.c
D:\altera\18.0\modelsim_ase\gcc-4.2.1-mingw32vc9\bin\gcc -shared -o mypli.dll mypli.o -LD:\altera\18.0\modelsim_ase\win32aloem\ -lmtipli
В результате компиляции получается библиотека mypli.dll.
Теперь, когда библиотека с нашей новой системной функцией Verilog собрана, можно запустить Modelsim.
Сперва я сделаю текстовый файл test.do, который описывает все команды для симулятора:
vlib work1
vlog -work work1 testbench.v
vlog -work work1 my_module1.v
vlog -work work1 my_module2.v
vsim -c -pli mypli.dll work1.testbetch
run -all
Потом запущу симулятор из командной строки:
vsim -c -do test.do
Все должно работать.
Возможно это описание несколько сумбурно, но я пишу в пурвую очередь для себя, чтобы через некоторое время, когда понадобится, я смог бы воспроизвести уже сделанное.
Подробнее...