В systemverilog есть разные типы данных, которые можно использовать следующим образом:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
Чем они трое отличаются?
В systemverilog есть разные типы данных, которые можно использовать следующим образом:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
Чем они трое отличаются?
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 без x или z. byte
означает bit [7:0]
. Использование этих типов дает небольшое улучшение скорости, но я бы рекомендовал не использовать их в RTL, поскольку ваша проверка может пропустить неинициализированные значения или критические сбросы.
Использование bit
и byte
будет более распространено в компонентах тестовой среды, но может привести к проблемам в случае необходимости использовать x для стимулирования повреждения и восстановления данных.
Обновить
На момент написания у меня создалось впечатление, что logic
не может использоваться для трех состояний, я не могу найти исходную статью, на которой я это основал. До дальнейших обновлений, комментариев или правок я отказываюсь от утверждения, что логику нельзя использовать для создания линий с тремя состояниями.
Добавлен тип tri
для явного определения линии с тремя состояниями. Он основан на свойствах wire
, logic
основан на свойствах reg
.
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
Если вам больше не нужно поддерживать Verilog с обратной совместимостью, я бы порекомендовал перейти на использование logic
и tri
. Использование logic
способствует повторному факторингу, а tri
отражает замысел проекта линии с тремя состояниями.
Выбор имени reg
оказался ошибкой, поскольку вместо этого предполагается, что существование регистров основано на том, как выполняются назначения. выполненный. Из-за этого использование reg
по существу не рекомендуется в пользу logic
, который на самом деле относится к тому же типу.
logic
- это 1-битный тип данных с 4 состояниями
bit
- это 1-битный тип данных с двумя состояниями, который может моделироваться быстрее, чем logic
logic
также объявлен как wire
, он имеет дополнительную возможность поддержки нескольких драйверов. Обратите внимание, что по умолчанию wire
эквивалентно wire logic
.wire
и tri
) наиболее подходят для проектирования коммуникационных шин.На практике для RTL обычно не имеет значения, объявляете ли вы с reg
или logic
или wire
. Однако, если вам нужно сделать явное объявление типа с 4 состояниями (в отличие от , когда вы этого не сделаете) , вам обычно следует выбирать logic
, поскольку это то, что предусмотрено языком.
Статьи по Теме:
Поскольку я не могу добавить комментарий, я должен написать то, что выглядит как новый ответ, но это не так. Вздох!
@ e19293001, @Morgan, logic
определяет переменную с 4 состояниями в отличие от bit
, и, следовательно, переменная logic
может использоваться для хранения 1'bz
, поэтому следующий код действителен и компилируется:
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
Но я согласен с тем, что для отражения замысла дизайна в этих случаях следует использовать tri
вместо logic
(хотя я должен сказать, что не вижу, чтобы люди слишком часто использовали tri
вместо _9 _ / _ 10_).
рег и логика точно такие же. Эти типы данных появляются внутри блоков always или initial и хранят значения, т.е. всегда @ (a) b ‹= a ;, reg b оценивается только при изменении 'a', но в противном случае он просто сохраняет значение, которое было присвоено последним.
провода - это просто соединения, и их нужно постоянно контролировать. Я согласен с тем, что они могут вести себя так же, как упомянул @Morgan, но их можно представить как кусок жесткого провода, значение которого изменяет только значение на другом конце или изменяется источник.
Тип данных логики не допускает использование нескольких драйверов. Последнее присвоение выигрывает в случае множественного присвоения. Тип данных .Reg / Wire дает X, если несколько драйверов пытаются управлять им с другим значением. Тип логических данных просто присваивает последнее значение присваивания.