Визуальная электроника

В одной из наших статей: blog/simulyatsiya-proekta-s-pomoshchyu-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:
  1. $ git clone https://github.com/steveicarus/iverilog.git

Перейдите в директорию.

Bash Code:
  1. $ cd iverilog

Соберем конфигурационные файлыю

Bash Code:
  1. $ sh autoconf.sh

Если возникает сообщение: autoconf.sh: line 10: autoconf: command not found

Выполните следующую команду на MacOS:

Bash Code:
  1. $ brew install autoconf automake libtool

А для Ubuntu сделайте:

Bash Code:
  1. $ sudo apt-get install autoconf

Эти действия установят требуемый пакет.

При успешном запуске вы увидите сообщение:

Bash Code:
  1. Autoconf in root...
  2. Precompiling lexor_keyword.gperf
  3. Precompiling vhdlpp/lexor_keyword.gperf

Конфигурируем.

Bash Code:
  1. $ ./configure # for default settings - installs to /usr/local/bin
  2. $ ./configure --prefix= #installs to specific directory provided

Компилируем исходники.

Bash Code:
  1. $ make

Эта команда требует установленные пакеты: gcc, g++, bison и flex.

Вы можете установить их с помощью Homebrew или apt-get на Mac и Ubuntu соответственно.

Войдите в режим суперпользователя и выполните:

Bash Code:
  1. $ sudo su
  2. $ make install

2. Установка на MacOS, используя Homebrew.

Bash Code:
  1. $ brew install icarus-verilog

(Опционально) Можно установить просмотрщик файлов сигналов - gtkwave

Bash Code:
  1. $ sudo port -v install gtkwave

Если при установке gtkwave вы увидите сообщение:

Bash Code:
  1. Error: Failed to configure gtk-osx-application-common-gtk2: gtk2 +quartz not installed.

Выполните:

Bash Code:
  1. $ sudo port install gtk2 +quartz

3. Установка на Ubuntu, используя aptitude.

Bash Code:
  1. $ sudo add-apt-repository ppa:team-electronics/ppa
  2. $ sudo apt-get update
  3. $ sudo apt-get install verilog
  4. $ 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:
  1. module hello;
  2. initial
  3. begin
  4. $display("Hello World!");
  5. $finish ;
  6. end
  7. endmodule

Скомпилируйте используя команду:

Bash Code:
  1. $ iverilog -o hello hello.v

Запустите откомпилированный файл:

Bash Code:
  1. $ vvp hello
  2. Hello World!

Пример 2.

Сохраните этот verilog код как alu.v

Verilog Code:
  1. module alu(a,b,s,y);
  2. input[3:0]a;
  3. input[3:0]b;
  4. input[2:0]s;
  5. output[7:0]y;
  6. reg[7:0]y;
  7. always@(a,b,s)
  8. begin
  9. case(s)
  10. 3'b000:y=a+b;
  11. 3'b001:y=a-b;
  12. 3'b010:y=a&b;
  13. 3'b011:y=a|b;
  14. 3'b100:y=4'b1111^a;
  15. 3'b101:y=(4'b1111^a)+1'b1;
  16. 3'b110:y=a*b;
  17. 3'b111:
  18. begin
  19. y=a;
  20. y=y>>1'b1;
  21. end
  22. endcase
  23. end
  24. endmodule

Сохраните этот verilog код как alu.v

Verilog Code:
  1. module alu_tb;
  2. reg[3:0]a;
  3. reg[3:0]b;
  4. reg[2:0]s;
  5. wire[7:0]y;
  6. alu a1(a,b,s,y);
  7.  
  8.  
  9. initial begin
  10.  
  11. if (! $value$plusargs("a=%d", a)) begin
  12. $display("ERROR: please specify +a= to start.");
  13. $finish;
  14. end
  15. if (! $value$plusargs("b=%d", b)) begin
  16. $display("ERROR: please specify +b= to start.");
  17. $finish;
  18. end
  19. if (! $value$plusargs("s=%d", s)) begin
  20. $display("ERROR: please specify +s= to start.");
  21. $finish;
  22. end
  23.  
  24.  
  25.  
  26. wait (y) $display("y=%d", y);
  27. $finish;
  28. end // initial begin
  29. endmodule

Скомпилируйте используя следующие команды:

Bash Code:
  1. $ iverilog -o alu alu_tb.v alu.v
  2. $ vvp alu +a=3 +b=2 +s=0
  3. y= 5

Здесь s=0 выбирает операцию сложения, которая выполняется над a=3 и b=2. Таким образом, результат y равен 3 + 2 =5.

Вывод временных диаграмм с помощью gtkwave (опционально)

Сохраните этот verilog код как counter.v

Verilog Code:
  1. module counter(out, clk, reset);
  2.  
  3. parameter WIDTH = 8;
  4.  
  5. output [WIDTH-1 : 0] out;
  6. input clk, reset;
  7.  
  8. reg [WIDTH-1 : 0] out;
  9. wire clk, reset;
  10.  
  11. always @(posedge clk)
  12. out <= out + 1;
  13.  
  14. always @reset
  15. if (reset)
  16. assign out = 0;
  17. else
  18. deassign out;
  19.  
  20. endmodule // counter

Сохраните этот verilog код как counter_tb.v

Verilog Code:
  1. module test;
  2.  
  3. /* Make a reset that pulses once. */
  4. reg reset = 0;
  5. initial begin
  6. $dumpfile("test.vcd");
  7. $dumpvars(0,test);
  8.  
  9. # 17 reset = 1;
  10. # 11 reset = 0;
  11. # 29 reset = 1;
  12. # 5 reset =0;
  13. # 513 $finish;
  14. end
  15.  
  16. /* Make a regular pulsing clock. */
  17. reg clk = 0;
  18. always #1 clk = !clk;
  19.  
  20. wire [7:0] value;
  21. counter c1 (value, clk, reset);
  22.  
  23. initial
  24. $monitor("At time %t, value = %h (%0d)",
  25. $time, value, value);
  26. endmodule // test

Скомпилируйте используя следующие команды:

Bash Code:
  1. $ iverilog -o counter counter_tb.v counter.v

Запустите используя следующие команды:

Bash Code:
  1. $ vvp counter

Вывод диаграммы:

Bash Code:
  1. $ gtkwave test.vcd

Разверните "тест" на левой боковой панели и нажмите на "c1". Затем перетащите "out" reg в область просмотра сигнала.

Результат:

pic1Вывод gtkwave.

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