МАРСОХОД

Open Source Hardware Project

Симуляция проекта с помощью Icarus-Verilog

После некоторых раздумий я решил написать статью о симуляции Verilog проектов с помощью пакета программ icarus-verilog. Мне кажется, что это лучший способ «быстро попробовать» возможности симуляции. Конечно, среда симуляции ModelSim компании Mentor Graphics (или ModelSim-Altera Edition) - это мощное средство, но освоить ее несколько труднее.

Сейчас мы быстренько скачаем из интернета icarus-verilog, установим его и попробуем что нибудь просимулировать...


Первое, что нужно сделать – это посетить сайт http://www.icarus.com/eda/verilog/ - отправная точка для изучения Icarus Verilog. Это свободный проект, то есть при желании можно даже посмотреть исходные тексты всех программ, и компилятора и симулятора Verilog. Здесь есть ссылки на документацию и откуда скачивать файлы для установки. Конечно, есть пакеты программ и для Linux и для Windows.

Оттуда я перехожу по ссылке Pablo Bleyer Kocik's Icarus Verilog Windows packages (off-site), которая ведет меня на станицу скачивания программы для операционной системы Windows.  Вы будете приятно удивлены – размер файла для скачивания составляет около 6 мегабайт! Для ModelSim, например, размер будет более 500Мб!

Выкачиваем и устанавливаем!
По умолчанию программа устанавливается в папку c:\iverilog и установщик сам прописывает пути к исполняемым файлам.

папка с установленым icarus-verilog

В этой же папке есть несколько коротких но понятных инструкций, как пользоваться компилятором и симулятором (правда на английском языке).

Теперь напишем 2 модуля на языке Verilog:

  1. Модуль 8-ми битный счетчик с возможностью загрузки.
  2. Тестбенч – модуль для тестирования первого модуля счетчика.

Для чего применяется такая методика из раздельных модулей – тестируемого и тестирующего? Первый модуль – это тот, который мы в будущем хотим компилировать для чипа. Для него важно быть простым и компактным. А второй модуль, тестирующий (их называют testbench) моделирует внешние сигналы, которые подаются на тестируемый модуль и проверяет выходные сигналы из него.

Тут надо заметить, что написание тестбенчей – это в каком-то смысле искуство. Получается мы пишем программу, модуль. Для тестирования этой программы мы пишем вторую программу – модуль тестбенч. Мы можем ошибиться как в первой программе, так и во второй или в обеих сразу! Ведь в любой программе возможны баги. Разработчик может думать, что он все сделал правильно и просимулировал и увидел результат какой хотел, но на самом деле проект может остаться неработоспособным Wink Но не нужно пугаться. Будем двигаться дальше.

Итак, вот мой счетчик, тестируемый модуль:


module counter (
    input wire reset,
    input wire clk,
    input wire [7:0]wdata,
    input wire wr,
    output reg [7:0]data
);
always @ (posedge clk or posedge reset)
    if (reset)
       data <= 8'h00;
    else
    if(wr)
    begin
       data <= wdata;
       $display("written %h",wdata);
    end
   else

      data <= data + 8'h01;
endmodule


А вот тестбенч, тестирующий модуль. Чтобы он был более понятным пожалуйста прочитайте предыдущую статью про System Tasks.


module test_counter;

reg reset, clk, wr;
reg [7:0]wdata;
wire [7:0] data_cnt;

//устанавливаем экземпляр тестируемого модуля
counter counter_inst(reset, clk, wdata, wr, data_cnt);

//моделируем сигнал тактовой частоты
always
  #10 clk = ~clk;

//от начала времени...

initial
begin
 
clk = 0;
  reset = 0;
  wdata = 8'h00;
  wr = 1'b0;

//через временной интервал "50" подаем сигнал сброса
  #50 reset = 1;

//еще через время "4" снимаем сигнал сброса

  #4 reset = 0;

//пауза длительностью "50"
  #50;

