2016-04-10 7 views
0

Я смущен про рег и провод, когда делаю домашнее задание. Я не мог точно понять различия между регистром и проводником. Не могли бы вы объяснить коротко? Кроме того, мне интересно, что произойдет, когда я использую output q вместо output reg q?Когда следует использовать реестр вместо провода?

+0

@Qui Я не могу поверить, что этого вопроса не задавали раньше, но не смог найти такого. Я нашел вопрос, на который вы ссылались, и не думайте, что это дубликат. –

+1

http://stackoverflow.com/questions/29965504/difference-between-wire-and-reg –

+1

http://stackoverflow.com/questions/33459048/what-is-the-difference-between-reg-and-wire -in-a-verilog-module –

ответ

2

В моделирования, 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» становится триггером или комбинационной логикой, зависит от того, назначен ли он в блоке «последовательный или комбинационный стиль».

+1

Обратите внимание, что 'reg' не хранит память если блок 'always' реализует комбинаторную логику, поэтому всегда присваиваем' reg'. В этом случае 'reg' подобен« проводу »от непрерывного назначения, реализующего одну и ту же функцию. Btw. если это возможно, подумайте об использовании типа «логический» SystemVerilog, поскольку это объединяет «провод» и «рег», поэтому вам не нужно обновлять декларацию в зависимости от реализации. –

0

выход q эквивалентен выходному проводу q.

рег используется для последовательной логики, такой как флоп. Он также требуется всегда * блоков даже для комбо-блоков. Провод используется для комбинаторной логики.