Icarus verilog как использовать
Перейти к содержимому

Icarus verilog как использовать

  • автор:

Команда iverilog: опции, ключи и примеры использования

Общие команды – Общие команды, присущие различным операционным системам.

iverilog

Preprocesses and compiles Verilog HDL (IEEE-1364) code, into executable programs for simulation. More information: http://iverilog.icarus.com/.

  • Compile a source file into an executable:
  • Also display all warnings:
  • Compile and run explicitly using the VVP runtime:
  • Compile using Verilog library files from a different path:
  • Preprocess Verilog code without compiling:

Изображение Выучи 10 хороших привычек для работы в UNIX от IBM

Примеры кода, демонстрирующие общие подходы в программировании или же решающие небольшие прикладные задачи. Языки программирования и библиотеки, позволяющие эффективно решать задачи разработки. Объектно-ориентированное программирование, функциональное программирование и прочие подходы и …

Фото Код

Трюки Bash

Полезные заметки по работе с командной строкой: bash и прочие *sh. Однострочники, скрипты, позволяющие решать большие и малые задачи администрирования и настройки Юникс систем. Zsh для современного MacOS, Bash для …

Фото Трюки Bash

Заметки о настройке различных IT-штуковин. Настройка, допиливание, полировка. Конфигурируем приложения и тюнингуем сервера. Полезные параметры и ключи запуска программ. Увеличиваем скорость, уменьшаем отклик, ускоряем работу и улучшаем результаты работы. Объясняем …

Фото Настройки

Терминал/Консоль

Команды и инструкции терминала (консоли) Linux, MacOS, Windows и прочих операционных систем. Трюки и особенности командных оболочек, скрипты для администрирования Unix. Программирование и скриптование Windows и Linux, тонкая настройка Macos. …

Фото Терминал/Консоль

Также может быть вам интересно:

  • Как получить дерево директорий на Bash одним однострочником
  • Python: Функции
  • Python: Встроенные типы данных (list, set, dict, etc)
  • Python: типы данных, переменные, логическое ветвление и циклы
  • Как сделать свою middleware в Django (с примерами)

Свежее на «Цифре»
MessageId или как дебажить систему с минимумом проблем
Программы, 50 дней назад
Проверочный список для выпуска промышленных приложений с иллюстрациями
Работа и управление, 91 день назад
В Google Pixel и Windows Snipping Tool есть возможность восстановления обрезанных изображений
Новости, 23.03.2023
Два подарка «под ёлочку» от Heroes of Might and Magic
Новости, 25.12.2022
Вышел Pulsar – редактор кода на основе Atom
Новости, 25.12.2022
Ленивый backup PostgreSQL
Программы, 17.12.2022
Google анонсировала OSV-Scanner: сканер уязвимостей в программных проектах
Новости, 16.12.2022

Фото Gitea запускает коммерческую версию, а недовольные – форк Forĝejo

Gitea запускает коммерческую версию, а недовольные – форк Forĝejo

На днях группа бывших разработчиков Gitea решили создать на базе хостинга кода Gitea свою версию проекта – «Forgejo». Причиной тому …

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django — своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит — надо уметь создавать пользователей, либо …

Фото Новый синтаксис старой команды with в Python 3.10

Новый синтаксис старой команды with в Python 3.10

Как же долго моё чувство прекрасного страдало… Но в Python 3.10 появился новый парсер синтаксических конструкций Python!

Фото Добавляем постраничную пагинацию на Django сайт

Добавляем постраничную пагинацию на Django сайт

На сайтах часто встречаются многостраничные объекты: список товаров, список заметок и т.д. Поэтому важно уметь добавить навигацию по страницам на …

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни. однострочники

Нет слов, одни. однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если …

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать …

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система …

Icarus 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 приводит к их появлению в основном окне. Результат должен выглядеть примерно так, как показано на рисунке.

Симуляция проекта с помощью Icarus-Verilog

После некоторых раздумий я решил написать статью о симуляции 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 и установщик сам прописывает пути к исполняемым файлам.

папка с установленым icarus-verilog

В этой же папке есть несколько коротких но понятных инструкций, как пользоваться компилятором и симулятором (правда на английском языке).

Теперь напишем 2 модуля на языке Verilog :

  1. Модуль 8-ми битный счетчик с возможностью загрузки.
  2. Тестбенч – модуль для тестирования первого модуля счетчика.

Для чего применяется такая методика из раздельных модулей – тестируемого и тестирующего? Первый модуль – это тот, который мы в будущем хотим компилировать для чипа. Для него важно быть простым и компактным. А второй модуль, тестирующий (их называют 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 else
if (wr)
begin
data $display(«written %h»,wdata);
end
else
data endmodule

А вот тестбенч, тестирующий модуль. Чтобы он был более понятным пожалуйста прочитайте предыдущую статью про System Tasks.

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» снимаем сигнал сброса

//пауза длительностью «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);

Icarus-verilog может скомпилировать их в свой «исполняемый» формат. Для этого в командной строке набираем команду:

>iverilog -o qqq counter.v tcounter.v

Iverilog – это компилятор, который транслирует исходный код Verilog в файл специального формата для симуляции проекта, или в файлы других форматов netlist для последующей обработки другими программами.

После выполнения этой команды у нас появился новый файл «qqq». Мы будем использовать его для симуляции. Запускаем в командной строке симулятор из комплекта icarus-verilog :

>vvp qqq

Вот мы и видим весь вывод симулятора на консоль:

Результат симуляции с помощью Icarus Verilog

Здесь видно, как значение счетчика увеличивается с каждым фронтом сигнала clk .
Видно, что до возникновения сигнала reset значение счетчика неопределено.
Видно, что в момент времени «110» устанавливается сигнал wr , а в момент времени «130» происходить запись нового значения в счетчик.

Если вы теперь захотите увидеть сигналы в графическом виде, то это тоже возможно. В результате симуляции у нас появился новый файл «out.vcd» — это Value Change Dump File . Для его просмотра есть инструмент gtkwave . Он есть здесь же в комплекте установленного нами icarus-verilog .

Набираем в командной строке:

>gtkwave out.vcd

И появляется вот такое окно (кликните на картинку, чтобы увеличить ее):

GtkWave - просмотр файлов VCD (Value Change Dump File)

Слева есть окошко со списком сигналов проекта. Нужно выбрать необходимые сигналы и добавить их к просмотру кнопкой » Append «.
Справа – окно графического представления сигналов. Можно менять масштаб просмотра и скролировать вдоль шкалы времени.

Вот так можно проводить функциональную симуляцию проектов написаных на языке Verilog .

Установка и использование Icarus Verilog в линукс на примере CentOS 7

С последним икарусом пришлось немного попотеть, как обычно бывает, в репах дистрибутива древняя как еда мамонта версия, а сборка из исходников падает из-за старого gcc, если вкратце — надо установить последний devtoolset и и зависимости в лице gperf:

scl enable devtoolset — 4 bash

sudo yum install — y gperftools gperf gperftools — devel gperftools — libs

Теперь можем собирать икарус с верилогом, особенности, после клонирования переключаемся на метку версии v10_1, при сборке передаём компиляторы опции, позволяющие оптимизировать код под инструкции конкретного процессора, на котором идёт сборка, ну и затем собираем сборку в четыре потока:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *