В чем разница между регистром и проводкой? Когда мы должны использовать reg, и когда мы должны использовать провод в модуле verilog. Я также иногда заметил, что результат снова объявляется рег. Например, reg Q в D-flip-flop. Я читал это где-то - "Целевой вывод операторов процедурного присваивания должен быть типа данных reg". Что такое инструкции процедурного присваивания? Я натолкнулся на это, но не смог найти ясного объяснения.
В чем разница между регистром и проводником в модуле verilog
Ответ 1
Провод:-
Провода используются для соединения различных элементов. Они могут рассматриваться как физические провода. Они могут быть прочитаны или назначены. В них не хранятся значения. Они должны управляться либо оператором непрерывного присваивания, либо портом модуля.
Reg: -
В отличие от их имени, регистры не обязательно соответствуют физическим регистрам. Они представляют элементы хранения данных в Verilog/SystemVerilog. Они сохраняют свое значение до тех пор, пока им не будет присвоено следующее значение (не через оператор присваивания). Они могут быть синтезированы в FF, защелку или комбинаторную схему. (Они не могут быть синтезируемыми !!!)
Провода и Regs присутствуют от периода Verilog. SystemVerilog добавил к ним новый тип данных, называемый логикой. Поэтому следующий вопрос - что это за логический тип данных и чем он отличается от нашего старого доброго провода/рег.
Логика: -
Как мы уже видели, тип данных reg немного ошибочен в Verilog. Добавление логического типа данных SystemVerilog заключается в устранении вышеуказанной путаницы. Идея заключается в том, чтобы иметь новый тип данных, называемый логикой, который, по крайней мере, не создает впечатление, что он является аппаратно синтезируемым. Тип данных логики не позволяет использовать несколько драйверов. Последнее присвоение выигрывает в случае нескольких назначений (что подразумевает отсутствие аппаратной эквивалентности). Типы данных Reg/Wire дают X, если несколько драйверов пытаются управлять ими с разными значениями. Тип данных логики просто присваивает последнее значение присваивания. Следующее отличие между reg/wire и логикой заключается в том, что логикой можно управлять как блоком назначения, выходом порта, так и внутри процедурного блока, подобного этому
logic a; assign a = b ^ c; // wire style always (c or d) a = c + d; // reg style MyModule module(.out(a), .in(xyz)); // wire style
Ответ 2
Процедурные блоки ссылаются на always
, always_ff
, always_comb
, always_latch
, initial
и т.д. Блоки. В то время как инструкции процедурного присваивания относятся к присвоению значений регистру, целому числу и т.д., Но не к проводам (сетям).
wire
элементы должны постоянно управляться чем-то и не могут сохранять значение. В дальнейшем им присваиваются значения с использованием операторов контировки.
reg
может использоваться для создания регистров в процедурных блоках. Таким образом, он может хранить некоторую ценность.
reg
могут использоваться как выходные данные в декларации фактического модуля. Но элементы reg
не могут быть подключены к выходному порту экземпляра модуля.
Таким образом, рег может вести провод как RHS оператора assign
. С другой стороны, провод может управлять регистром как RHS процедурного блока.
Чтобы получить четкое представление об объявлении reg
или wire
, см. Изображение ниже:
Таким образом, всякий раз, когда выводя последовательную логику, в которой хранится/хранится некоторое значение, объявляйте, что переменная/порт как reg
. Здесь Q
является reg
внутри модуля, но при создании этого модуля внутри некоторого другого модуля этот порт должен быть подключен к wire
.
Помните, что wire
может вывести только комбинационную логику, тогда как reg
может вывести либо комбинационную, либо последовательную логику.
Блог Dave - хороший источник для подробной информации. Для получения дополнительной информации см. Синтез разницы и ссылки Verilog wire-reg.
Ответ 3
Простая разница между регистром и проводником, рег используется в комбинационной или последовательной цепи в verilog, а провод используется в комбинационной схеме
reg используется для хранения значения, но провод постоянно управляется некоторыми вещами, и провод подключается к outport при инициализации модуля, но reg не подключен
Ответ 4
Как заявлено здесь:
Наиболее часто используется сеть является провод, так что позволяет использовать его, чтобы понять сеть лучше.
Подумайте о проводе от вашего дома, это что-то, что соединяет два электрических компонента. Правильно? Теперь скажите мне, что произойдет, если я сломаю провод? Соединение будет потеряно (путь с высоким импедансом 'bz). Это именно то, как сеть синтезируется в аппаратном обеспечении - соединение между двумя воротами, позволяющее непрерывное назначение. Сети не могут не сохранить значение (за исключением трирега, который может иметь емкостное состояние, когда при разрыве соединения оно застрянет на последнем присвоенном значении)
Посмотрите этот простой код Verilog, используя провод (сеть):
module net_example (
input wire a,
input wire b
);
wire net;
assign net = a ? 1'b1 : (b ? 1'b0 : 1'bx);
endmodule
Итак, я надеюсь, что это было легко понять, сети. Давайте посмотрим на рег сейчас. Позвольте мне начать с того, что объявление чего-либо с типом reg не всегда означает, что оно будет синтезировано как регистр (элемент хранения). Цитируя из того, что Verilog LRM (2005) раздел 4.7 говорит о рег,
Поскольку регистр содержит значение между присваиваниями, его можно использовать для моделирования аппаратных регистров. Чувствительные к краям (т.е. Триггеры) и чувствительные к уровню (т.е. Сбрасываемые и прозрачные защелки) элементы памяти могут быть смоделированы. Reg не обязательно должен представлять аппаратный элемент хранения, потому что он также может использоваться для представления комбинаторной логики.
Сосредоточьтесь на слове "можно" в вышеупомянутом тексте. В отличие от net, reg способен хранить значение, что делает его пригодным для хранения значений. И именно поэтому он "может" использоваться как элемент хранения. Давайте углубимся в некоторый код Verilog.
Verilog-код с использованием reg для создания элемента хранения:
module net_reg (
input wire a,
input wire b
);
reg register;
always @(*) begin
if (a) register = 1'b1;
else if (b) register = 1'b0;
end
endmodule
Так как я не кодировал, каким должно быть значение регистра, когда a == 0 и b == 0, поэтому регистр содержит предыдущее значение (см. Красную линию, которую я сделал для отображения обратной связи), делая его элементом памяти.
Если я просто добавлю строку, чтобы указать значение по умолчанию для регистрации в вышеупомянутом коде, я предоставил значение для регистрации всех комбинаций a и b. Следовательно, нет необходимости держать какое-либо значение. Таким образом, хотя я объявил регистр как reg, он будет синтезирован как провод, а не как элемент хранения.
module net_reg (
input wire a,
input wire b
);
reg register;
always @(*) begin
register = 1'b0;
if (a) register = 1'b1;
else if (b) register = 1'b0;
end
endmodule
Синтезированное оборудование: Итак, основной вывод здесь заключается в том, что регистр не всегда синтезируется как элемент хранения.