Лекции сапр. Верификация в Verilog
Скачать 80.5 Kb.
|
Конспект лекций по дисциплине «Лингвистические средства САПР», отнесенный к модулю 2 «Верификация в Verilog ». Лекция 6 Тема лекции: Верификация в Verilog. В языке Verilog предусмотрены различные возможности для организации верификации (проверки, контроля) проекта. Формирование начальных значений входных воздействий. Работоспособность проекта должна быть проконтролирована на соответствие техническому заданию (определенному в виде таблицы истинности, например). Поэтому в ходе проверки входным портам присваиваются все возможные значения (далее – входные воздействия или сигналы), отображающие реальные варианты работы. Все входные воздействия формируются в тестовом модуле. Они задаются с помощью базовых блоков:
Блок initialвыполняется с начала моделирования, поэтому в нем производится инициализация сигналов. Приведём несколько примеров инициализации (задания начальных значений): 1.initialbegin a0 = 0; a1 = 0; d0 = 0; ................. d3 = 0; end 2. Или те же сигналы в векторной форме: initial begin a = 2b00; // допускается a = 0; или a = 2 d0; d = 4b0000; end 3. Или те же сигналы с использованием конкатенации: initial {a0, a1, d0,..., d3}= 6b000_000; Итак, мы установили значение входных сигналов в момент старта моделирования (t = 0). Далее проект проверяется во времени (временной контроль). Временной контроль. Для анализа поведения объекта в процессе работы в языке Verilog предусмотрено три варианта временного контроля: с использованием задержек (delay), событий (event) и списка чувствительности. Задержка обозначается символом # и означает либо время между сменой входных сигналов, либо время между поступлением сигнала на вход элемента или модуля и появлением результата на его выходе. В первом случае задержка применяется в тестовом модуле для задания поведения входных воздействий во времени и указывается в следующем формате: # <> <одна из трех конструкций операторов, указанных ранее>; Здесь может быть числом (целым или действительным), параметром, постоянной или переменной величиной или, наконец, функцией. Например: initialbegin # 10 a = 1; // выполняется в момент t = 10 # 2.5 b = 2; // выполняется в момент t = 12.5 # b/2 c = a; // выполняется в момент t = 13.5 # prm c = 4; // выполняется в момент t = 13.5 + prm end Возможны и следующие конструкции тех же записей: initialbegin a = # 10 1; b = # 2.5 2; ............................ end Время измеряется в тех единицах, которые определяются в директиве `timescale. Приведем пример задания поведения входных воздействий во времени: initialbegin # 10 a = 1; // выполняется в момент t = 10 # 2 b = 0; // выполняется в момент t = 12 end Входные воздействия задаются в тестовом модуле, в основном, с помощью оператора блокирующего присваивания (=). Однако, может применяться и оператор неблокирующего присваивания (<=). Приведенная запись с этим оператором будет иметь другой смысл: initialbegin # 10 a <= 1; // выполняется в момент t = 10 # 2 b <= 0; // выполняется в момент t = 2 end Задержка может применяться при описании встроенных примитивов, а также в конструкции assign. Например: nor # 2 mynor (out, in1, in2); assign# 5 out = (cntrl =4b0111) ? 1 : 0; Эта форма временного контроля и две следующие применяются во всех модулях, описывающих устройство (базовых, субмодулях, редко – в головном модуле). При событийном контроле происходит вычисление результата при каждом изменении входных сигналов. Например, запись @ (clk) a = b; означает, что при каждом изменении тактового сигнала clk(это и есть – событие) выполняется a = b. Данная запись относится к группе конструкций блока always. И наконец, разновидностью временного контроля является конструкция блока always со списком чувствительности (возбуждения), рассмотренная ранее. Например: аlways@ (clkorin1orin2) begin …………….. end Здесь изменение хотя бы одной переменной приводит к выполнению группы операторов, заключенных в операторные скобки begin…end. Периодически изменяющиеся величины. Для задания периодически изменяющихся величин используются конструкции Verilog, у которых есть возможность изменять (чаще всего инвертировать) сигнал через заданный промежуток времени (или заданное число раз) во все время моделирования (или в указанный интервал). Приведем несколько примеров, в которых используется это свойство. initial begin clk = 1b0; forever # 5 clk = clk; end В данном примере каждые 5 единиц времени сигнал clk переходит из низкого уровня в высокий и наоборот. always # 10 clk = clk; Здесь сигнал clk должен быть проинвертирован каждые 10 единиц времени, что по сути означает, что период тактового сигнала составляет 20 заданных временных единиц. Как видим, наиболее часто подобные конструкции применяются для задания тактового сигнала. Однако, они вполне применимы ко всем периодическим сигналам. initial begin count = 10; repeat (count) begin # 40 in = 0; # 20 in = 1; end // repeat end // initial В этом примере период изменения величины in составляет 60 единиц времени и повторяется 10 раз. initial clk = 1b0; // запуск такта always # 10 clk = clk; Здесь приведен пример смешанного использования блоков alwaysи initial при задании периодически изменяющейся величины. 5. Векторные величины можно периодически изменять с помощью следующих конструкций: always # 10 in = in+1; always # 10 in ++; //запись, тождественная предыдущей Лекция 7 Тема лекции: Проектирование комбинационных и последовательностных устройств средствами Verilog. Преобразование информации в логических устройствах обеспечивается последовательным выполнением микроопераций в течение конечных по длительности (или дискретных) последовательных интервалов времени. Каждый интервал времени называют тактом. Все логические устройства содержат две основные части: комбинационную, в которой совершается преобразование информации на каждом такте ее обработки, и запоминающую (или последовательностную), в которой наряду с выполнением различных функций производится хранение информации. Проектирование комбинационных логических схем. В комбинационных логических схемах (КС) совокупность выходных сигналов определяется поступившими на их вход информационными и управляющими сигналами. Поэтому комбинационные схемы имеют одно внутреннее логическое состояние, заданное схемным соединением логических элементов. КС выдает результат операции сразу же после окончания переходных процессов. При снятии входных сигналов выходные сигналы теряют информационный смысл. Соответствие между множеством входных и выходных сигналов задается логической функцией комбинационной схемы. Действия разработчика в значительной степени зависят от средств реализации функций, которыми он располагает. С одной стороны, одними из аппаратных средств являются универсальные логические устройства дешифратор и мультиплексор (под универсальностью понимается возможность реализации на их основе произвольной логической функции). А с другой стороны HDL Verilog позволяет выполнить описание устройства и ввести его в САПР. Рассмотрим описание поведения дешифратора (рисунок 7.1) с использованием оператора сдвига. Описание составлено на основе таблицы истинности дешифратора. Базовый модуль выглядит следующим образом. // модуль предназначен для описания дешифратора “3-8” moduledc3_8(dc_out, dc_in); output[7:0] dc_out; // объявление выходов input[2:0] dc_in; // объявление входов reg[7:0] dc_out; // так как применяется блок always always @ (dc_in); begin dc_out = 8b00000001; dc_out = dc_out << dc_in; end endmodule// dc3_8 Рисунок 7.1. Дешифратор “3-8. Условное графическое обозначение. В приведенном модуле сначала в младший разряд записывается единица, а затем происходит сдвиг этой единицы на количество разрядов, соответствующее значению входного набора. Например, если dc_in = 3b100, то dc_out = 8b00010000, то есть dc_out[4] = 1, а значения остальных выходов равны нулю, что и требовалось. Если dc_in = 0, то сдвига не происходит. HDL Verilog предоставляет разработчику много разных возможностей для описания одного и того же устройства. Например, для описания дешифратора можно использовать более десяти способов. Дешифраторы совместно со схемами ИЛИ можно использовать для воспроизведения произвольных логических функций. Действительно, на выходах дешифратора вырабатываются все конъюнктивные термы (минтермы), которые только можно составить из данного числа аргументов. Логическая функция в СДНФ есть дизъюнкция некоторого числа таких термов. Собирая нужные термы по схеме ИЛИ, можно получить любую функцию данного числа аргументов. Рассмотрим Verilog - описание поведения мультиплексора с использованием конструкции assign. Описание составлено на основе таблицы истинности мультиплексора и его алгебраического описания (рисунок 7.2).
а) б) Рисунок 7.2. Мультиплексор “4-1”: а) - таблица истинности, б) - алгебраическое описание. Базовый модуль выглядит следующим образом. // модуль предназначен для описания функционирования мультиплексора “4-1” module mux4_1_as(out_mux, a, d); output out_mux; input [1:0]a; input [3:0]d; assign out_mux = (∼a[1]& ∼a[0]&d[0]| ∼a[1]&a[0]&d[1]| a[1]&∼a[0]&d[2]| a[1]&a[0]&d[3]); endmodule В этом примере к имени модуля добавлено _asдля идентификации применяемой в нем конструкции. Входы (как адресные, так и информационные) объявлены векторными переменными. Обе группы входов являются цепями, так как явного назначения в модуле им не делается, и они управляются внешними сигналами. Цепью также является и выход, так как он вычисляется с помощью конструкции assign. Тип сигналов (wire) в модуле не объявлен, так как он назначается по умолчанию. Применение скобок в правой части конструкции assignв данном случае необязательно. Мультиплексоры, также как и дешифраторы, могут применяться для реализации произвольной логической функции. Проектирование последовательностных устройств средствами Verilog. Последовательностные (последовательные) устройства в отличие от комбинационных характеризуются тем, что выходная функция зависит не только от входных воздействий, но и от предыдущего состояния устройства. Основу последовательных устройств составляют триггеры. Для описания работы триггера могут быть использованы: словесное описание, таблицы истинности, графы, таблицы переходов. При таком описании в качестве дополнительной входной переменной используется значение сигнала Qn т. е. предыдущее значение выходного сигнала триггера. Особенностями Verilog – описания являются следующие: - необходимость учета режима хранения; - необходимость учета запрещенного режима; - для учета специфики формирования очереди событий при моделировании применение оператора неблокирующего присваивания <=; - конструкция assign для описания триггерных устройств не применяется; - необходимость учета синхронного статического и динамического управления. Рассмотрим пример описания функционирования синхронного (входclk) D- триггера со статическим управлением записью (вход data) и инверсным сбросом (входreset) (рисунок 7.3). Рисунок 7.3. D- триггер. Базовый модуль выглядит следующим образом. module d_tr_if (q, clk, data, reset); output q; input clk, data, reset; reg q; always @ (clk or reset) if ( reset) q <=0; else if (clk) q <=data; else; endmodule // d_tr_if В этом примере в соответствии с таблицей истинности D-триггера при значении сигнала reset = 0 выход принимает значение 0 (q =0). В противном случае при наличии разрешающего сигнала (clk = 1) сигнал на выходе принимает значение входного сигнала (q =data). Иначе (clk = 0) на выходе остается старое значение сигнала (режим хранения – пустой оператор else;), т.к. в Verilog переменные хранят свое значение до присвоения нового. |