Verilog System Tasks

На нашем сайте уже было несколько ознакомительных статей по языку описания аппаратуры Verilog (статьи 1, 2, 3, 4, 5). Их даже можно выкачать одним файлом:

.

Конечно, в тех ознакомительных статьях было невозможно рассказать все. Именно поэтому я продолжаю освещать некоторые возможности и особенности языка Verilog.

Сейчас речь пойдет о специальных ключевых словах языка Verilog, используемых для симуляции проектов. Симуляция очень важный этап разработки. Перед проверкой проекта в чипе FPGA или CPLD очень желательно промоделировать поведение всех его модулей.

Вообще-то и про симуляцию проекта в среде Quartus II, у меня тоже была статья. Однако, то была симуляция средствами среды Quartus II: нужно было «рисовать» входные сигналы для модуля и симулятор рассчитывал выходные сигналы и показывал все это в графическом виде. Теперь же разговор именно о средствах языка Verilog – это так называемые System Tasks. Я расскажу только о некоторых ключевых словах языка, важных для симуляции. Итак...

Ключевое слово $display.

$display используется для отображения в консоли симулятора значения переменных, строк или выражений. Используется вот так:


$display(p1,p2,p3,…,pn);
Здесь параметры p1, p2, …, pn – это строки или выражения. Вообще, вызов этой системной функции похож по синтаксису на printf из языка C. Первый параметр, как правило – это строка форматирования, остальные параметры – это отображаемые выражения. Спецификаторы (не все!) строки форматирования вот такие:

%d или %D – отображение в десятичном виде,

%b или %B – отображение в двоичном виде,

%s или %S – отображение cтроки,

%h или %H – отображение в шестнадцатиричном виде,

%c или %C – отображение символа ASCII,

%o или %O – отображение в восьмеричном виде,

%t или %T – отображение в формате времени,

%e или %E – отображение реального числа в научном виде (например 3e10),

%f или %F – отображение реального числа в десятичном виде (например 3.14),

%g или %G – отображение реального числа либо в научном виде, либо в десятичном, как окажется  короче.

$display всегда переходит на новую строку после печати. Поэтому вызов без параметров – это печать пустой строки. Вот несколько примеров использования:


//отображение строки

$display(“Hello Verilog World!”);

-- Hello Verilog World

//отображение текущего времени симуляции (предположим сейчас время «230»)

$display($time);

-- 230

//отображение значения адреса и времени

reg [31:0]addr;

$display(“at moment %d addr is %h”,$time,addr);

-- at moment 200 addr is 1fe04400


Ключевое слово $monitor.

Язык Verilog предлагает механизм отслеживания момента изменения сигнала. Делается это с помощью $monitor. Формат параметров такой же, как и у $display:


$monitor(p1,p2,p3,…,pn);


Эта системная функция используется во время симуляции модулей. Она отслеживает момент изменения сигнала и тогда печатает на консоль информацию о сигналах, указанных в параметрах вызова. Список сигналов, за которыми идет наблюдение во время симуляции только один – тот что указан в параметрах к $monitor. Если $monitor был вызван несколько раз, то активен последний.

Отслеживание изменений сигнала с помощью $monitor может быть приостановленно командой $monitoroff, а вот возобновить отслеживание можно командой $monitoron.

Команда $stop позволяет остановить симуляцию и перевести симулятор в интерактивный режим (чтобы вручную проверить значения каких нибудь сигналов в проекте).

Команда $finish полностью останавливает симулятор.

Когда проект становится сложным и большим для его симуляции вывода на консоль симулятора может оказаться недостаточно. Тогда используют вывод сообщений в файл.

Команда $fopen позволяет открыть файл и делать вывод сообщений отладки в файл с помощью команд $fdisplay, $fmonitor, $fwrite. Вот простой пример вывода сообщения симулятора в файл:


integer handle1;

initial

begin

handle1 = $fopen(“my_dbg_file”);

$fdisplay(handle1,”string out to file”);

$fclose(handle1);

end


Если вам кажется, что отладка с помощью вывода на консоль симулятора не достаточна, то вы можете использовать просмотр сигналов в графическом виде, в виде waveform. Для этого тоже есть свои средства.

Симулятор может генерировать так называемые VCD файлы – Value Change Dump File. Это текстовые файлы, которые описывают сигналы и моменты их изменения в проекте во время симуляции. Потом эти текстовые файлы можно прочитать другими специальными программами, которые отображают сигналы в графическоми виде.

Ключевое слово $dumpfile(“my_dump_file_name”) задает имя выходного файла для создания файла дампа. Слово $dumpvars(level, module_name) сообщает симулятору какие сигналы должны быть включены в вывод согласно уровню иерархии проекта и относительно некоторого модуля. Если $dumpvars вызывается без парамеров, то все сигналы будут выведены в файл. Ключевые слова $dumpon и $dumpoff позволяют включить запись или приостановить ее.

Возникает вопрос: как мы можем использовать все эти ключевые слова в среде Altera Quartus II? Нужно воспользоваться специальными внешними симуляторами. Один из них Mentor Graphics® ModelSim. Компания Altera предлагает и бесплатную версию этого симулятора ModelSim-Altera Starter Edition. Эта среда довольно сложная в освоении, но совершенно необходимая для симуляции проектов.

Существуют и другие средства отладки и их довольно много, есть в том числе и открытые проекты. Один из них – icarus-verilog.  Возможно его освоение даже окажется проще, чем ModelSim. Постараюсь рассказать о них в следующих статьях.

 

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