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