~ cd 2. начало работы с icarus verilog
Прежде чем приступить к рассмотрению примеров, приведем несколько замечаний о соглашениях. Во-первых, командные строки и последовательности принимают одинаковые аргументы во всех поддерживаемых операционных средах, включая Linux, Windows и различные системы Unix. Когда пример команды показан на рисунке, общий символ подсказки «% » заменяет любую строку подсказки, подходящую для вашей системы. В Windows команды вызываются в командном окне.
Во-вторых, при создании файла для хранения кода Verilog принято использовать суффикс «.v» или «.vl». Это не требование Icarus Verilog, а полезное соглашение. Некоторые люди также используют суффиксы «.ver» или даже «.vlg». В примерах, приведенных в этом курсе, будет использоваться суффикс «.v».
module hello;
initial
begin
$display("Hello, World");
$finish ;
end
endmodule
% iverilog -o hello hello.v
% vvp hello
Hello, World
И вот она, программа выполнена. Что же произошло? Первый шаг, команда «iverilog», прочитала и интерпретировала исходный файл, а затем сгенерировала скомпилированный результат. Форма компиляции может быть выбрана с помощью переключателей командной строки, но по умолчанию используется формат «vvp», который, собственно, и запускается позже, по мере необходимости. Команда «vvp» второго шага интерпретировала файл «hello» из первого шага, что привело к выполнению программы.
Команды «iverilog» и «vvp» являются наиболее важными командами, доступными пользователям Icarus Verilog. Команда «iverilog» — это компилятор, а команда «vvp» — механизм выполнения симуляции. То, какой именно вывод создает компилятор, контролируется переключателями командной строки, но обычно он выдает вывод в стандартном формате vvp, который, в свою очередь, выполняется программой vvp.
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 or posedge reset)
if (reset)
out <= 0;
else
out <= out + 1;
endmodule // counter
module test;
/* Создание сброса, который пульсирует один раз. */
reg reset = 0;
initial begin
# 17 reset = 1;
# 11 reset = 0;
# 29 reset = 1;
# 11 reset = 0;
# 100 $stop;
end
/* Создание регулярной пульсации клоков. */
reg clk = 0;
always #5 clk = !clk;
wire [7:0] value;
counter c1 (value, clk, reset);
initial
$monitor("At time %t, value = %h (%0d)",
$time, value, value);
endmodule // test
записываются в разные файлы.
% iverilog -o my_design counter_tb.v counter.v
% vvp my_design
Эта команда компилирует проект, разбросанный по двум входным файлам, и генерирует скомпилированный результат в файл «my_design». Это работает для небольших и средних конструкций(проектов), но становится громоздким при большом количестве файлов.
counter.v
counter_tb.v
% iverilog -o my_design -c file_list.txt
% vvp my_design
Техника командного файла явно поддерживает гораздо более крупные проекты, просто избавляя вас от необходимости перечислять все исходные файлы в командной строке. Перечислите файлы, которые являются частью проекта или RTL-схемы, в командном файле и используйте флаг «-c», чтобы указать iverilog читать командный файл как список входных файлов Verilog.
% iverilog -s main -o hello hello.v
Если есть несколько корней-кандидатов, все они будут проработаны. Компилятор сделает это, даже если существует много корневых модулей, которые вы не собираетесь моделировать или которые не влияют на моделирование. Это может произойти, например, если вы включили исходный файл, содержащий множество модулей, но на самом деле интересуетесь только некоторыми из них. Флаг «-s» определяет конкретный корневой модуль, а также отключает автоматический поиск других корневых модулей. Вы можете использовать эту возможность для предотвращения инстанцирования нежелательных корневых модулей.
По мере увеличения размеров конструкций или проектов они распространяются на многие десятки и даже сотни файлов. Когда RTL-схемы становится настолько сложным, требуются более продвинутые методы управления исходным кодом. Они описаны в последующих главах, а также другие продвинутые методы управления конструкциями, поддерживаемые Icarus Verilog.