//ждем фронта тактовой частоты и сразу после нее подаем сигнал записи
  @(posedge clk)

  #0
    begin
      wdata = 8'h55;
      wr = 1'b1;
    end

//по следующему фронту снимаем сигнал записи
  @(posedge clk)
  #0
    begin
      wdata = 8'h00;
      wr = 1'b0;
    end
end

//заканчиваем симуляцию в момент времени "400"
initial
begin

  #400 $finish;
end

//создаем файл VCD для последующего анализа сигналов
initial
begin

  $dumpfile("out.vcd");
  $dumpvars(0,test_counter);
end

//наблюдаем на некоторыми сигналами системы
initial

$monitor($stime,, reset,, clk,,, wdata,, wr,, data_cnt);

endmodule


Icarus-verilog может скомпилировать их в свой «исполняемый» формат. Для этого в командной строке набираем команду:

>iverilog -o qqq counter.v tcounter.v

Iverilog – это компилятор, который транслирует исходный код Verilog в файл специального формата для симуляции проекта, или в файлы других форматов netlist для последующей обработки другими программами.

После выполнения этой команды у нас появился новый файл «qqq». Мы будем использовать его для симуляции. Запускаем в командной строке симулятор из комплекта icarus-verilog:

>vvp qqq

Вот мы и видим весь вывод симулятора на консоль:

Результат симуляции с помощью Icarus Verilog

Здесь видно, как значение счетчика увеличивается с каждым фронтом сигнала clk.
Видно, что до возникновения сигнала reset значение счетчика неопределено.
Видно, что в момент времени "110" устанавливается сигнал wr, а в момент времени "130" происходить запись нового значения в счетчик.

Если вы теперь захотите увидеть сигналы в графическом виде, то это тоже возможно. В результате симуляции у нас появился новый файл "out.vcd" - это Value Change Dump File. Для его просмотра есть инструмент gtkwave. Он есть здесь же в комплекте установленного нами icarus-verilog.

Набираем в командной строке:

>gtkwave out.vcd

И появляется вот такое окно (кликните на картинку, чтобы увеличить ее):

GtkWave - просмотр файлов VCD (Value Change Dump File)

Слева есть окошко со списком сигналов проекта. Нужно выбрать необходимые сигналы и добавить их к просмотру кнопкой "Append".
Справа – окно графического представления сигналов. Можно менять масштаб просмотра и скролировать вдоль шкалы времени.

Вот так можно проводить  функциональную симуляцию проектов написаных на языке Verilog.

 

Комментарии  

0 #23 Stress 05.08.2015 08:04
Цитирую Stress:
А почему в out.vcd wdata=85 ?! Ведь ей присваивают значение 55. GTKWave тоже показывает 55 и соответственно потом 56, 57, 58. А в консоли out.vcd дает 86, 87, 88..? Почему так?!

Каюсь, грешен, не посмотрел что 55 в шестнадцатеричн ом))
0 #22 Stress 05.08.2015 08:02
А почему в out.vcd wdata=85 ?! Ведь ей присваивают значение 55. GTKWave тоже показывает 55 и соответственно потом 56, 57, 58. А в консоли out.vcd дает 86, 87, 88..? Почему так?!
0 #21 Dmitrii Radov 27.12.2014 09:59
Цитирую Dmitrii Radov:
Прошу прощенья, если кто знает помогите разобраться.
Icarus-verilog может скомпилировать их в свой «исполняемый» формат. Для этого в командной строке набираем команду:
>iverilog -o qqq counter.v tcounter.v
Обязательно тестбенч реализовывать в виде отдельного модуля? Можно ли реализовать проект одним файлом(например zip.v) в котором есть два модуля, один из которых является тестбенч(ом)ем?
При запуске Icarus-verilog компилирует файл в свой «исполняемый» формат. Появляется новый файл «qqq». Так же есть и вывод симулятора на консоль. Но почему то в результате симуляции у меня НЕ ПОЯВИЛСЯ НИКАКОЙ новый файл "out.vcd"
В чем может быть проблема?path задал, директорию в которой работаю тоже указал.

Проблема оказалась в том, что я невнимательный дебил и забыл создать vcd-файл внутри тестбенча.
0 #20 Dmitrii Radov 24.12.2014 11:36
Прошу прощенья, если кто знает помогите разобраться.
Icarus-verilog может скомпилировать их в свой «исполняемый» формат. Для этого в командной строке набираем команду:
>iverilog -o qqq counter.v tcounter.v
Обязательно тестбенч реализовывать в виде отдельного модуля? Можно ли реализовать проект одним файлом(например zip.v) в котором есть два модуля, один из которых является тестбенч(ом)ем?
При запуске Icarus-verilog компилирует файл в свой «исполняемый» формат. Появляется новый файл «qqq». Так же есть и вывод симулятора на консоль. Но почему то в результате симуляции у меня НЕ ПОЯВИЛСЯ НИКАКОЙ новый файл "out.vcd"
В чем может быть проблема?path задал, директорию в которой работаю тоже указал.
0 #19 Artem 13.12.2013 17:14
>gtkwave out.vcd

Лучше создать ярлык на GTKWave, чем выполнять его из командной строки. Когда выполняется GTKWave, запущенный из командной строки, она занята. При запуске с ярлыка строка свободна и можно перемоделироват ь в ней проект, а затем нажать в GTKWave File-Reload Waveform без закрытия этой программы.
+8 #18 smit 05.10.2013 06:59
Цитирую mara:
как узнать какие ошибки зделал??

Легко, через "з" пишутся слова "здесь", "здание", "здоровье", "незги". Поэтому слово "зделал" написано с ошибкой, правильно писать "сделал"...
0 #17 firefish 12.12.2012 22:26
Спасибо за такой подробный ман. Как я понимаю для симуляции megafunctions(н апример памяти на m4k/m9k блоках) эту тулзу применять не получится?
0 #16 mara 04.12.2012 20:39
как узнать какие ошибки зделал??
+2 #15 pikachu 28.08.2012 15:21
Спасибо за разъяснение с этой программой, очень удобно, делал как написано, все работает!
Кстати, для удобства, чтобы не набирать код, я оформил все в виде батника (compl.bat) с таким содержимым:

C:\iverilog\bin\iverilog.exe -o qqq C:\VS\LED.v C:\VS\tst_LED.v
C:\iverilog\bin\vvp qqq
C:\iverilog\bin\gtkwave C:\VS\out.vcd
pause
del qqq
del out.vcd

пауза притормаживает экран, если есть ошибки, то можно их просмотреть, del – удаляет файлы, на случай если компиляция неудачна и чтобы не происходил “запуск” старых файлов. А вообще, можно много чего под свое настроение добавить )
+1 #14 nckm_ 06.06.2011 12:10
Цитирую Vadim:
Графикb вывел, но временную шкалу перевести в ns не могу , только sec

