Перейти к содержанию
    

Синтаксис в Verilog для знаков = и <=

Помогите разобраться!

При синтезе на Verilog можно использовать знаки = и <= для операций присвоения.

Когда и какой из них лучше и правильней использовать?

Спасибо за ответ. Сергей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При синтезе регистров лучше <=. Только потому, чтобы ни о чем не думать.

При использовании оператора <= от перемены следования строк с этим оператором результат синтеза неизменен.

При использовании оператора = от перемены следования строк с этим оператором можете получить различные результаты. (Сначала выполняется оператор первой строки, потом второй и т.д.)

Посмотрите в RTL просмотрщике:

 

module operator

(

input clk,

input [1:0] a,

input [1:0] aa,

input [1:0] b,

input [1:0] bb,

input [1:0] c,

input [1:0] cc,

output reg [1:0] out_b,

output reg [1:0] out_bb

);

 

reg [1:0] out_a;

reg [1:0] out_aa;

 

always @(posedge clk)

begin

out_a = a & b;

out_b = out_a & c;

end

 

always @(posedge clk)

begin

out_aa <= aa & bb;

out_bb <= out_aa & cc;

end

 

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точнее сказать будут отличасться результаты моделирования до синтеза и после.

Если строго следовать рекомендациям стандарта, то при моделировании конструкции

always@ ( posedge clk) begin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точнее сказать, будут отличаться результаты моделирования до синтеза и после.

Если строго следовать рекомендациям стандарта, то при моделировании конструкции

always@ ( posedge clk) begin

a = b;

c = a;

end

 

для некоторых моделяторов эта конструкция будет соответствовать двум последовательным

триггерам, а в некоторых не будет.

 

В то же время, моделирование конструкции

always@ (posedge clk) begin

a <= b;

c <= a;

end

ВСЕГДА будет соответствовать последовательности из двух триггеров.

 

Синтез обоих этих конструкции всегда дает последовательности из двух триггеров.

Отсюда и рекомендация для описания триггеров использовать <=.

Кроме этого, по опыту, удобнее комбинационную часть и часть сохранения (триггер) разделять по разным процессам, но это, скорее, дело вкуса. ;)

 

Очень подробно о использовании разных типов присваивания можно почитать в http://www.sunburst-design.com/papers/Cumm...G2000SJ_NBA.pdf .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ведь пример привел. Неужели трудно посмотреть. За счет свойств оператора блокирующего присваивания получился ОДИН 2х разрядный регистр именно после синтеза.. Это две разных схемы. Два разных результата при моделировании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опаньки. С синтезом я погарячился. :blush: А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.//

Я посмотрел Ваш документ. Очень хороший. Все понятно.

А строки "=" будут рассмотрены по порядку. Манипулируя порядком расположения этих строк, можно манипулировать результатом. За счет СВОЙСТВ этого оператора.

Причем результаты во всех системах будут одинаковы. Это же стандарт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совершенно верно. Строки будут рассмотрены по порядку и каждое изменение, вызванное присваиванием, породит новое событие для моделирования.

И здесь начинается самое интересное: стандат не гарантирует последовательность извлечения событий из очереди моделирования. Поэтому весьма вероятно запаздание сигнала на такт там, где этого совсем не ждали.

Отличие присваиваний с оператором => (неблокирующие) заключается в том, что события порожденные этими операциями рассматриваются в последнюю очередь. В итоге, описание соответствует ожидаемой схеме

(подробнее см. пункт 5 стандарта).

 

Я в так наелся последствиями использования в описаниях триггеров оператора `=`, что сейчас всех агитирую использовать только `<=` для триггеров, а `=` для комбинационной логики. :maniac:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, Вы неправильно интерпритируете оператор <=

Оператор <= (неблокируещее процедурное присваивание переменной) обладает задержкой присваивания как минимум равной бесконечно малой величине T_DELTA и не блокирует выполнение следующих за ним операторов в одном процессе. Отсюда и желаемое порождение схемы (количество декларируемых регистров соотвествует количеству синтезированных) независимо от следования этих операторов в одном процессе.

Короче, да здравствует оператор <=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глобальное правило для синтезируемого кода такое:

- для комб. логики always @(a or b or c ...) k=a - только блокируемое присвоение

- для always @(posedge clk) k<=a - только неблокируемое.

Почему так - описано в куче книг по синтезу.

 

Рекомендую заглянуть сюда http://electronix.ru/forum/index.php?showtopic=12745&hl=

особенно вот это по теме:

30. Advanced Verilog Techniques Workshop.Presentation (Cummings-2001) - 6.5 Mb

Также много полезного на http://www.sunburst-design.com/papers/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расширенное спасибо за поток ответов!

Приятно удивлен Вашей активностью и уже чувствую себя просветленным, а статья "Nonblocking Assignments in Verilog Synthesis..." и подборка книг по теме - выше всех ожиданий. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку.

Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже.

 

Сорри, действительно не то сказал. Кому интересно, смотрите ниже.

Verilog_assign.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В такой конструкции Divider12 принимает значения от 0 до 11 включительно

always @(posedge FastCLK)

if (Reset)

Divider12 = #1 4'b0;

else

begin

Divider12 = #1 Divider12 + 1;

if (Divider12 > 11)

Divider12 = #1 4'b0;

end

 

 

В такой конструкции от 0 до 12 включительно...

always @(posedge FastCLK)

if (Reset)

Divider12 <= #1 4'b0;

else

begin

Divider12 <= #1 Divider12 + 1;

if (Divider12 > 11)

Divider12 <= #1 4'b0;

end

 

 

 

Я у себя в проекте пока использую первый вариант. Может кто укажет недостатки, если они есть (может в плане совместимости не только с ксайлинксовым компилятором, может в плане размер эквивалентной схемы).

Изменено пользователем Yra

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...