Вы находитесь на странице: 1из 8

1.

Контрольные вопросы и задания


1. Какие типы имеют сигналы в Verilog?
 Сигналы
     В отличие от языка VHDL, в Verilog нет таких понятий, как сигнал и
переменная. Все данные носят название переменных (variable). Выполнение
операций назначения и сохранение состояний переменных определяются их
классом (net или register) или способом записи оператора присваивания. Для
моделирования поведения реальной аппаратуры предлагается четыре
возможных значения переменной, представленных в рисунок. 1.4.

Рисунок 1.4 Значения сигналов


     Переменные в Verilog делятся на два класса: цепи (nets) и регистры
(register).
     Цепи (nets) являются моделью физического проводника между
структурными компонентами устройства, такими как вентили. Сама по себе
цепь не хранит состояние. Она должна управляться драйвером, который
реализуется с помощью оператора параллельного присваивания (continuous
assignment) или вентиля. Если цепь не имеет драйвера, другими словами,
переменная не получает значения, то она принимает состояние высокого
импеданса z.
     Регистр(register) тип данных является моделью элементов, способных
сохранять значения между двумя выполнениями оператора присвоения.
Ключевым типом данных в регистровом классе является регистр - reg. По
умолчанию переменная регистрового класса инициализируется значением x.
     
     Класс цепи
     В общем случае синтаксис цепей выглядит следующим образом:
     net_type [range] [delay3] list_of_net_identifiers ;
     Параметр net_type может принимать одно из следующих значений,
обозначающих тип данных класса
цепи: wire, tri, tri1, supply0, wand, triand, tri0, supply1, wor, trior или trire
g. Параметр range позволяет создавать векторы указанных типов данных для
моделирования шин. Они будут рассмотрены далее. Задержка линии
описывается параметром delay3.
     Для разрешения конфликтов при одновременном присвоении значений в
Verilog определены восемь уровней интенсивности (strength level) сигнала.
Большинство из них используется для моделей транзисторного уровня.
Синтаксис переменной класса цепи с указанием интенсивности (drive_strength
или charge_strength) выглядит следующим образом:
     net_type [drive_strength] [range] [delay3] list_of_net_decl_assignments ;
     Типы wire и tri применяются для моделирования соединительных линий
между элементами. Они одинаковы по своему синтаксису и функциям. Два
имени в язык введены для различения цели использования переменных. При
этом wire употребляется для сигналов, имеющих в качестве источника один
драйвер или вентиль, а tri - для сигналов с несколькими драйверами. Типы
данных wand, wor, triand и trior предназначены для моделирования
монтажной логики: wand/triand - монтажное И, wor/trior - монтажное ИЛИ.
     В рисунок. 1.5 описываются функции разрешения конфликтов, если
переменная имеет несколько драйверов, при условии их одинаковой
интенсивности.

Рисунок 1.5. Таблицы истинности для wire/tri, wand/triand и wor/trior


     Следующие типы данных созданы для моделей низкого уровня.
Тип trireg используется для описания заряда запоминающего узла (storage
node). Цепи типов данных: tri0 и tri1 - представляют собой модели
резистивных понижающих (pulldown) и повышающих (pullup) уровни сигналов
устройств. Supply0 и supply1 моделируют напряжение питания.
     Примеры описания переменных класса цепи:
wire a;          // однобитовая линия а
wire b, c;          // две однобитовые линии b и с
wire d = 1'b0;          // однобитовая линия d с начальным значением 0
tri tristate_buffer;     // тристабильная линия tristate_buffer
wand #5 sig_1;     // однобитовая линия с монтажной логикой И и задержкой 5
единиц
     
     Регистровый класс данных
     В отличие от цепей регистровые переменные не нуждаются в драйвере, а
сами хранят свое значение. К регистровым относится несколько типов данных.
Их синтаксис:
reg [range] list_of_identifiers;
integer list_of_identifiers;
real list_of_identifiers;
time list_of_identifiers;
realtime list_of_identifiers;
     Тип reg является основным для моделирования аппаратуры. Все остальные -
