Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на госы бакалавриат комета.doc
Скачиваний:
404
Добавлен:
22.09.2018
Размер:
6.32 Mб
Скачать

2. Типы данных. Wire, reg, logic. Массивы. Строковый тип. Задание числе (в двоичном, десятичном, шестнадцатиричном виде).

Тип данных определяет набор значений и набор операций над этими значениями.

bit | logic | reg | byte | shortint | int | longint | integer |time | byte | struct| union | enum | string | event и т.д. - все это типы данных.

Итак, в SV выделяют следующие классы объектов: литералы, параметры, константы, переменные, сигналы и атрибуты. Все они описаны в стандарте. Мы же рассмотрим поподробнее классы объектов "переменные" (variables) и "сигналы" (nets). К классу "сигналы" относятся-

supply0 | supply1 | tri | triand | trior | trireg | tri0 | tri1| uwire | wire | wand | wor.

Объекты класса "сигналы" по умолчанию относятся к типу данных logic и поэтому: wire a; и wire logic a; эквивалентны. Все, что явно не объявлено объектом класса "сигналы", становится объектом класса "переменные". Объявить переменную можно с помощью типа данных и следующего за ним названия переменной: logic a; или с добавлением ключевого слова var:

var logic a;

Это эквивалентные записи. При использовании var тип данных можно не указывать, тогда по умолчание тип данных будет logic.

wire

  1. wire используется для соединения различных элементов;

  2. wire представляет собой физический провод (цепь);

  3. wire можно считывать или присваивать;

  4. wire не может хранить значение;

  5. Для определения состояния сигнала в цепи, у нее должен быть источник сигнала (драйвер), который будет непрерывно управлять цепью;

  6. wire может иметь несколько драйверов;

  7. Назначить драйвер для wire можно с помощью оператора непрерывного присваивания assign или через порт модуля;

  8. При синтезе wire всегда воспринимается как провод

reg

  1. reg в Verilog/SystemVerilog представляет элементы хранения данных (аналог переменной в языках программирования)

  2. reg не всегда представляет физический регистр. При синтезе может получиться регистр (flip-flop), регистр-защелка (latch) или комбинационная логика (еще есть вариант, когда может вообще ничего не получиться - это называется несинтезируемая конструкция).

logic

  1. Ключевое слово logic было добавлено в стандарт, чтобы разработчики больше не думали, что используя переменнуюreg, они получат физический регистр. logic - это эквивалентreg.

  2. Если к переменной типа logic одновременно осуществляется несколько присваиваний, то выбирается последнее.

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

logic sum;

assign sum = a ^ b; // как wire

always_comb sum = a + b; // как reg

adder adder_inst(.out(sum), .op1(a), op2(b)); // как wire

В программировании, строковый тип (англ. string «нить, вереница») — тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. Каждая переменная такого типа (строковая переменная) может быть представлена фиксированным количеством байтов либо иметь произвольную длину.

Массив (также, — в некоторых языках программирования, — «таблица», «ряд», «матрица») — тип или структура данных в виде набора компонентов (элементов массива), расположенных в памяти непосредственно друг за другом. При этом — доступ к отдельным элементам массива осуществляется с помощью индексации (то есть через ссылку на массив с указанием номера (индекса) нужного элемента); за счёт этого и в отличие от списка — массив является структурой данных, пригодной для осуществления произвольного доступа к её ячейкам.

Массивы (Arrays )

Регистры (Registers), целые числа (integers) и временные (time) типы данных можно объявлять как массивы, как это показано в нижеследующем примере:

Объявление

<data_type_spec> {size} <variable_name> {array_size}

Использование

<variable_name> {array_reference} {bit_reference}

reg data [7:0]; // 8 1-разрядных элементов

integer [3:0] out [31:0]; // 32 4-битных элемента

data[5]; // 5 8 битных элементов

Целые числа могут быть:

  • двоичными (binary), обозначаются b или B;

  • десятичными (decimal, d или D);

  • шестнадцатеричными (hexidecimal, h, H);

  • или восьмеричными (octal, o или O);

Для определения чисел используются следующие форматы:

  1. <разрядность>'<основание><число> - полное описание числа

  2. <основание><число>: используется разрядность представления, заданная в системе по определению, но не менее 32 бит.

  3. <число>: используется, когда по умолчанию десятичное основание

Разрядность определяет число бит под представление числа. Например

8'b10100010 // 8 битное число в двоичной системе

8'hA2 // 8 битное число в шестнадцатиричной системе