Разница в типах данных 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, но их можно представить как кусок жесткого провода, значение которого изменяет только значение на другом конце или источник изменяется.