Блог

Verilog System Tasks.

На нашем сайте уже было несколько ознакомительных статей по языку описания аппаратуры Verilog.

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

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

 

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

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

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

Verilog Code:
  1. $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 всегда переходит на новую строку после печати. Поэтому вызов без параметров – это печать пустой строки. Вот несколько примеров использования:

Verilog Code:
  1. //отображение строки
  2. $display(“Hello Verilog World!);
  3. -- Hello Verilog World
  4. //отображение текущего времени симуляции (предположим сейчас время «230»)
  5. $display($time);
  6. -- 230
  7. //отображение значения адреса и времени
  8. reg [31:0]addr;
  9. $display(“at moment %d addr is %h”,$time,addr);
  10. -- at moment 200 addr is 1fe04400

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

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

Verilog Code:
  1. $monitor(p1,p2,p3,,pn);

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

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

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

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

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

Verilog Code:
  1. integer handle1;
  2. initial
  3. begin
  4. handle1 = $fopen(“my_dbg_file”);
  5. $fdisplay(handle1,”string out to file”);
  6. $fclose(handle1);
  7. 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. Постараюсь рассказать о них в следующих статьях.