2014-11-04 5 views
3

Что делает <= в verilog.<= Оператор присваивания в Verilog

Например

always @(posedge Clock) begin 
    if (Clear) begin 
     BCD1 < = 0; 
     BCD0 < = 0; 
    end 
end 
+0

Может кто-нибудь объяснить, почему они отказались от этого? – Ben

+0

Пожалуйста, проверьте, http://stackoverflow.com/questions/4653284/how-to-interpret-blocking-vs-non-blocking-assignments-in-verilog – Jithin

ответ

13

«< =» в Verilog называется неблокирующим присваиванием, которое приносит большую разницу, чем «=», которое называется блокировкой назначения из-за планирования событий в любых симуляторах на основе поставщиков.

Рекомендуется использовать неблокирующее назначение для последовательной логики и назначения блокировки для комбинационной логики, только тогда он обнаруживает правильную аппаратную логику во время синтеза.

Неблокирующие операторы в последовательном блоке будут вызывать флип-флоп в реальном оборудовании.

Всегда помните, что не смешивайте блокировку и неблокирование в любом последовательном или комбинационном блоке.

В ходе процесса планирования тренажера:

Есть четыре области и порядок выполнения команд следующего

1) Active region 
    --Blocking assignments 
    --Evaluation of RHS of non-blocking assignments(NBA) 
    --Continuous assignment 
    --$display command 
    --Evaluate input and output of primitives 
2) Inactive region 
    --#0 blocking assignments 
3) NBA(non-blocking assignment update) 
    --update LHS of non-blocking assignments (NBA) 
4) Postponed 
    --$monitor command 
    --$strobe command 

Использования блокировки задания «=» для двух переменных одновременно слот вызывает гонки состояние

например: Verilog код с гонки условия,

always @(posedge Clock) 
    BCD0 = 0; // Usage of blocking statements should be avoided 
always @(posedge Clock) 
    BCD1 = BCD0; 

Для того, чтобы избежать гонок условия использования нелипкого заявления «< =»

например:

always @(posedge Clock) 
     BCD0 <= 0; // Recommended to use NBA 
    always @(posedge Clock) 
     BCD1 <= BCD0; 

Когда этот блок выполняются, будет два события, добавленным в очередь обновления блокировки ASSIGN, не. Следовательно, это приводит к обновлению BCD1 от BCD0 в конце шага времени.

Использование неблокирующего назначения «< =» в операции непрерывного присваивания не допускается в соответствии с Verilog LRM и приведет к ошибке компиляции.

например:

assign BCD0 <= BCD1; //Results in compilation error 

Только использовать NBA в процедурных операторов присваивания,

- initial and 
- always blocks 
3

Это называется 'неблокирующей' назначение. Неблокирующее назначение позволяет дизайнерам описывать обновление состояния машины без необходимости объявления и использования переменных временного хранения.

Например, в этом коде, когда вы используете неблокирующее назначение, его действие не будет зарегистрировано до следующего тактового цикла. Это означает, что порядок присвоений не имеет значения и даст тот же результат.

Другой оператор присваивания, '=', называется назначением блокировки. Когда используется '=' назначение, для целей логики целевая переменная немедленно обновляется.

понять это более глубоко, пожалуйста, посмотрите на этот пример (из Википедии):

module toplevel(clock,reset); 
    input clock; 
    input reset; 

    reg flop1; 
    reg flop2; 

    always @ (posedge reset or posedge clock) 
     if (reset) 
     begin 
      flop1 <= 0; 
      flop2 <= 1; 
     end 
     else 
     begin 
      flop1 <= flop2; 
      flop2 <= flop1; 
     end 
endmodule 

В этом примере, flop1 <= flop2 и flop2 <= flop1 бы поменять местами значения этих двух reg с. Но если мы использовали назначение блокировки, =, этого не произошло бы, и поведение было бы неправильным.

-1

** Ваш вопрос downvoted, потому что это то, что вы можете легко найти в основной Verilog раздаточный материал или книгу , Не очень полезно для вас или других, чтобы вас попросили на форуме вроде этого.

Как было сказано выше, это назначение «Non Blocking < =», широко используемое для последовательного логического дизайна, поскольку оно может лучше всего имитировать его. Вот почему: В основном, с задержкой (здесь часы с позером) это что-то вроде этого, планирование оценки RHS на LHS после указанной задержки и переход к следующему оператору (эмулирующему последовательный) в потоке в отличие от «Блокировка = который фактически задерживает выполнение следующего оператора в соответствии с указанной задержкой (эмуляция комбинационного)

+0

Как стандартная практика в стеке, перед тем, как сбрасывать, вам нужно объяснить причина. Мой ответ абсолютно верный, он просто упоминается предельно точно и на моем собственном языке. –

1

«< =» - это неблокирующий оператор присваивания в verilog. «=» является оператором присваивания блокировки.

Рассмотрим следующий код ..

[email protected](clk) 
begin 
a=b; 
end 

[email protected](clk) 
begin 
b=a; 
end 

Значения а и Ь происходит обмен с использованием двух различных блоков всегда .. Использование «=» здесь вызвало гонки вокруг состояния. то есть. одновременно изменяются переменные a и b. Использование «< =» позволит избежать гонки.

[email protected](clk) 
begin 
a<=b; 
end 

[email protected](clk) 
begin 
b<=a; 
end 

Надежда я помог тоже ..

0

<= не является назначение блокировки. Операторы <= выполняются параллельно. Подумайте о конвейерной архитектуре, где мы сталкиваемся с использованием таких назначений.

Небольшой exammple:

// инициализирует а, б, в 1, 2 и 3 соответственно. initial begin a <= 1 b <= 2 c <= 3 end

[email protected](clock.posedge) begin a <= b b <= c c <= a end

После первого posedge часы: a = 2, b = 3, c = 1

После второй posedge часы: a = 3, b = 1, c = 2

После третьего часы posedge: a = 1, b = 2, c = 3

1

Поскольку люди уже объяснил ситуацию блокировки/блокировки, я просто добавлю это здесь, чтобы помочь с пониманием. "< =" заменяет слово "получает", как вы читаете код

Например:

.... // Verilog код здесь

< = B // прочитать его как A получает B

Когда A получает B? В данном временном интервале подумайте обо всем, что происходит в аппаратных средствах во временных слотах, например, в конкретном выборочном событии, управляемом часами. Если оператор «< =» используется в модуле с часами, которые работают каждые 5 нс, представьте, что A получает B в конце этого временного интервала, после того, как все остальные «блокирующие» назначения разрешены и в то же время, что и другие неблокирующие задания.

Я знаю, что он запутан, он становится лучше, когда вы используете и испортите кучу конструкций и узнаете, как это работает.

Смежные вопросы