Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сраный верилог

.pdf
Скачиваний:
53
Добавлен:
01.04.2022
Размер:
4.18 Mб
Скачать

86

Verilog-HDL для моделирования и синтеза цифровых электронных схем

5 % -3 == 2 -5 % 3 == -2

Следует также отметить, что для записи отрицательных целых чисел (типа integer) не следует пользоваться формой с явным указанием числа разрядов (например, –32'd18), так как компилятором такое число будет преобразовано в дополнительный код, что приведет к некорректному результату вычисления. К правильному результату приведет запись –18.

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

результат логической операции всегда имеет длину в 1 бит, независимо от длины операндов, и может принимать значения 0, 1 или х;

если операнд не равен 0, то он воспринимается как логическая единица (истина), равный нулю операнд воспринимается как логический ноль (ложь), а если какой-либо операнд имеет хотя бы один разряд, равный z или x, то результат будет представлен значением x (неопределенный);

операндами логических операций могут служить выражения и сигналы.

Операции сравнения выполняются по схожему принципу. Они могут в качестве результата возвращать одно из трех значений: 0, 1 или х, причем результат равен х (неизвестному), если любой операнд имеет хотя бы один разряд, равный z или x. Так же работают и простые операции равенства (== – равно и != – не равно). Побитовые операции равенства === и !== рассматривают z и x как обычные символы и обрабатывают их стандартным образом, т.е.

4'b101x == 4'b101x // Возвращает x 4'b101x == 4'b101z // Возвращает x 4'b101x === 4'b101x // Возвращает 1 4'b101x === 4'b101z // Возвращает 0

Как видно из примера, побитовые операции равенства никогда не возвращают значение х.

Результат выполнения побитовых операций имеет такое же чис-

Учебное§ 4. Функциональныепособие

модели устройств на языке Verilog на основе потоков данных

87

ло разрядов, как у наиболее длинного из операндов. Соответствующая операция применяется к каждому биту операндов поочередно, более короткий операнд дополняется слева нулями. Таблицы истинности для побитовых операций приводятся в табл. 4.2 – 4.6.

Во всех побитовых операциях сигнал z интерпретируется аналогично с сигналом х.

Операции свертки относятся к унарным операциям и, соответственно, имеют один многоразрядный операнд (одноразрядные операнды в результате возвращаются операциями свертки без изменений). Операцию свертки можно интерпретировать как соответствующую ей побитовую операцию, применяемую ко всем битам операнда:

// Выражения, содержащие операцию свертки:

Таблица 4.2

Таблица истинности для операции «Побитовое И»

Побитовое И

0

1

x

(and)

 

 

 

0

0

0

x

1

0

1

x

x

x

x

x

Таблица 4.3

Таблица истинности для операции «Побитовое ИЛИ»

Побитовое ИЛИ

0

1

x

(or)

 

 

 

0

0

1

x

1

1

1

x

x

x

x

x

Таблица 4.4

Таблица истинности для операции «Побитовое исключающее ИЛИ»

Побитовое

 

 

 

исключающее

0

1

x

ИЛИ

 

 

 

(xor)

 

 

 

0

0

1

x

1

1

0

x

x

x

x

x

Таблица 4.5

Таблица истинности для операции «Побитовое исключающее ИЛИ-НЕ»

Побитовое

 

 

 

исключающее

0

1

x

ИЛИ-НЕ

 

 

 

(xnor)

 

 

 

0

1

0

x

1

0

1

x

x

x

x

x

Таблица 4.6

Таблица истинности для операции «Побитовое отрицание»

Побитовое отрицание

Результат

(not)

 

0

1

1

0

x

x

88

Verilog-HDL для моделирования и синтеза цифровых электронных схем

^8'b10101101

|8'b10101101

&8'b10101101

//Адекватные выражения, реализованные побитовыми

//операциями:

1^0^1^0^1^1^0^1

1|0|1|0|1|1|0|1

1&0&1&0&1&1&0&1

Заметим, что операция свертки вычисляется в направлении справа налево или, другими словами, от менее значащих разрядов к более значащим.

Операции сдвига влево и вправо являются бинарными, при этом в качестве 1-го операнда подставляется сдвигаемый вектор, а в качестве второго – количество сдвигаемых разрядов. Выталкиваемые разряды теряются, а недостающие – заполняются нулями, например:

8'b10101101 << 4 // Дает результат 8'b11010000 8'b10101101 >> 2 // Дает результат 8'b00101011

Операции сдвига очень удобны в программировании, так как сдвиг двоичного числа вправо на n разрядов соответствует делению этого числа на 2n, а сдвиг влево – соответствует умножению на 2n.

Операция конкатенации позволяет объединять произвольное количество отдельных векторов в один общий вектор, который в любых выражениях будет рассматриваться как единый вектор, длина которого равна сумме длин составляющих векторов. Операция конкатенации задается при помощи фигурных скобок:

{Вектор_1, Вектор_2, Вектор_3, … , Вектор_N }

Одно из очевидных применений операции конкатенации – это формирование бита переноса при сложении/вычитании сигналов:

. . .

Учебное§ 4. Функциональныепособие

модели устройств на языке Verilog на основе потоков данных

89

//X1, X2 – Слагаемые reg [7:0] X1;

reg [7:0] X2;

//Y – Результат сложения reg [7:0] Y;

//carry – Бит переноса wire carry;

assign {carry, Y} = X1 + X2;

. . .

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

Операция повторения является расширенной версией операции конкатенации и позволяет сократить запись в случаях, когда один и тот же простой вектор включается в сложный несколько раз. Например:

wire [1:0] k,e; wire [7:0] g; wire [5:0] h;

assign k = 2'b11; assign e = 2'b00;

//В операции конкатенации 4 раза повторяется сигнал k assign g = { 4{k} }; // аналогичная запись {k, k, k, k}

//В операции конкатенации 3 раза повторяется сигнал e assign h = { 3{e} }; // аналогичная запись {e, e, e}

В результате выполнения приведенного выше фрагмента сигналы

90

Verilog-HDL для моделирования и синтеза цифровых электронных схем

g и h получат значения 8'b11111111 и 6'b000000, соответственно. Последний тип рассматриваемых операций – это условная опера-

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

u(),

при

"Условие",

f () =

 

 

 

 

при

"Условие".

v(),

где u(•), v(•) – произвольные выражения, Условие – логическое выражение и У¯с¯л¯о¯в¯и¯е – логическое выражение, обратное Условию.

Синтаксис условной операции можно представить следующим образом:

Условие ? Выражение_u : Выражение_v

Например, необходимо записать Verilog-выражение для вычисления функции

x

+ 2 x

 

,

при

x

< x

 

,

a =

1

 

2

 

при

1

 

2

 

 

2 x1 x2 ,

x1

x2 .

Соответствующий фрагмент программы будет иметь вид

//. . .

reg [7:0] a, x1, x2;

assign a = (x1 < x2)? (x1 + 2*x2) : (2*x1 x2); //. . .

Операции в выражениях выполняются в порядке, соответствующем заранее установленным приоритетам. Ниже перечислены операции в порядке снижения приоритета:

унарные операции;

арифметические операции умножения, деления, вычисления остатка;

арифметическиеоперациисложенияивычитания, операциисдвига;

Учебное§ 4. Функциональныепособие

модели устройств на языке Verilog на основе потоков данных

91

операции сравнения;

операции равенства;

логические операции;

условные операции.

Учебное§ 4. Функциональныепособие

модели устройств на языке Verilog на основе потоков данных

91

4.2. Поведенческое моделирование

Поведенческие операторы Verilog-программ концентрируются в блоках always и initial. Эти операторы являются базовыми в поведенческом моделировании электронных устройств.

Каждый из операторов always или initial представляет собой отдельный поток обработки данных. Все потоки выполняются в модельном времени параллельно, а начало выполнения потоков совпадает с началом модельного времени. Не допускается использование конструкций с вложенными операторами always и initial.

В языке Verilog операторы always и initial представляют собой последовательные или параллельные блоки поведенческих операторов, сгруппированных по функциональному признаку.

4.2.1. Оператор initial

Оператор initial запускается один раз в начале процесса моделирования и не запускается повторно после остановки, т.е. данный оператор служит для формирования начальных значений и т.п.

Если в модуле присутствует более чем один блок initial, то все они будут запущены конкуррентно (параллельно) в модельное время 0. Остановка выполнения одного из блоков initial не зависит от других блоков аналогичного типа. Если в блоке initial присутствует более чем один поведенческий оператор, то необходимо заключить их в операторные скобки begin end. В противном случае операторные скобки можно опускать.

Синтаксис оператора initial приводится ниже:

initial begin

Последовательность_Поведенческих_Операторов;

end;

92

Verilog-HDL для моделирования и синтеза цифровых электронных схем

Приведем два примера использования оператора initial:

//Пример 1 initial

 

x = 4'b1010; //В блоке один поведенческий оператор

//Пример 2

initial

 

begin

//В блоке два поведенческих оператора

 

Line000 = 1'b1;

 

Line001 = 1'b0;

end;

 

В случае необходимости возможна установка задержки выполнения поведенческих операторов в блоке initial, которая осуществляется следующим образом:

initial begin

# Задержка Поведенческий_Оператор;

end;

Здесь Задержка – константа, указывающая число шагов моделирования, начиная от текущего, на которое будет задержано выполнение Поведенческого_Оператора. Для иллюстрации функционирования механизма задержек рассмотрим работу следующего модуля:

`timescale 1ns / 1ps

module Delay_Demo (a, b);

output a ; reg a ; output b ; reg b ;

initial begin

Учебное§ 4. Функциональныепособие

модели устройств на языке Verilog на основе потоков данных

93

#50 a = 1'b1; #50 a = 1'b0;

end initial

begin

#30 b = 1'b0;

// *

#10 b = 1'b1;

// **

#20 b = 1'b0;

 

#10 b = 1'b1;

 

end

endmodule

Временная диаграмма работы этого фрагмента программы Verilog представлена на рис. 4.3.

Рис. 4.3. Задержки в поведенческих операторах

Первая строка программы содержит директиву компилятора `timescale, определяющую длительность одного шага моделирования и дискретность временного интервала. При описании интерфейса рассматриваемого модуля используются порты типа reg, что определяется примененным в данном примере способом присваивания.

До значения модельного времени 30 ns сигнал b на временной диаграмме имеет значение х, так как первое присваивание отложено на 30 ns (строка //*). Задержка вычисляется от текущего значения модельного времени. Таким образом, значение сигнала b в результате выполнения оператора присваивания //** изменится с 1 на 0 в момент времени 30 ns + 10 ns = 40 ns. Так как все операторы в поведенческих блоках (initial) выполняются последовательно, то задержку можно интерпретировать как интервал времени выполнения оператора, причем изменение значений управляемых оператором сигналов происходит в конце

94

Verilog-HDL для моделирования и синтеза цифровых электронных схем

указанного интервала времени. Сумма всех задержек в последовательном блоке определяет общее время выполнения блока операторов.

Блок initial игнорируется средствами синтеза логических цепей, поэтому такой блок обычно служит для поддержки функционирования модели, как, например, для формирования начальных значений и тестовых последовательностей, мониторинга значений сигналов, вывода их на внешние носители информации и т.п.

4.2.2. Оператор always

Оператор always, в отличие от рассмотренного ранее оператора initial, выполняется многократно. Если на определенном шаге моделирования последовательность поведенческих операторов в блоке always выполнена полностью, то на следующем шаге она будет вновь запущена с самого начала.

В качестве примера рассмотрим текст модуля, генерирующего сигнал тактовой частоты с частотой 20 МГц:

`timescale 1ns / 1ns

module CLOCK ( CLK );

output CLK ; reg CLK ;

initial CLK = 1'b0; always

begin

#50 CLK = 1'b1; #50 CLK = 1'b0;

end

endmodule

В показанном примере в момент времени Tmod = 0 запускаются одновременно два процесса – initial и always (рис. 4.4, а). Процесс initial устанавливает начальное значение сигнала CLK. Если исключить этот процесс из программы, то до момента времени 50 ns значение сигнала CLK будет оставаться неопределенным (рис. 4.4, б). Про-