1. Начальная настройка окружения
Создание прошивки для ПЛИС (FPGA) трудоемкий процесс, который может занимать несколько часов даже в средних проектах. Поэтому для тестирования кода для ПЛИС обычно применяется симуляция. В данном разделе мы научимся запускать код в симуляторе и по ходу настроим базовое окружение для написания кода.
В контексте ПЛИС, симулятор — программа, интерпретирующая код на язык описания аппаратуры (HDL) и исполняющая его как обычную программу.
SystemVerilog умеют симулировать open-source решения Verilator и Icarus Verilog, а также большинство промышленных симуляторов от таких компаний как Xilinx, Altera, Lattice.
Мы будем использовать Icarus Verilog.
В большинстве дистрибутивов Linux Icarus Verilog присутствует[1] в репозиториях. Тем не менее у проекта давно не выходили новые версии, а вот изменений накопилось достаточно (на момент июня 2024 года)[2], поэтому предлагается собрать проект самостоятельно по инструкции.
Проверим работу симулятора на классическом примере — Hello, world!. Команда курса рекомендует для написания кода использовать связку из VS Code с расширением Verilog-HDL/SystemVerilog/Bluespec SystemVerilog и линтерами Icarus Verilog и Verible. Подробнее о настройке данной связки можно прочитать в отдельной инструкции.
Создадим файл hello_world.sv
следующего содержания:
module hello_world;
initial begin
$display("Hello world!");
$finish;
end
endmodule
В примерах все исполняемые файлы будут генерироваться в директории build
[3].
Для корректной работы iverilog
её необходимо заранее создать.
$ mkdir build
Для генерации исполняемого файла выполним команду:
$ iverilog hello_world.sv -g2012 -o build/hello_world
А затем запустим с помощью:
$ build/hello_world
Вывод должен выглядеть примерно так:
Hello world!
hello_world.sv:4: $finish called at 0 (1s)
Теперь разберем подробнее команду для компиляции:
hello_world.sv
-
Имя файла, который мы собираем. В сложных проектах может быть перечисленно несколько файлов.
-g2012
-
Включает поддержку стандарта SystemVerilog 2012.
-o build/hello_world
-
Указывает путь для сохранения исполняемого файла.