Тип данных определяет набор значений и набор операций над этими значениями.
bit | logic | reg | byte | shortint | int | longint | integer | time | byte | shortint | int | longint | integer | time | struct | union | enum | string | event и т.д. - все это типы данных.
reg и logic тута. А где wire? Попробуем разобрать, что такое классы объектов, может там найдется wire.Итак, в SV выделяют следующие классы объектов: литералы, параметры, константы, переменные, сигналы и атрибуты. Все они описаны в стандарте. Мы же рассмотрим поподробнее классы объектов "переменные" (variables) и "сигналы" (nets).
К классу "сигналы" относятся -
supply0 | supply1 | tri | triand | trior | trireg | tri0 | tri1 | uwire | wire | wand | wor.
Вот и нашелся wire. Объекты класса "сигналы" по умолчанию относятся к типу данных logic и поэтому:wire a;
иwire logic a;
эквивалентны. Все, что явно не объявлено объектом класса "сигналы", становится объектом класса "переменные". Объявить переменную можно с помощью типа данных и следующего за ним названия переменной:logic a;
или с добавлением ключевого слова var:var logic a;
Это эквивалентные записи. При использовании var тип данных можно не указывать, тогда по умолчание тип данных будет logic.wire
- Wire используется для соединения различных элементов
- Wire представляет собой физический провод (цепь)
- Wire можно считывать или присваивать
- Wire не может хранить значение
- Для определения состояния сигнала в цепи, у нее должен быть источник сигнала (драйвер), который будет непрерывно управлять цепью
- Wire может иметь несколько драйверов. Что в этом случае происходит, читаем здесь
- Назначить драйвер для wire можно с помощью оператора непрерывного присваивания assign или через порт модуля
- При синтезе wire всегда воспринимается как провод
reg
- Reg в Verilog/SystemVerilog представляет элементы хранения данных (аналог переменной в языках программирования)
- Reg не всегда представляет физический регистр. При синтезе может получиться регистр (flip-flop), регистр-защелка (latch) или комбинационная логика (еще есть вариант, когда может вообще ничего не получиться - это называется несинтезируемая конструкция).
logic
- Ключевое слово logic было добавлено в стандарт, чтобы разработчики больше не думали, что используя переменную reg, они получат физический регистр. logic - это эквивалент reg.
- Если к переменной типа logic одновременно осуществляется несколько присваиваний, то выбирается последнее.
- Присваивание переменной типа 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
Комментариев нет:
Отправить комментарий