# Руководство по установке и эксплуатации программного симулятора - 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
```