пятница, 19 ноября 2010 г.

В чем различие между типами данных wire, reg и logic?

    Для того, чтобы понять различие между wire, reg и logic, сначала рассмотрим какие в SystemVerilog есть типы данных и какие классы объектов. Сразу скажу, что это не одно и тоже.
    Тип данных определяет набор значений и набор операций над этими значениями.

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

  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

Дополнительная информация по logic в статье.

Комментариев нет:

Отправить комментарий