вспомогательные. Типы данных reg и time хранят информацию в виде
беззнаковых чисел. Integer используется для манипулирования и хранения
информации, которая не рассматривается как реальный регистр аппаратуры.
Размер integer по умолчанию равен 32 битам, данные сохраняются в знаковой
форме, арифметические операции выполняются в дополнительном коде. Time
подобен по функциям 64-битовому регистру и используется для хранения
параметров времени.
     Verilog также имеет вещественный тип данных real. Он подобен остальным
регистровым типам, за исключением нескольких ограничений: значение real
разрешается для использования не во всех операторах Verilog и по умолчанию
инициализируется нулем (остальные регистровые типы инициализируются
символом x). Также в Verilog существует вещественный аналог типа time для
хранения вещественных значений времени - realtime.
     Пример регистровых данных:
     reg reset;     integer i;     time t;     real r;     realtime rt1, rt2;

2. Как описываются вектора в Verilog?


Векторы
     Векторы являются моделями шин в аппаратуре и могут быть определены только для
типов класса "цепи" и для регистрового типа reg.
     Синтаксис:
net_type [msb : lsb] list_of_net_identifiers;
reg [msb : lsb] list_of_register_identifiers;
     где msb (самый значащий бит) - константа, определяющая левую границу вектора, а lsb
(самый младший бит) - правую. Константы msb и lsb могут иметь любое значение -
положительное, отрицательное или нуль. Константа lsb может быть больше, равна или
меньше, чем msb.
     Пример векторов:
reg [3:0] addr;      // 4-разрядный регистр addr
wire [-3:4] d;          // переменная d размером 8 битов состоит
// из элементов: d[-3] (msb), d[-1], d[-1], d[0],
// d[1], d[1], d[3], d[4] (lsb).
tri [5:0] x, y, z;
busA[7]          // элемент шины busA с индексом 7
     По умолчанию вектора задают беззнаковые целые числа. Однако с использованием
ключевого слова signed можно определять знаковые числа. Самый старший бит
рассматривается как знак. Например,
     reg signed [3:0] signed_reg;
     задает 4-битовый вектор, который может принимать значения в диапазоне от -8 до 7.

3. Что такое стандартный примитив?


 Основным элементом описания устройств в Verilog является модуль, который состоит из
деклараций и операторов. Он начинается ключевым словом module и заканчивается -
endmodule. Синтаксис модуля:
     // Старый стиль
     module identifier (ports_list);
     ports_declaration;
     module_body;
     endmodule
     // Новый стиль
     module identifier
     (ports_declaration);
     module_body;
     endmodule

4. Что такое определенный пользователем примитив UDP?


5. Как описываются структурные, поведенческие и DataFlow модели в Verilog?
Поведенческие модели – это модели высокого уровня, которые описывают алгоритм
функционирования устройства без детализации на логические вентили или пути передач
данных.  Строятся на базе операторов: initial always
Для реализации схем на уровне логических элементов Verilog предлагает набор
стандартных примитивов. Запись такого элемента выполняется в формате:
gate [#delay] (output, input1, input2, … );

Где gate – имя логического элемента, delay – необязательная задержка, между


изменением входа вентиля и появлением соответствующей реакции на
выходе.
Листинг 1.1 представляет Verilog-модель вентильного уровня схемы мультиплексора,
изображенной на рис 1.1.
In0
#2 Y0
Sel1 #8
NotSel1

In1
Y1
#8
NotSel0
Sel0 #10 Out
In2 #2
Y2
#8

In3
Y3
#8
.
Рисунок 1.1 – Схема мультиплексора 4 в 1

Листинг 1.1 – Вентильная модель


module mux_4_to_1 ( output Out,
input In0, In1, In2, In3, Sel1, Sel0);
wire NotSel0, NotSel1, Y0, Y1, Y2, Y3;
and #8 (Y1, In1, NotSel1, NotSel0);
not #2 (NotSel0, Sel0);
and #8 (Y3, In3, Sel1, Sel0);
or #10 (Out, Y0, Y1, Y2, Y3);
and #8 (Y0, In0, NotSel1, NotSel0);
not #2 (NotSel1, Sel1);
and #8 (Y2, In2, Sel1, NotSel0);
endmodule

Модель уровня dataflow выполняет реализацию схемы с помощью оператора assign в виде
булевых уравнений или условного оператора. В операторе assign значение получают
переменные, имеющие тип данных класса цепи (net). Пример реализации модели
мультиплексора уровня dataflow представлена листингом 1.2.
Листинг 1.2 – Модель уровня dataflow-модель
//Пример модели уровня передачи данных(data flow) задание а
module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);

