Разница в типах данных SystemVerilog (рег, логика, бит)

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

reg [31:0] data;
logic [31:0] data;
bit [31:0] data;

Как они отличаются друг от друга?

Ответы

Ответ 1

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

wire w_data;
assign w_data = y;

// Same function as above using reg
reg r_data;
always @* 
  r_data = y ;

Распространенная ошибка при изучении Verilog заключается в том, чтобы предположить, что тип reg означает регистр в аппаратном обеспечении. Более ранняя оптимизация для симулятора может быть выполнена в контексте его использования.

Это вводит logic, который можно использовать вместо провода и регистра.

logic  w_data;
assign w_data = y;

// Same function as above using reg
logic r_data;
always @* 
  r_data = y ;

Также были созданы типы bit и byte, которые могут содержать только 2 состояния 0 или 1 no x или z. byte означает bit [7:0]. Использование этих типов обеспечивает небольшое улучшение скорости, но я бы рекомендовал не использовать их в RTL, так как проверка может пропустить неинициализированные значения или критические сбросы.

Использование bit и byte будет более распространено в компонентах testbench, но может привести к проблемам в случае необходимости водить x, чтобы стимулировать повреждение и восстановление данных.


Обновление

Во время записи у меня создалось впечатление, что logic нельзя использовать для tristate, я не могу найти оригинальную бумагу, на которой я основывал это. До тех пор, пока дальнейшие обновления, комментарии или изменения не будут отменены, я отменяю свое утверждение о том, что логика не может использоваться для создания трехгосударственных линий.


Добавлен тип tri для явного определения строки с тремя состояниями. Он основан на свойствах a wire, logic основан на свойствах a reg.

tri t_data;
assign t_data = (drive) ? y : 1'bz ;

Если вам больше не нужно поддерживать обратную совместимость Verilog, тогда я бы рекомендовал переключиться на использование logic и tri. Использование logic поддерживает повторный факторинг, а tri отражает намерение дизайна тристатной строки.

Ответ 2

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

  • logic - это 1-битный тип данных с 4 состояниями

  • bit - это 1-битный тип данных с двумя состояниями, который может имитировать быстрее, чем logic
  • Если a logic также объявлен как wire, он имеет дополнительную возможность поддержки нескольких драйверов. Обратите внимание, что по умолчанию wire эквивалентно wire logic.
  • В общем случае сети" (например, wire и tri) наиболее подходят для проектирования коммуникационных шин.

Практически говоря, для RTL обычно неважно, объявляете ли вы с помощью reg или logic или wire. Однако, если вам нужно сделать явное объявление типа с 4 состояниями (в отличие от когда вы не сделаете), вы обычно должны выбрать logic, поскольку это то, что предназначено для этого языка.


Статьи по теме:

Ответ 3

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

@e19293001, @Morgan, logic определяет переменную с 4 состояниями, отличную от bit, и поэтому переменную logic можно использовать для хранения 1'bz, поэтому следующий код действителен и компилируется:

logic t_data;
assign t_data = (drive) ? y : 1'bz ;

Но я согласен, что для отражения намерения дизайна tri следует использовать вместо logic в этих случаях (хотя я должен сказать, что я не вижу людей, использующих tri вместо logic/wire слишком часто).

Ответ 4

Тип логических данных не позволяет использовать несколько драйверов. Последнее присвоение выигрывает в случае множественного присвоения. Тип данных Reg/Wire дает X, если несколько драйверов пытаются их с разным значением. Тип данных логики просто назначает последнее значение назначения.

Ответ 5

Регистр и логика точно такие же. Эти типы данных появляются внутри всегда или начальных блоков и сохраняют значения, т.е. Всегда @(a) b <= a;, регистр b оценивается только тогда, когда "a" изменяется, но в остальном он просто сохраняет значение, которому оно было назначено последним.

провод - это просто соединения и необходимость непрерывного управления. Я согласен, что они могут вести себя одинаково, как упоминалось в @Morgan, но их можно представить как кусок жесткого провода, значение которого изменяет только значение на другом конце или источник изменяется.