Неблокирующее выполнение заявлений в Verilog

Я новичок в Verilog, может ли кто-нибудь объяснить мне, как выполняются эти операторы.

always@(posedge clock) begin
A <= B ^ C;
D <= E & F;
G <= H | J;
K <= G ? ~&{A,D} : ^{A,D}
end

Насколько я могу судить, сначала выполняется правая сторона. Следовательно, сначала вычисляются значения для A, D, G, K. При вычислении значения K, в зависимости от значения G, будет выполняться первое или второе выражение. Кто-нибудь может объяснить эту операцию. Пожалуйста, также расскажите, как синтезируется последний оператор, поскольку весь этот код находится внутри блока always и с положительной частотой фронта. Заранее спасибо.


person Naveen Kumar    schedule 13.11.2016    source источник


Ответы (1)


Неблокирующее назначение оценивает выражение RHS в начале временного шага и планирует обновление LHS. , чтобы иметь место в конце временного шага.

В Verilog есть четко определенная очередь событий, как показано ниже. Для каждой и каждой временной метки оцениваются все регионы. Если есть какие-либо события, которые должны быть выполнены в текущей метке времени, они запускаются. После того, как все события текущей отметки времени запущены, перемещается только время моделирования.

Регионы событий

Здесь ПРАВАЯ ВСЕХ выражений оценивается в начале метки времени позиции часов. Следовательно, значения B^C, _2 _, _ 3 _, _ 4_ оцениваются и сохраняются внутри симулятора.

После этого LHS обновляются по мере продвижения моделирования к региону NBA с той же меткой времени.

Значения G,AandDare not updated in active region. Hence, while calculating the value ofK, the previous values ofG,AandDare taken in the Active region. Then, all the veriables;G,A,DandK` обновляются одновременно.

Я создал пример кода для EDAPlayground. Формы сигналов могут быть полезны.

Что касается последнего оператора, я предполагаю, что он создаст флоп с мультиплексором (с Select = G и Inputs as nand(A,D), xor(A,D)) в качестве входа.

person sharvil111    schedule 14.11.2016