Моделирование цифровых схем с помощью языка Verilog
Icarus Verilog представляет собой одну из реализаций языка описания аппаратуры Verilog. Программное обеспечение Icarus Verilog позволяет моделировать и синтезировать электронные схемы, используя язык описания электронных схем Verilog. Icarus Verilog работает как компилятор, компилируя исходный код, записанный на языке Verilog в заданный формат. Для пакетного моделирования компилятор создает промежуточный формат, называемый vvp сборкой (vvp assembly). Этот промежуточный формат запускается на выполнение командой vvp. Icarus Verilog может быть бесплатно загружен с официального сайта http://bleyer.org/icarus или здесь. Icarus Verilog работает в режиме командной строки.
При моделировании с помощью языка Verilog каждая схема представляется набором модулей (module). Модулем называется самостоятельный компонент аппаратного обеспечения, имеющий входы и выходы. Можно выделить два основных способа описания работы модуля: поведенческий (behavioral) и структурный (structural). Поведенческие модели описывают что делает модуль, а структурные модели описывают из каких более простых модулей состоит описываемый модуль.
На языке Verilog модуль описывается специальной синтаксической конструкцией, которая начинается ключевым словом module и заканчивается ключевым словом endmodule. После ключевого слова module записывается название модуля, задаваемое разработчиком, после которого в круглых скобках приводится список входных и выходных переменных модуля.
Рассмотрим, для примера, как с помощью Verilog моделируется схема полусумматора.
Законченная программа моделирования полусумматора может быть записана в одном файле с помощью текстового редактора типа "Блокнот". Имя файла может быть любым, например, half_adder_test.v, где после имени файла через точку указывается рекомендуемое расширение v. Содержимое файла может быть примерно таким.
module half_adder(input a, b, output c, s); assign c = a & b; assign s = a ^ b; endmodule module test(); reg a, b; wire c, s; half_adder dut(a, b, c, s); initial begin $display("a b c s"); $monitor("%b %b %b %b", a, b, c, s); a = 0; b = 0; #10; b = 1; #10; a = 1; b = 0; #10; b = 1; #10; end endmodule
Как видно, содержимое файла состоит из двух модулей. Содержимое каждого модуля включается между зарезервированными словами module и endmodule. После слова module в первой строке описания модуля указывается имя модуля, после которого в скобках записываются параметры модуля, примерно так же как задаются функции в Си-подобных языках.
В данном примере первый модуль half_adder описывает непосредственно полусумматор, имеющий два входа (input) a и b, и два выхода (output) c и s. Тело модуля содержит два оператора assign, с помощью которых вычисляются значения выходов по заданным значениям входов с использованием логических операций & (логическое И) и ^(исключающее ИЛИ). Поскольку язык Verilog предназначен в первую очередь для описания цифровых схем, то его переменные по умолчанию принимают логические значения 0 и 1.
Оператор assign представляет собой оператор непрерывного присваивания (continuous assignment statement). Всякий раз когда входные переменные в правой части оператора непрерывного присваивания изменяются, переменные в левой части оператора присваивания вычисляются заново.
Второй модуль test является вспомогательным и предназначен для тестирования работы полусумматора. Оператор initial выполняет все операторы в своем теле в начале моделирования. Директивы begin и end представляют собой операторные скобки. Для задания временных задержек используется запись вида #10, означающая временную задержку на 10 единиц времени. Сигналы, используемые в блоке initial должны быть заданы с типом reg.
Функция $display("a b c s") выводит строку, указанную в качестве ее параметра на консоль.
Функция $monitor("%b %b %b %b", a, b, c, s) задает вывод сигналов a, b, c, s на консоль, а строка "%b %b %b %b" определяет формат вывода, в данном случае выводятся двоичные значения сигналов.
Чтобы с помощью этого файла промоделировать заданную схему, можно использовать программу Icarus Verilog. В каталоге my_samples имеются готовые пакетные файлы ivrl.bat и ivrl_view.bat, облегчающие работу с программой. Разместите в этом каталоге исходный файл, запустите из данного каталога окно командной строки и наберите команду ivrl.bat, после которой укажите в качестве параметра имя созданного файла (без расширения). Если все сделано правильно, должны появиться данные, отражающие результаты моделирования, как показано на рисунке.
Для более наглядного представления о поведении сигналов во времени можно воспользоваться графическим интерфейсом GTKWave. Для этого нужно в окне командной строки задать команду ivrl_view.bat, указав в качестве параметра имя созданного файла (без расширения). В результате появится окно программы с загруженными результатами моделирования.
Чтобы увидеть сигналы, в левом верхнем окошке щелчком на + разверните пункт test, и щелкните на пункте dut. В результате этого в среднем окошке должны появиться названия сигналов. Выделение сигналов и нажатие кнопки Append приводит к их появлению в основном окне. Результат должен выглядеть примерно так, как показано на рисунке.