В одной из наших статей: Симуляция проекта с помощью Icarus-Verilog. мы уже описывали опыт использования симулятора Icarus для Verilog проектов.
Тогда мы рассказывали о настройке Icarus исключительно в экосистеме операционной системы Windows, ушедшей от нас компании Microsoft. В данной статье мы рассмотрим пример использования симулятора в операционных системах Linux и MacOS.
Примечание: Приведенные ниже шаги были протестированы на Ubuntu 16.04 и macOS 10.14
1. Скомпилируйте из исходного кода на Linux / Mac или в Cygwin на Windows
Для компиляции вам понадобятся: make, autoconf, gcc, g++, flex, bison (и, возможно, больше, в зависимости от вашей системы).
Клонируйте репозиторий git.
Bash Code:
$ git clone https://github.com/steveicarus/iverilog.git
Перейдите в директорию.
Bash Code:
$ cd iverilog
Соберем конфигурационные файлыю
Bash Code:
$ sh autoconf.sh
Если возникает сообщение: autoconf.sh: line 10: autoconf: command not found
Выполните следующую команду на MacOS:
Bash Code:
$ brew install autoconf automake libtool
А для Ubuntu сделайте:
Bash Code:
$ sudo apt-get install autoconf
Эти действия установят требуемый пакет.
При успешном запуске вы увидите сообщение:
Bash Code:
Autoconf in root... Precompiling lexor_keyword.gperf Precompiling vhdlpp/lexor_keyword.gperf
Конфигурируем.
Bash Code:
$ ./configure # for default settings - installs to /usr/local/bin $ ./configure --prefix= #installs to specific directory provided
Компилируем исходники.
Bash Code:
$ make
Эта команда требует установленные пакеты: gcc, g++, bison и flex.
Вы можете установить их с помощью Homebrew или apt-get на Mac и Ubuntu соответственно.
Войдите в режим суперпользователя и выполните:
Bash Code:
$ sudo su $ make install
2. Установка на MacOS, используя Homebrew.
Bash Code:
$ brew install icarus-verilog
(Опционально) Можно установить просмотрщик файлов сигналов - gtkwave
Bash Code:
$ sudo port -v install gtkwave
Если при установке gtkwave вы увидите сообщение:
Bash Code:
Error: Failed to configure gtk-osx-application-common-gtk2: gtk2 +quartz not installed.
Выполните:
Bash Code:
$ sudo port install gtk2 +quartz
3. Установка на Ubuntu, используя aptitude.
Bash Code:
$ sudo add-apt-repository ppa:team-electronics/ppa $ sudo apt-get update $ sudo apt-get install verilog $ sudo apt-get install gtkwave
Последний пункт опциональный.
Установочные файлы для windows доступны по адресу: http://bleyer.org/icarus/
Для информации о использовании Icarus в среде Microsoft Windows, вы можете обратиться к нашей статье: blog/simulyatsiya-proekta-s-pomoshchyu-icarus-verilog
4. Запуск.
Пример 1.
Сохраните этот verilog код как hello.v
Verilog Code:
module hello; initial begin $display("Hello World!"); $finish ; end endmodule
Скомпилируйте используя команду:
Bash Code:
$ iverilog -o hello hello.v
Запустите откомпилированный файл:
Bash Code:
$ vvp hello Hello World!
Пример 2.
Сохраните этот verilog код как alu.v
Verilog Code:
module alu(a,b,s,y); input[3:0]a; input[3:0]b; input[2:0]s; output[7:0]y; reg[7:0]y; always@(a,b,s) begin case(s) 3'b000:y=a+b; 3'b001:y=a-b; 3'b010:y=a&b; 3'b011:y=a|b; 3'b100:y=4'b1111^a; 3'b101:y=(4'b1111^a)+1'b1; 3'b110:y=a*b; 3'b111: begin y=a; y=y>>1'b1; end endcase end endmodule
Сохраните этот verilog код как alu.v
Verilog Code:
module alu_tb; reg[3:0]a; reg[3:0]b; reg[2:0]s; wire[7:0]y; alu a1(a,b,s,y); initial begin if (! $value$plusargs("a=%d", a)) begin $display("ERROR: please specify +a= to start."); $finish; end if (! $value$plusargs("b=%d", b)) begin $display("ERROR: please specify +b= to start."); $finish; end if (! $value$plusargs("s=%d", s)) begin $display("ERROR: please specify +s= to start."); $finish; end wait (y) $display("y=%d", y); $finish; end // initial begin endmodule
Скомпилируйте используя следующие команды:
Bash Code:
$ iverilog -o alu alu_tb.v alu.v $ vvp alu +a=3 +b=2 +s=0 y= 5
Здесь s=0 выбирает операцию сложения, которая выполняется над a=3 и b=2. Таким образом, результат y равен 3 + 2 =5.
Вывод временных диаграмм с помощью gtkwave (опционально)
Сохраните этот verilog код как counter.v
Verilog Code:
module counter(out, clk, reset); parameter WIDTH = 8; output [WIDTH-1 : 0] out; input clk, reset; reg [WIDTH-1 : 0] out; wire clk, reset; always @(posedge clk) out <= out + 1; always @reset if (reset) assign out = 0; else deassign out; endmodule // counter
Сохраните этот verilog код как counter_tb.v
Verilog Code:
module test; /* Make a reset that pulses once. */ reg reset = 0; initial begin $dumpfile("test.vcd"); $dumpvars(0,test); # 17 reset = 1; # 11 reset = 0; # 29 reset = 1; # 5 reset =0; # 513 $finish; end /* Make a regular pulsing clock. */ reg clk = 0; always #1 clk = !clk; wire [7:0] value; counter c1 (value, clk, reset); initial $monitor("At time %t, value = %h (%0d)", $time, value, value); endmodule // test
Скомпилируйте используя следующие команды:
Bash Code:
$ iverilog -o counter counter_tb.v counter.v
Запустите используя следующие команды:
Bash Code:
$ vvp counter
Вывод диаграммы:
Bash Code:
$ gtkwave test.vcd
Разверните "тест" на левой боковой панели и нажмите на "c1". Затем перетащите "out" reg в область просмотра сигнала.
Результат:
Вывод gtkwave.