# Руководство по интеграции Icarus Verilog в VSCode

Данное руководство позволяет интегрировать бесплатный Verilog-симулятор с редактором VSCode. После выполнения всех этапов, будет возможно запускать симуляцию прямо из редактора, а затем просматривать временную диаграмму (в ограниченном режиме, об этом ниже).

Пример использования:

![../.pic/Other/VSCode%20Verilog%20Simulation/icarus_verilog_integration.png](../.pic/Other/VSCode%20Verilog%20Simulation/icarus_verilog_integration.png)

Для получения данного результата, необходимо выполнить следующие шаги:

## Установка ПО

1. Скачать и установить [Icarus Verilog](https://bleyer.org/icarus/) (при установке убедитесь, что стоят галочки `Install GTKWave (x64)`, `Add executable folder(s) to the user PATH`)
2. Скачать, установить и запустить [Visual Studio Code](https://code.visualstudio.com/Download)
3. После запуска VSCode, необходимо перейти на вкладку "Расширения" (можно открыть через `Ctrl+Shift+X`)
4. Устанавливаем следующие расширения:
   1. `Verilog-HDL/SystemVerilog/Bluespec SystemVerilog support for VS Code`
   2. `Verilog Testbench Runner`
   3. `WaveTrace`

Расширение `Bluespec SystemVerilog support for VS Code` добавляет подсветку синтаксиса языка Verilog.  
Расширение `Verilog Testbench Runner` добавляет на панель Verilog-файла кнопку `▶`, позволяющую запустить симуляцию без вызова команд `Icarus Verilog` в терминале.  
Расширение `WaveTrace` позволяет просматривать временные диаграммы прямо в VSCode.

На этом все настройки завершены.

## Изменение Verilog-файлов

Для того, чтобы при компиляции тестбенча, подхватывались файлы описанных модулей, необходимо в самый верх тестбенча дописать директиву (см. пример использования, 1):

```Verilog
`include "имя файла, содержащего тестируемый модуль"
```

А внутрь модуля `testbench` необходимо добавить блок:

```Verilog
initial begin
  $dumpfile("tb.vcd");
  $dumpvars(0, fulladder32_tb); // fulladder32_tb <- имя модуля тестбенча
end
```

(см. пример использования, 2)

---

Кроме того, необходимо убедиться, что в модуле тестбенча нет системных функций: `$stop` (проверьте через поиск, если есть — удалите). Если в процессе симуляции произойдет вызов этой системной функции, её не удастся продолжить (в отличие от Vivado).

---

После этого нажимаем на зеленую кнопку `▶` (пример использования, 3), в логе будут либо сообщения об ошибках компиляции, либо результатах симуляции (пример использования, 4).  
Если симуляция будет завершена успешно, в подпапке build появится файл с расширением `.vcd` (пример использования, 5). При открытии этого файла, появится вкладка расширения `WaveTrace` (вкладку можно расположить в соседней панели, перетянув ее).  
Чтобы увидеть временную диаграмму, необходимо добавить отображаемые сигналы (пример использования, 6). Ограничение бесплатной версии `WaveTrace` заключается в том, что можно отобразить изменения только восьми сигналов одновременно (если понадобятся еще сигналы, придется сперва удалить какие-то предыдущие).  
После всех этих действий вы сможете увидеть временную диаграмму (пример использования, 7).

## Как запустить симуляцию с предоставленными мне файлами?

Если вы пропустили, или не сделали какую-то из лаб, вам потребуется взять готовые модули из ветки [Я-не-смог](https://github.com/MPSU/APS/tree/%D0%AF-%D0%BD%D0%B5-%D1%81%D0%BC%D0%BE%D0%B3). Модули в этих ветках являются нетлистами (описанием модуля на языке Verilog, полученным [после этапа синтеза](../Introduction/Implementation%20steps.md)).  
Для того, чтобы симулятор Icarus Verilog мог работать с этим файлом, необходимо предоставить ему библиотеку примитивов из которых был собран нетлист. Для этого, необходимо выполнить следующие шаги:

1. [Скачать](../../Я-не-смог/unisims.zip) библиотеку примитивов.
2. Распаковать её в папку вашего проекта.
3. Добавить еще одну директиву `ˋinclude` в тестбенч: `ˋinclude "glbl.v"`
4. Добавить в настройки расширения `Verilog Testbench Runner` указание использовать библиотеку `unisims`. Для этого:
   1. Откройте `Файл->Настройки->Параметры` (`File->Preferences->Settings`).
   2. В поле поиска введите: `verilog.icarusCompileArguments`.
   3. В поле найденной опции введите `-y unisims/`.

### Что делать, если мне нужно отобразить больше, чем 8 сигналов?

В этом случае, необходимо воспользоваться внешней программой по отображению временных диаграмм: `GTK Wave`. Она должна была быть установлена вами на этапе установке `Icarus Verilog` (см. [Установка ПО](#Установка-ПО)).

В теории, после завершения симуляции, расширение `Verilog Testbench Runner`
должно предлагать запустить GTK Wave. Если этого не происходит, выполните команду в терминале VSCode:

```bash
gtkwave build/tb.vcd
```

где `tb.vcd` имя временной диаграммы, которое вы указали в блоке `initial` (см. [Изменение Verilog-файлов](#Изменение-verilog-файлов)).  
Откроется окно GTK Wave. Внутри этого окна, слева, есть вкладка `SST`, где будет расположен модуль вашего тестбенча. Нажав на кнопку `+` слева от имени модуля вы увидите объект `DUT` (имя сущности тестируемого модуля). Если нажать по этому объекту `ПКМ -> Recurse Import -> Append`, вы добавите все внутренние сигналы этого модуля в область просмотра временной диаграммы.