//Декларация портов
output out;
input i0, i1, i2, i3;
input s1, s0;
assign out = (~s1&~s0&i0)|(~s1&s0&i1)|(s1&~s0&i2)|(s1&s0&i3);
endmodule

Поведенческие модели строятся на основе операторов initial и always, при том первый из
них преимущественно используется для создания testbench. В этих операторах получать
значения могут только переменные регистрового типа. Поэтому выходы счетчика
COUNTER (листинг 1.5) и регистра Q (Листинг 1.6) имеют тип reg. Конструкции posedge S и
negedge S обозначают передний и задний фронт сигнала S, соответственно.
Листинг 1.5 содержит поведенческую модель счетчика, который выполняет счет на увеличение с
шагом 1. Разрядность счетчика задается параметром SIZE и по умолчанию равна 4. Сброс в
нулевое значение выполняется асинхронным входом RESET, когда RESET=1.
Пример модели 4-х разрядного сдвигового регистра представлен листингом 1.6. В данном коде
циклический сдвиг вправо на один разряд, когда Sh=1 и R=1, реализуется с помощью оператора
конкатенации Q = {Q[0], Q[3:1]}. Если Sh=0 и R=1, выполняется параллельная загрузка данных в
регистр со входа D. Для сброса регистра в ноль используется инверсный асинхронный вход R.
Листинг 1.5 – Поведенческая модель счетчика
// Пример модели счетчика
module counter
#(parameter SIZE = 'd4)
( input CLK, RESET,
output reg [SIZE-1:0] COUNTER);
always @(posedge CLK or posedge RESET) begin
if (RESET) COUNTER = 'd0;
else COUNTER = COUNTER + 'd1;
end
endmodule
Листинг 1.6 – Поведенческая модель регистра регистра асинхронным
сбросом и циклическим сдвигом вправо
Verilog позволяет создавать иерархические модели, в которых описания более высокого
уровня могут включать ссылки на компоненты более низкого уровня иерархии. При этом
используется структурный стиль описания. Листинг 1.6 представляет собой Verilog-код
устройства, состоящего из двух D-триггеров (см. листинг 1.2). Имена inst_1 и inst_1
являются индивидуальными метками каждой копии компонента dff в устройстве top.
Следующие за метками списки содержат имена фактических сигналов, которые будут
соединены с указанными в заголовке модуля dff портами.

6. Как описываются задержки в Verolog?


7. Для чего используется директива ‘timescale?
Директива компилятора `timescale используется для описания единиц измерения и точности
вычисления параметров времени. Синтаксис:
`timescale time_unit / time_precision
     где time_unit - единицы измерения времени; time_precision - точность вычисления
(округления). Значение точности вычисления должно быть меньше или равно величине,
указанной в единицах измерения времени. Допустимые численные значения: 1, 10 и 100;
единицы измерения s, ms, us, ns, ps и fs. Например,
     `timescale 10 ns / 100 ps
     assign #5 Q = D;     // Q получит значение D после 10 ns задержки.

8 Как работает блок initial?


initial»-блок определяет, какие действия должны быть сделаны при старте программы. Этот
блок не является синтезируемым и обычно используется для тестирования. Например:

module testbench;
reg clock;
reg[31:0] in1, in2;
reg[63:0] out;

// Тестируемый модуль
multiplier mult(clock, in1, in2, out);

initial begin
// Тестовые данные.
in1 = 4;
in2 = 20;

// Подождать, пока результат будет готов.


#10;

// Вывести результат вычислений.


$display("result=%d", out);

$finish();
end
endmodule

9 Для чего используется блок always?

Блок always означает, что действие выполняется непрерывно, пока процесс


моделирования не будет остановлен директивой $finish or $stop.

Note: the $finish command actually terminates the simulation whereas $stop.
Merely.Pauses Ниже приведен пример формирования тактового импульса с
использованием конструкции always .Заметим, что вообще говоря для этих целей
удобнее использовать циклы

module pulse;

reg clock

initial clock = 1'b0; // запуск такта

always #10 clock = ~clock; // такт

initial #5000 $finish // конец моделирования

endmodule