Введение

Всем здравствуйте! Недавно у меня возникла потребность в том, чтобы смоделировать в ModelSim дизайн, использующий IP-ядра Xilinx. У меня не сработала стандартная схема с компиляцией исходников в Vivado и я решил попробовать скомпилировать всё самостоятельно. В итоге у меня всё получилось! Более того, я написал Tcl-скрипт, который помогает немного упростить этот процесс. Все, у кого возникла такая же потребность — прошу к прочтению. Если вы заметили в моём подходе ошибки, то оставьте, пожалуйста, комментарий — возможно ваш подход правильнее или сильно проще. Также уточню, что я пишу всё на языке VHDL, так что примеры буду показывать для него. Verilog я не знаю, но думаю, что для него всё +- аналогично.

Что необходимо сделать?

Для того, чтобы можно было скомпилировать IP-ядро, необходимо для начала скомпилировать библиотеку Unisim. Есть два варианта сделать это — с помощью Vivado и вручную. Конечно, первый вариант проще и быстрее, но если у вас возникнут ошибки во время компиляции (а вероятность этого очень высока, учитывая то, что далеко не все у нас используют лицензионный софт...), то скорее всего вы потратите уйму времени, прежде чем поймёте, в чём вообще проблема.

Как только вы скомпилируете библиотеку Unisim, её останется только добавить в ini-файл Modelsim'а и скомпилировать сами IP-ядра. На этом этапе обычно проблем уже не возникает и всё делается очень быстро.

Пробуем скомпилировать Unisim с помощью Vivado

Открываем Vivado, идем в Tools → Compile Simulation Libraries. В открывшемся окне устанавливаем нужные нам настройки. Я всё делал так, как на скриншоте ниже. У вас может быть, допустим, не VHDL, а Verilog. Нажимаем Compile и смотрим, что получится.

Compile Simulation Libraries (Vivado)
Compile Simulation Libraries (Vivado)

Если у вас всё получилось (то есть ошибок во время компиляции не возникло), то компилировать ничего вручную не нужно, вам повезло! А вот мне не повезло, смотрим на скриншот ниже...

Результаты компиляции в консоли Tcl (Vivado)
Результаты компиляции в консоли Tcl (Vivado)

Компилируем Unisim вручную

Если у вас возникла та же проблема, что и у меня, то отчаиваться не нужно. Переходим в следующую директорию:

C:\Xilinx\Vivado\[Версия Vivado]\data\vhdl\src

Вместо части пути «Версия Vivado», собственно, будет ваша версия Vivado (в моём случае это 2016.4, например). В данной директории содержатся все нужные нам исходники. На данный момент мы хотим скомпилировать библиотеку Unisim, так что переходим в директорию unisims. Тут и будут происходить все наши действия. Для начала я опишу словами, что нужно сделать, а потом предложу простой Tcl-скрипт, который сделает это за вас (то есть проделывать шаги до скрипта нужно в только в том случае, если скрипт по какой-то причине у вас не сработал).

В директории unisims есть следующие файлы:

  • unisim_VCOMP.vhd

  • retarget_VCOMP.vhd

  • unisim_retarget_VCOMP.vhd

  • unisim_VPKG.vhd

Если вам нужна только поддержка FPGA Xilinx 7-й серии и выше — компилируем файлы unisim_VCOMP.vhd и unisim_VPKG.vhd. Файл retarget_VCOMP.vhd преобразует старые примитивы к их более новым эквивалентам. Файл unisim_retarget_VCOMP.vhd является объединением файлов unisim_VCOMP.vhd и retarget_VCOMP.vhd. Для максимальной поддержки всего и вся лично я компилирую файлы unisim_retarget_VCOMP.vhd и unisim_VPKG.vhd. Вот команды, которые нужно выполнить в Modelsim (только путь, куда всё будем компилировать, можно указать другим, конечно):

vcom -work C:/my_libs/unisim C:\Xilinx\Vivado\2016.4\data\vhdl\src\unisims\unisim_retarget_VCOMP.vhd
vcom -work C:/my_libs/unisim C:\Xilinx\Vivado\2016.4\data\vhdl\src\unisims\unisim_VPKG.vhd

Далее нам нужно скомпилировать все остальные исходники. Все они находятся в директориях primitive и retarget (исходники из retarget нужны, если вы компилируете unisim_retarget_VCOMP.vhd). То есть заходим в директорию primitive, перебираем и компилируем все файлы в библиотеку Unisim, потом заходим в директорию retartget и делаем то же самое. Компилируем всё так же с помощью команды vcom.

