Похожие презентации:
10_Полезности System Verilog
1. Полезности System Verilog
2.
Инициализация типовВ System Verilog доступны улучшенные возможности инициализации
типов. Теперь не надо писать
reg [63:0] data = 64'hFFFFFFFFFFFFFFFF;
Можно сделать так:
data
reg [63:0] data
= '0; инициализирует вектор нулями,
а data = 'bz — третьим состоянием.
= '1;
3.
СтруктурыОбъявить структуры можно следующим способом:
struct {
int a, b;
// 32-bit variables
opcode_t opcode;
// user-defined type
logic [23:0] address; // 24-bit variable
bit error;
// 1-bit два состояния.
} Instruction_Word;
Для структур поддерживается объявление typedef
typedef struct {
logic [31:0] a, b;
logic [ 7:0] opcode;
logic [23:0] address;
} instruction_word_t;
instruction_word_t IW; // structure allocation
4.
По умолчанию структура представляется как unpacked.Ключевое слово packed позволяет структуре быть запакованной.
struct packed {
logic valid;
logic [ 7:0] tag;
logic [31:0] data;
} data_word;
В данном виде она представляется как вектор, в котором поля идут
попорядку.
Поэтому возможны обращения как к полям, так и к битам
data_word.tag = 8’hf0;
data_word[39:32] = 8’hf0; // делаем тоже самое
5.
Объединения unionОбъединения это значение памяти, которое может хранить разные типы
данных, но одновременно только одно!
union {
int i;
int unsigned u;
} data;
...
data.i = -5;
$display("data is %d", data.i);
data.u = -5;
$display("now data is %d", data.u);
6.
Наибольший практический интерес представляют packed unions.В них для представления разных типов используется фиксированное
число бит.
Информация, записанная через один тип, может быть считана в другом
виде (другом типе).
Например:
typedef struct packed {
logic [15:0] source_address;
logic [15:0] destination_address;
logic [23:0] data;
logic [ 7:0] opcode;
} data_packet_t;
union packed {
data_packet_t packet; // packed structure
logic [7:0][7:0] bytes; // packed array
} dreg;
7.
Так как объединение упаковано, то информация выровнена, поэтомуданные записанные через logic [7:0] можно считать через
data_packet_t
Заполняем объединение по байтно, а считываем по полям структуры
initial begin
logic [15:0] src, dst;
for (i = 0; i <= N; i = i + 1) begin
dreg.bytes[i] <= byte_in; //пишем по байтам
end
src = dreg.source_address; //читаем по полям
dst = dreg.destination_address;
end
8.
Packed ArraySystemVerilog позволяет создавать мультиразмерные упакованные массивы
logic [3:0][7:0] data;
// 2-D packed array четыре байта
logic [1:0][3:0][7:0] data; // 3-D packed array два блока по
четыре байта
Стандарт IEEE определяет как эти элемент должны хранится в памяти.
Например для описания
logic [3:0][7:0] data; // 2-D packed array
Поскольку массив хранится в памяти как вектор, то допустимо использовать все
те же операции, что и над векторами
logic [3:0][15:0] a, b, result; // packed arrays
result = (a << 1) + b;
9.
Доступ к вектору может быть как поэлементным, так и включая целуюразмерность(и). Так называемы срез массива.
logic [1:0][1:0][7:0] a; // 3-D packed array два блока по два
байта
a[1][1][0] = 1’b0; // присваиваем один бит массиву. В младший
разряд первого байта, первого блока пишем ноль.
a = 32’hF1A3C5E7; // записываем сразу массив целиком
a[1][0][3:0] = 4’hF; // доступ к части массивы. В младшие
четыре разряда нулевого байта первого блока пишем единицы.
a[0] = 16’hFACE; // доступ к срезу. Заполняем сразу два байта
нулевого блока.
10.
Для копирования содержимого одного массива в другойможно использовать прямой доступ или по срезам
bit [1:0][15:0] a; //32х битный вектор, элемент bit
только 0 или 1
logic [3:0][7:0] b; //32х битный вектор, элемент
logic O,1,Z,X
logic [15:0] c; // 16ти битный вектор
logic [39:0] d; // 40 битный вектор
b = a; // присвоение 32х битного массива 32х
битному массиву
c = a; // старшие 16 бит будут обрезаны
d = a; // старшие 8 бит будут нулями
11.
Элементами массивов могут быть также структуры иобъединения.
Добавлены и несинтезируемые конструкции (только для
моделирования) — динамические массивы, ассоциативные
массивы и очереди.
Для доступа к параметрам массивов удобно использовать
встроенные функции:
$left — возвращает левый индекс;
$right — возвращает правый индекс;
$low — возвращает наименьший индекс;
$high — возвращает наибольший индекс;
$increment — возвращает «1», если $left больше
или равно $right, и «-1» в противном случае;
$size — возвращает размер массива;
$dimensions — возвращает количество измерений массива;
$unpacked_simensions — возвращает количество
неупакованных измерений массива.
12.
Следующие понятия являются несинтезируемыми и могут бытьиспользованы только при моделировании.
Динамические массивы:
integer dyn_array1[]; // описание пустого динамического
массива
dyn_array1 = new[5] (`{1, 2, 3, 4}); // заданы первые элементы
массива
dyn_array1 = new[8](dyn_array1); // изменяется размер с
сохранением предыдущих элементов
Вызов функции size() возвращает текущий размер массива.
Динамический массив можно удалить деструктором delete().
13.
Перечисляемые типы.Конечный автомат можно описать так
enum {WAITE, LOAD, STORE} State, NextState;
always_ff @(posedge clock, negedge resetN)
if (!resetN) State <= WAITE;
else State <= NextState;
always_comb begin
case (State)
WAITE: NextState = LOAD;
LOAD: NextState = STORE;
STORE: NextState = WAITE;
endcase
end
перечисляемому типу можно присваивать значения:
enum {ONE = 1,FIVE = 5,TEN = 10 } state;
14.
По умолчанию перечисляемому типу ставится в соответствие значение int.Однако, можно написать перечисляемый тип с шириной 1 бит, который
может принимать только два состояний
enum bit {TRUE, FALSE} Boolean;
// перечисляемый тип с шириной 2 бита.
// может принимать четыре состояния
enum logic [1:0] {WAITE, LOAD, READY} state;
Для печати значения имени перечисляемого типа используется следующая
конструкция:
$display("\nCurrent state is %s (%b)", State.name);