Я смущен про рег и провод, когда делаю домашнее задание. Я не мог точно понять различия между регистром и проводником. Не могли бы вы объяснить коротко? Кроме того, мне интересно, что произойдет, когда я использую output q
вместо output reg q
?Когда следует использовать реестр вместо провода?
ответ
В моделирования, A Verilog wire
ведет себя как кусок металла, трек, проволоки, в то врем как Verilog reg
является переменной, то для хранения *.
Различия между ними в симуляции можно проиллюстрировать, показывая, что произойдет, если я назначу их из более чем одного места. Если я назначу wire
из более чем одного места, симуляция будет вести себя точно так же, как если бы я замыкал эти два провода вместе. Таким образом,
wire w;
assign w = 1'b1;
assign w = 1'b0;
initial
$display("w= %b", w);
будет отображать x
. Значение w
будет x
, потому что один assign
управляет 1'b1
, а другой 1'b0
, и таким образом это будет решить до x
. Таким образом, он моделирует поведение реального оборудования, где x
представляет значение неизвестное значение (значение реальной части проводного привода высоко на одном драйвере и низкое на другое действительно неизвестно).
Если я назначаю reg
- переменную - из более чем одного места, у меня будет другое поведение. Вместо , разрешающего до x
, reg
просто возьмет любое значение, назначенное последнему. Так,
reg r;
initial
r = 1'b1;
initial
r = 1'b0;
initial
#1 $display("r= %b", r);
будет отображаться либо 1
или 0
в зависимости от исходного блока выполняется последний (то, что не детерминированный).
Обратите внимание, что reg
приводится в движение от initial
блоков. A reg
должен быть выведен из блока initial
или always
(так называемый процедурный код). Предполагая, что вы пишете Verilog, а не System Verilog, вы не можете назначить reg
из инструкции assign
или из вывода экземпляра созданного модуля. Итак, , если вы хотите назначить что-то из процедурного кода, вы должны использовать reg
; если вы хотите назначить что-либо из инструкции assign
или вывода экземпляра-модуля, он должен быть wire
. И, следовательно, из этого следует, что вы определяете output
как reg
или wire
полностью зависит от того, где вы его назначаете. Если вы назначаете его из блока always
, он должен быть reg
; если вы назначаете его из инструкции assign
или вывода экземпляра модуля, он должен быть wire
.
В этом заключается разница в поведении reg
и wire
в моделировании. Ваш синтезатор будет интерпретировать reg
по-разному. Если вы назначаете reg
из более чем одного блока always
(вы не можете синтезировать блоки initial
), тогда ваш логический синтезатор будет синтезировать два элемента аппаратного обеспечения, управляющих одним и тем же куском металла, дорожки, провода, что угодно - что-то, что вы, вероятно, я хочу.
* Это не означает, что reg
обязательно будет использоваться для хранения (т. Е. Триггера) при синтезе. Независимо от того, «reg» становится триггером или комбинационной логикой, зависит от того, назначен ли он в блоке «последовательный или комбинационный стиль».
Обратите внимание, что 'reg' не хранит память если блок 'always' реализует комбинаторную логику, поэтому всегда присваиваем' reg'. В этом случае 'reg' подобен« проводу »от непрерывного назначения, реализующего одну и ту же функцию. Btw. если это возможно, подумайте об использовании типа «логический» SystemVerilog, поскольку это объединяет «провод» и «рег», поэтому вам не нужно обновлять декларацию в зависимости от реализации. –
выход q эквивалентен выходному проводу q.
рег используется для последовательной логики, такой как флоп. Он также требуется всегда * блоков даже для комбо-блоков. Провод используется для комбинаторной логики.
@Qui Я не могу поверить, что этого вопроса не задавали раньше, но не смог найти такого. Я нашел вопрос, на который вы ссылались, и не думайте, что это дубликат. –
http://stackoverflow.com/questions/29965504/difference-between-wire-and-reg –
http://stackoverflow.com/questions/33459048/what-is-the-difference-between-reg-and-wire -in-a-verilog-module –