EpicSim — это компилятор Verilog. Он подходит для использования в качестве симулятора и рекомендуется к запуску под Red Hat и CentOS. Инструкции в этом документе, как правило, применимы ко всем средам.
Проект разработан на основе icarus iverilog под LGPL. Отдельное спасибо Стивену Уильямсу (steve@icarus.com).
Если вы начинаете с исходного кода, процесс сборки должен быть максимально простым. Кто-то, кто в основном знаком с целевой системой и компиляцией C/C++, должен иметь возможность собрать исходный дистрибутив без особых усилий. Некоторые фактические навыки программирования не требуются, но могут пригодиться в случае возникновения проблем.
Для компиляции EpicSim из исходного кода в UNIX-подобной системе вам потребуются следующие программы:
Распакуйте архив tar и скомпилируйте исходный код с помощью команд:
cd EpicSim
mkdir build
cd build
cmake ..
make install
После установки установите переменные среды с помощью команд:
cd EpicSim
#bash
export PATH="target_installation_path/EpicSim/install/bin:$PATH"
#cshell
setenv PATH target_installation_path/EpicSim/install/bin:$PATH"
Как пользователь, первое, что вы захотите сделать, это, вероятно, научиться компилировать и выполнять даже самый тривиальный проект. Для моделирования мы используем следующий проект в качестве примера:
module main;
initial
begin
$display("Hello, World");
$finish ;
end
endmodule
hello.vl
с помощью текстового редактора или скопируйте файл hello.vl
из каталога примеров EpicSim.epicsim
:
% epicsim hello.vl
epicsim-run
, и он выполняется:
Hello, World
Скомпилированную программу также можно выполнить двумя шагами:
% epicsim-driver hello.vl -o epicsim-run
% epicsim-vvp ./epicsim-run
Hello, World
И вот оно, программа выполнена. Что произошло? На первом этапе команда epicsim-driver
прочитала и интерпретировала исходный файл, а затем сгенерировала скомпилированный результат. Форма компиляции может быть выбрана с помощью переключателей командной строки, но форма по умолчанию — vvp
, которая фактически запускается программой epicsim-vvp
.
Команды epicsim-driver
и epicsim-vvp
— единственные команды, которые пользователи используют для вызова EpicSim. То, что на самом деле делает компилятор, контролируется переключателями командной строки. В нашем маленьком примере мы попросили компилятор скомпилировать исходную программу в форму vvp
по умолчанию, которая, в свою очередь, выполняется программой epicsim-vvp
.
Этот инструмент включает в себя парсер, который считывает Verilog (плюс расширения) и генерирует внутренний список соединений. Список соединений передаётся различным этапам обработки, которые преобразуют проект в более оптимальные или практические формы, а затем передаётся генератору кода для окончательного вывода. Этапы обработки и генератор кода выбираются с помощью переключателей командной строки.
Предварительная обработка выполняется отдельной программой ivlpp
. Эта программа реализует директивы include
и define
, создавая вывод, эквивалентный, но без директив. Результатом является один файл с директивами номеров строк, так что фактический компилятор видит только один входной файл. См. ivlpp/ivlpp.txt
для получения дополнительной информации.
Компилятор Verilog начинает с анализа файла исходного кода Verilog. Результатом анализа является список объектов Module в "pform
". pform
в основном является прямым отражением этапа компиляции (см. pform.h
). Могут быть висячие ссылки, и ещё не ясно, какой модуль является корневым.
Можно увидеть удобочитаемую версию окончательного pform
, используя флаг -P <path>
для подкоманды ivl
. Это заставит ivl
вывести pform
в... Файл с именем <path>
. (Обратите внимание, что это обычно не делается, если только не производится отладка подкоманды ivl
).
Детализация берёт pform
и генерирует список соединений. Драйвер выбирает (по запросу пользователя или случайному предположению) корневой модуль для детализации, разрешает ссылки и расширяет экземпляры, чтобы сформировать проект списка соединений (см. netlist.txt
). Во время детализации выполняются окончательные семантические проверки и некоторые простые оптимизации. Список соединений включает в себя все поведенческие описания, а также вентили и провода.
Функция elaborate()
выполняет детализацию.
Можно увидеть удобочитаемую версию окончательного, детализированного и оптимизированного списка соединений, используя флаг -N <path>
для компилятора. Если детализация проходит успешно, окончательный список соединений (то есть после оптимизаций, но перед генерацией кода) будет записан в файл с именем <path>
.
Детализация выполняется в два этапа:
Детализация области действия проходит по pform
, ища области действия и параметры. Создаётся дерево объектов NetScope и помещается в объект Design с корневым модулем, представленным корневым объектом NetScope. Большая часть кода для обработки этого шага содержится в файле elab_scope.cc
.
В конце поведения elaborate_scope (после прохождения pform
) выполняется сканирование дерева объектов NetScope для поиска назначений defparam, собранных во время детализации области действия. Именно тогда переопределения defparam применяются к параметрам.
После того как области действия и параметры сгенерированы и дерево проекта NetScope полностью сформировано, детализация снова проходит по pform
, чтобы сгенерировать структурный и поведенческий список соединений. Параметры также детализируются и оцениваются, поэтому все константы генерации кода теперь известны локально, и список соединений может быть сгенерирован простым прохождением через pform
.
Оптимизация представляет собой набор этапов обработки, которые выполняют оптимизации, не зависящие от целевой технологии. Примерами некоторых полезных преобразований являются:
Фактические функции, выполняемые, указываются в командной строке ivl
с помощью флагов -F
.
Генерация кода берёт список соединений проекта и использует его для управления генератором кода (см. target.h
). Это может потребовать преобразования проекта в соответствии с технологией.
Метод emit()
класса Design выполняет этот шаг. Он проходит через элементы проекта, вызывая целевые функции по мере необходимости для генерации фактического вывода.
Пользователь выбирает генератор целевого кода с флагом -t
в командной строке.
tri0
и tri1
.tran
, tranif1
, tranif0
, rtran
, rtranif1
и rtranif0
не поддерживаются.a <= @(posedge clk) b;
-o <выходной файл>
: выводит файл результатов компиляции.
-f <командный файл>
: считывает файлы с параметрами.
-D <макрос=значение>
: присваивает значение макросу.
-s <корневой модуль>
: устанавливает корневой модуль для детализации.
T min|typ|max
: выбирает тайминги (минимальный, типичный и максимальный), которые будут использоваться для моделирования. По умолчанию используется типичное значение.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )