После некоторых раздумий я решил написать статью о симуляции 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 и установщик сам прописывает пути к исполняемым файлам.
В этой же папке есть несколько коротких но понятных инструкций, как пользоваться компилятором и симулятором (правда на английском языке).
Теперь напишем 2 модуля на языке Verilog:
- Модуль 8-ми битный счетчик с возможностью загрузки.
- Тестбенч – модуль для тестирования первого модуля счетчика.
Для чего применяется такая методика из раздельных модулей – тестируемого и тестирующего? Первый модуль – это тот, который мы в будущем хотим компилировать для чипа. Для него важно быть простым и компактным. А второй модуль, тестирующий (их называют testbench) моделирует внешние сигналы, которые подаются на тестируемый модуль и проверяет выходные сигналы из него.
Тут надо заметить, что написание тестбенчей – это в каком-то смысле искуство. Получается мы пишем программу, модуль. Для тестирования этой программы мы пишем вторую программу – модуль тестбенч. Мы можем ошибиться как в первой программе, так и во второй или в обеих сразу! Ведь в любой программе возможны баги. Разработчик может думать, что он все сделал правильно и просимулировал и увидел результат какой хотел, но на самом деле проект может остаться неработоспособным Но не нужно пугаться. Будем двигаться дальше.
Итак, вот мой счетчик, тестируемый модуль:
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
Вот мы и видим весь вывод симулятора на консоль:
Здесь видно, как значение счетчика увеличивается с каждым фронтом сигнала clk.
Видно, что до возникновения сигнала reset значение счетчика неопределено.
Видно, что в момент времени "110" устанавливается сигнал wr, а в момент времени "130" происходить запись нового значения в счетчик.
Если вы теперь захотите увидеть сигналы в графическом виде, то это тоже возможно. В результате симуляции у нас появился новый файл "out.vcd" - это Value Change Dump File. Для его просмотра есть инструмент gtkwave. Он есть здесь же в комплекте установленного нами icarus-verilog.
Набираем в командной строке:
>gtkwave out.vcd
И появляется вот такое окно (кликните на картинку, чтобы увеличить ее):
Слева есть окошко со списком сигналов проекта. Нужно выбрать необходимые сигналы и добавить их к просмотру кнопкой "Append".
Справа – окно графического представления сигналов. Можно менять масштаб просмотра и скролировать вдоль шкалы времени.
Вот так можно проводить функциональную симуляцию проектов написаных на языке Verilog.
Подробнее...