В заметке ниже описание того, как сделать быстро вызываемую симуляцию в ModelSim из Visual Studio Code для тестбенча самописного IP.
Подготовка Visual Studio Code
Всё в целом аналогично Visual Studio Code и Icarus Verilog, только без установки Icarus Verilog, поэтому повторяться не вижу смысла.
Тестовый проект
В качестве тестового проекта будет выступать моё недоделанное IP для HyperRAM — HyperRAM_Controller. Симуляцию будем проводить на тестбенче оттуда же.
Подготовка проекта
Если у вас свой (новый) проект\IP\модуль, на котором вы хотите опробовать работу в Visual Studio Code, то опишу все дополнения вкратце на примере моего IP:
- В корне IP появилась папка .vscode (название и расположение важны!), тут хранятся все настройки и задачи для Visual Studio Code, минимальное необходимое содержание следующее:
- Файл tasks.json — описание всех задач проекта, здесь можно объявить конкретный тестбенч в параметрах, и он будет симулироваться, либо переменной ${fileBasename} можно выбирать конкретный (в данный момент активный) файл, который будет симулироваться (но это не всегда удобно, особенно если у вас 1 тестбенч, то каждый раз необходимо будет переключаться на него для проведения симуляции);
- Файл runmodelsim.cmd — скриптовый файл, в котором очищается временная папка ModelSim от прошлой симуляции, при необходимости копируются дополнительные файлы (к примеру, содержание памяти), после чего запускается компиляция и симуляция.
- Рядом с hyperram_controller_tb.v (основной тестбенч, симуляцию которого необходимо провести) создаём hyperram_controller_tb_script.tcl, в котором описываются подключаемые файлы, платформозависимые библиотеки, параметры и сигналы, которые необходимо отобразить (всё с комментариями).
Последнее, что можно сделать для упрощения жизни, — добавить хоткей для запуска симуляции, я поставил на Ctrl + Shift + X. Как назначать горячие клавиши, можно прочесть здесь, пример моего keybindings.json :
[ { "key": "ctrl+shift+x", "command": "workbench.action.tasks.runTask", "args": "Run Modelsim" }, { "key": "F6", "command": "workbench.action.tasks.runTask", "args": "Make Clean" }, { "key": "F7", "command": "workbench.action.tasks.runTask", "args": "Make Build" } ]
Симуляция
Проверяем! Запускаем Visual Studio Code, открываем корень папки-проекта:
Запускаем компиляцию и симуляцию:
Загружается ModelSim:
В консоли можно видеть ошибки компиляции, отсутствующих файлов или просто информацию об успешной компиляции, результатах симуляции и отладочных сообщениях (к примеру, тут можно видеть, как оба кристалла памяти инициализированы):
Как это выглядит в виде сигналов:
Смотрим значения памяти одного из кристаллов (тут можно увидеть, что первые 2 байта перезаписаны значениями, которые заданы в тестбенче):
Вот и всё. Да, ещё фишка — консоль в Visual Studio Code, если нажать на «урну», тем самым убив текущий терминал, то Visual Studio Code убивает и все дочерние процессы, вызванные им (быстрое закрытие ModelSim):
Ссылки
- HyperRAM_Controller — исходный проект для HyperRAM;
- Visual Studio Code — скачать редактор тут и сделать из него портативную версию;
- Visual Studio Code и Icarus Verilog — самый простой вариант проведения симуляции;
- ModelSim Intel FPGA Edition — описание ModelSim и ссылки на скачивание.