# Руководство по установке и эксплуатации программного симулятора - Verilator <div style="text-align: justify "> Verilator - это бесплатный программный инструмент с открытым исходным кодом, который преобразует Verilog/SystemVerilog в поведенческую модель с точностью до такта на C++ или SystemC. Создаваемые модели являются точными с точки зрения цикла и имеют два состояния; как следствие, такие модели обычно обеспечивают более высокую производительность, чем более широко используемые событийно-ориентированные симуляторы, которые могут моделировать поведение в пределах тактового цикла. В настоящее время Verilator используется в академических исследованиях, проектах с открытым исходным кодом и для коммерческой разработки полупроводниковых микросхем. </div> ## 1. Установка программного симулятора - Verilator 1. Установка программы Verilator для ОС Arch Linux осуществляется следующей инструкцией ```bash pamac install verilator ``` 2. После установки убедитесь в корректности, запросив текущую версию программы ``` bash verilator --version ``` 3. Удаление производится следующей инструкцией ``` bash pamac remove verilator ``` ## 2. Эксплуатация программы Verilator <div style="text-align: justify"> Verilator позволяет преобразовать Verilog модули в C++ классы, которые потом компилируются в обычную исполняемую программу. Запуск получившейся программы запускает симуляцию, что позволяет достичь очень высокой производительности. <br> Verilator может обрабатывать только синтезируемый Verilog, то есть именно тот код, из которого потом получается "прошивка" для FPGA. Поведенческие модели, такие как присвоения с задержками A = #5 ~A; работать не будут. Тестовая программа (тестбенч) для симуляции пишется на C++. </br> Заголовочные файлы, например, verilated.h по умолчанию размещаются в /usr/share/verilator/include/ Далее работа с инструментом будет рассмотрена на примере симуляции генератора LFSR. </div> 1. Создайте verilog-файл lfsr.v и сохраните его в отдельной директории ``` verilog module lfsr ( input clk, input rst_n, output reg [7:0] out_data ); wire feedback; initial begin prg_out = 8'b10000000; end assign feedback = {((out_data[7]^out_data[5])^out_data[4])^out_data[3]}; always@(posedge clk or negedge rst_n) begin if(!rst_n) out_data <= 8'h00; else out_data <= {out_data[6:0], feedback}; end endmodule ``` 2. Создайте файл тестбенча на языке C++, назвав его, например, main.cpp ``` C++ #include <stdlib.h> #include "obj_dir/Vlsrf.h" int main(int argc, char **argv) { Verilated::commandArgs(argc, argv); Vlfsr *lfsr = new Vlfsr; int num_cycles = 0; int clock = 0; int rst_n = 1; lfsr -> rst_n = rst_n; while( !Verilated::gotFinish() ) { lfsr ->clk = clock; lfsr -> eval(); clock ^= 1; num_cycles ++; if (num_cycles % 2 == 0) printf("step %d, %b\n", num_cycles/2, lfsr->out_data); if (num_cycles == 40) break; } delete lfsr; exit(EXIT_SUCCESS); } ``` <div style="text-align: justify"> Данный тестбенч устанавливает начальные значения входных сигналов (rst_n - сброс и clk - тактовая частота) и позволяет симулировать 20 раундов работы LFSR генератор. </div> 3. Сгенерируйте файл следующей инструкцией ``` bash verilator --cc counter.v --exe main.cpp ``` 4. Выполите сборку следующей командой ``` bash make -f Vlfsr.mk Vlfsr ``` 4. Запустите исполняемый файл ```bash ./obj_dir/Vlfsr ```