После того, как мы получили заветную папочку unisim, нам нужно сделать так, чтобы её увидел Modelsim. Для этого мы должны перейти в директорию, содержащую файлы Modelsim'а и найти там файл modelsim.ini. По умолчанию он недоступен для записи, так что нам нужно перейти в его свойства и убрать галочку «только для чтения». Теперь мы либо вручную прописываем пути к нашим скомпилированным библиотекам, либо делаем это с помощью команд. Чтобы сделать это вручную, открываем файл modelsim.ini в любом текстовом редакторе, ищем секцию [Library] и пишем следующее (путь, естественно, нужно заменить на путь к скомпилированной библиотеке Unisim):

unisim = C:/modeltech64_2021.3/unisim

То же самое можно сделать с помощью следующей команды в Modelsim:

vmap unisim C:/modeltech64_2021.3/unisim

Теперь можно сделать файл modelsim.ini снова недоступным для записи, чтобы избежать его случайного редактирования впоследствии. Теперь можно перейти в раздел Library Modelsim'а и проверить, появилась ли там новая библиотека. Если она есть и в ней есть какие-то компоненты, то скорее всего вы всё сделали правильно. У меня всё выглядит так, как на скриншоте ниже.

Проверка наличия библиотеки unisim в Modelsim
Проверка наличия библиотеки unisim в Modelsim

Tcl-скрипт, который делает то же самое, но автоматически (кроме того, чтобы сделать modelsim.ini доступным для записи!!!), представлен ниже.

vlib "$1/unisim"
vmap unisim "$1/unisim"
vcom -work unisim "$2/unisim_retarget_VCOMP.vhd"
vcom -work unisim "$2/unisim_VPKG.vhd"
set primitive_files [glob -directory "$2/primitive" *.vhd]
foreach item $primitive_files {
    vcom -work unisim $item
}
set retarget_files [glob -directory "$2/retarget" *.vhd]
foreach item $retarget_files {
    vcom -work unisim $item
}

Его первый аргумент — путь к тому месту, куда будет скомпилирована библиотека, а второй — путь к исходникам (у меня это C:/Xilinx/Vivado/2016.4/data/vhdl/src/unisims). Сохраняем этот код в файл (у меня это com_xilinx.tcl). Вызвать его можно прямо из Modelsim'а вот так (при этом modelsim.ini не должен быть открыть ни в какой программе, иначе скрипт его не сможет редактировать):

do C:/scripts/com_xilinx.tcl C:/modeltech64_2021.3 C:/Xilinx/Vivado/2016.4/data/vhdl/src/unisims

Компилируем IP-ядра

Вот мы и добрались до компиляции самих IP-ядер. Сделать это достаточно просто. Открываем проект Vivado, где используются нужные вам IP-ядра и переходим во вкладку «Ip Sources». Нажимаем на плюсик рядом с нужным нам IP-ядром, находим файл, оканчивающийся на sim_netlist.vhd, и копируем путь до него. На скриншоте ниже видно, где всё это находится (красными линиями я закрыл часть пути, т.к. скриншот сделан на рабочем компьютере).

Поиск пути к файлу (sim_netlist.vhd)
Поиск пути к файлу (sim_netlist.vhd)

Естественно, компилировать IP-ядро нужно в ту библиотеку, где лежит компонент, который его использует. А сам процесс ничуть не изменился, выглядит это вот так:

vcom -work C:/projects/test/ip_cores C:/projects/test/vivado/fifo_sim_netlist.vhdl

Если у вас большой проект и вы не хотите с этим заморачиваться (и при этом в самих компонентах, использующих IP-ядра, вы никак явно не указывали, в какой библиотеке должно лежать каждое IP-ядро), то можно скомпилировать все IP-ядра в одну библиотеку и на этапе запуска симуляции указать Modelsim'у, в какой библиотеке их искать. Сделать это можно следующим образом:

vsim -voptargs="+acc" -L C:/projects/test/ip_cores C:/projects/test/work.main_tb -do "run 100ns"

То есть после -L нужно просто указать библиотеку, в которую мы скомпилировали IP-ядра.

Если вы всё сделали правильно, то теперь вы можете моделировать IP-ядра Xilinx в Modelsim. Надеюсь, что статья была для вас полезной!

P.S.

Если вы хотите скомпилировать библиотеки Secureip, Unimacro или Unifast, то делается это абсолютно также. Лежат они там же, где и Unisim (Secureip лежит в директории unisims, а все остальные директории на том же уровне, что и unisims).

Комментарии (0)