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

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

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

Чем они трое отличаются?


person e19293001    schedule 08.11.2012    source источник


Ответы (5)


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 отражает замысел проекта линии с тремя состояниями.

person Morgan    schedule 08.11.2012
comment
Посмотрите этот другой ответ, чтобы увидеть один случай, когда логику нельзя использовать вместе с проводом. Посмотрите комментарии. - person user4061565; 10.11.2015

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

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

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

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


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

person Brent Bradburn    schedule 30.09.2015
comment
Вторая ссылка в разделе Связанные статьи мертва :( - person cic; 11.01.2018

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

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

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

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

person Paddu    schedule 11.05.2013
comment
Я знаю, что логика содержит 4 значения (0,1, z, x), но был уверен, что возникла проблема с ее использованием для трех состояний. Я не могу найти статью или раздел в LRM, в котором говорится об этом. Думаю, вы правы, логику можно использовать для управления тройным состоянием. - person Morgan; 14.04.2014

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

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

person Vinayak Bhat    schedule 16.08.2017

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

person Prasanjit Bengani    schedule 28.07.2014