в начале тестбенча напишите
`timescale 1ns/1ns
это будет определять временной шаг симулятора.
Где нибудь в тестбенче можно написать как-то так:
initial
begin
#1000000;
$finish();
end
То есть симуляция остановится в момент 1000000 от начала времени в единицах timescale.
В этом примере будет шаг 1ns, а весь интервал симуляции 1sec. Ну и в gtkwave есть кнопочки увеличить или уменьшить масштаб
+1 #13 Vadim 06.06.2011 11:58
Графикb вывел, но временную шкалу перевести в ns не могу , только sec
0 #12 Vadim 06.06.2011 11:54
Все, с этой проблемой разобрался, Avast блокировал выполнения команды. Сейчас все работает на появилась другая проблема в графическом выводе не отображаются графики наверно из за того что временная шкала от 0 до 400 секунд, а в примере 400 ns но изменить разрешения шкалы у меня не получается, что бы я не вводил все время возвращается к 400 секунд
0 #11 Vadim 06.06.2011 11:42
Все есть, так же как у вас
0 #10 nckm_ 06.06.2011 11:36
Цитирую Vadim:
D:\iverilog>path=d:\iverilog\bin

D:\iverilog>iverilog -o qqq counter.v tcounter.v
"iverilog" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

'эммм....
у Вас есть вообще файл iverilog.exe после установки пакета iverilog? поищите его в своих папках! там же должны быть vvp.exe и gtkwave.exe! У меня это папка c:\iverilog\bin
0 #9 Vadim 06.06.2011 11:31
Сейчас сойду с ума, ну что я не так делаю ,ниже последовательно сть моих действий и результата

D:\test>path=d:\iverilog\bin

D:\test>iverilog -o qqq counter.v tcounter.v
"iverilog" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
0 #8 Vadim 06.06.2011 11:19
D:\iverilog>path=d:\iverilog\bin

D:\iverilog>iverilog -o qqq counter.v tcounter.v
"iverilog" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
0 #7 Vadim 06.06.2011 10:56
Цитирую nckm_:
Цитирую Vadim:
блин, после ввода команды в командную строку iverilog -o qqq counter.v tcounter.v, пишется сообщение что данная команда не является внутренней или внешней командой, чем дальше в лес тем больше дров.

В командной строке перейдите в папку, где лежит Ваг проект:
cd d:\test
затем установите путь к запускаемым файлам iverilog, например вот так:
path=c:\iveril og\bin
теперь запускайте Ваш проект на компиляцию
iverilog -o qqq counter.v tcounter.v

Спасибо что помогаете, но ничего не получается.
После ввода команды cd d:\test появляется d:\test> дальше я ввожу d:\test >path=c:\iveril og\bin после этого ничего не происходит затем я ввожу d:\test >iverilog -o qqq counter.v tcounter.v , тоже ничего не происходит . Я в шоке
0 #6 nckm_ 06.06.2011 09:09
Цитирую Vadim:
блин, после ввода команды в командную строку iverilog -o qqq counter.v tcounter.v, пишется сообщение что данная команда не является внутренней или внешней командой, чем дальше в лес тем больше дров.

В командной строке перейдите в папку, где лежит Ваг проект:
cd d:\test
затем установите путь к запускаемым файлам iverilog, например вот так:
path=c:\iverilog\bin
теперь запускайте Ваш проект на компиляцию
iverilog -o qqq counter.v tcounter.v
0 #5 Vadim 06.06.2011 06:41
блин, после ввода команды в командную строку iverilog -o qqq counter.v tcounter.v, пишется сообщение что данная команда не является внутренней или внешней командой, чем дальше в лес тем больше дров.
0 #4 Vadim 06.06.2011 06:38
Ничего не пойму. Допустим у меня лежат файлы для отладки в D:\test, что делать дальше чтобы icarus запустил их отладку,что писать в командной строке?
0 #3 nckm_ 05.06.2011 18:53
Цитирую Vadim:
Я что-то не понял, а где размещать исполняемые файлы? Как инсталлятор, может знать какие файлы мне нужно отлаживать? Как то непонятно для начинающего написано.

вы можете выполнять симуляцию в любой папке, например, там, где у вас расположены файлы проекта на verilog.
Все, что нужно - это, чтобы путь был прописан к icarus verilog типа path=c:\iverilog\bin
И это все.
0 #2 Vadim 05.06.2011 03:45
Я что-то не понял, а где размещать исполняемые файлы? Как инсталлятор, может знать какие файлы мне нужно отлаживать? Как то непонятно для начинающего написано.
+1 #1 maxx_ir 29.11.2010 08:51
После того как российское представительст во Ментор'а
за свою лицензию на год для продукта Precision Synthesis выкатило счет на ~900'000 т.р, желание пользоваться
ихними "мега"-продукта ми (и Modelsim в частности) резко поубавилось. Мелким конторкам легально пользоваться данным софтом смерти подобно.Для функциональной симуляции проекта
более года с успехом использую Icarus-Verilog. +1 ;-)

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Статьи о разном Симуляция проекта с помощью Icarus-Verilog