Voloshchenko 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Помогите разобраться! При синтезе на Verilog можно использовать знаки = и <= для операций присвоения. Когда и какой из них лучше и правильней использовать? Спасибо за ответ. Сергей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба При синтезе регистров лучше <=. Только потому, чтобы ни о чем не думать. При использовании оператора <= от перемены следования строк с этим оператором результат синтеза неизменен. При использовании оператора = от перемены следования строк с этим оператором можете получить различные результаты. (Сначала выполняется оператор первой строки, потом второй и т.д.) Посмотрите в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kyb 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Точнее сказать будут отличасться результаты моделирования до синтеза и после. Если строго следовать рекомендациям стандарта, то при моделировании конструкции always@ ( posedge clk) begin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kyb 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Точнее сказать, будут отличаться результаты моделирования до синтеза и после. Если строго следовать рекомендациям стандарта, то при моделировании конструкции 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 . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virt1984 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Я ведь пример привел. Неужели трудно посмотреть. За счет свойств оператора блокирующего присваивания получился ОДИН 2х разрядный регистр именно после синтеза.. Это две разных схемы. Два разных результата при моделировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kyb 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Опаньки. С синтезом я погарячился. А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба //А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.// Я посмотрел Ваш документ. Очень хороший. Все понятно. А строки "=" будут рассмотрены по порядку. Манипулируя порядком расположения этих строк, можно манипулировать результатом. За счет СВОЙСТВ этого оператора. Причем результаты во всех системах будут одинаковы. Это же стандарт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kyb 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Совершенно верно. Строки будут рассмотрены по порядку и каждое изменение, вызванное присваиванием, породит новое событие для моделирования. И здесь начинается самое интересное: стандат не гарантирует последовательность извлечения событий из очереди моделирования. Поэтому весьма вероятно запаздание сигнала на такт там, где этого совсем не ждали. Отличие присваиваний с оператором => (неблокирующие) заключается в том, что события порожденные этими операциями рассматриваются в последнюю очередь. В итоге, описание соответствует ожидаемой схеме (подробнее см. пункт 5 стандарта). Я в так наелся последствиями использования в описаниях триггеров оператора `=`, что сейчас всех агитирую использовать только `<=` для триггеров, а `=` для комбинационной логики. :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Мне кажется, Вы неправильно интерпритируете оператор <= Оператор <= (неблокируещее процедурное присваивание переменной) обладает задержкой присваивания как минимум равной бесконечно малой величине T_DELTA и не блокирует выполнение следующих за ним операторов в одном процессе. Отсюда и желаемое порождение схемы (количество декларируемых регистров соотвествует количеству синтезированных) независимо от следования этих операторов в одном процессе. Короче, да здравствует оператор <= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Глобальное правило для синтезируемого кода такое: - для комб. логики 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voloshchenko 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Расширенное спасибо за поток ответов! Приятно удивлен Вашей активностью и уже чувствую себя просветленным, а статья "Nonblocking Assignments in Verilog Synthesis..." и подборка книг по теме - выше всех ожиданий. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Camelot 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 40 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку. Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Camelot 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже. Сорри, действительно не то сказал. Кому интересно, смотрите ниже. Verilog_assign.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yra 4 1 марта, 2006 Опубликовано 1 марта, 2006 (изменено) · Жалоба В такой конструкции 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 Я у себя в проекте пока использую первый вариант. Может кто укажет недостатки, если они есть (может в плане совместимости не только с ксайлинксовым компилятором, может в плане размер эквивалентной схемы). Изменено 1 марта, 2006 пользователем Yra Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться