|
Синтаксис в Verilog для знаков = и <= |
|
|
|
Feb 16 2006, 10:18
|
Гуру
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804
|
При синтезе регистров лучше <=. Только потому, чтобы ни о чем не думать. При использовании оператора <= от перемены следования строк с этим оператором результат синтеза неизменен. При использовании оператора = от перемены следования строк с этим оператором можете получить различные результаты. (Сначала выполняется оператор первой строки, потом второй и т.д.) Посмотрите в 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
|
|
|
|
|
Feb 16 2006, 10:50
|
Участник
Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034
|
Точнее сказать будут отличасться результаты моделирования до синтеза и после. Если строго следовать рекомендациям стандарта, то при моделировании конструкции always@ ( posedge clk) begin
|
|
|
|
|
Feb 16 2006, 11:03
|
Участник
Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034
|
Точнее сказать, будут отличаться результаты моделирования до синтеза и после. Если строго следовать рекомендациям стандарта, то при моделировании конструкции 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 .
|
|
|
|
|
Feb 16 2006, 11:18
|
Группа: Новичок
Сообщений: 1
Регистрация: 8-11-04
Пользователь №: 1 072
|
Я ведь пример привел. Неужели трудно посмотреть. За счет свойств оператора блокирующего присваивания получился ОДИН 2х разрядный регистр именно после синтеза.. Это две разных схемы. Два разных результата при моделировании.
|
|
|
|
|
Feb 16 2006, 11:54
|
Участник
Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034
|
Опаньки. С синтезом я погарячился. А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.
|
|
|
|
|
Feb 16 2006, 12:37
|
Участник
Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034
|
Совершенно верно. Строки будут рассмотрены по порядку и каждое изменение, вызванное присваиванием, породит новое событие для моделирования. И здесь начинается самое интересное: стандат не гарантирует последовательность извлечения событий из очереди моделирования. Поэтому весьма вероятно запаздание сигнала на такт там, где этого совсем не ждали. Отличие присваиваний с оператором => (неблокирующие) заключается в том, что события порожденные этими операциями рассматриваются в последнюю очередь. В итоге, описание соответствует ожидаемой схеме (подробнее см. пункт 5 стандарта). Я в так наелся последствиями использования в описаниях триггеров оператора `=`, что сейчас всех агитирую использовать только `<=` для триггеров, а `=` для комбинационной логики.
|
|
|
|
|
Feb 16 2006, 13:30
|
Знающий
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943
|
Глобальное правило для синтезируемого кода такое: - для комб. логики 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/
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
Feb 17 2006, 05:36
|
Adept
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343
|
Цитата(Camelot @ Feb 16 2006, 21:50) IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку. Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 17 2006, 07:31
|
Частый гость
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872
|
Цитата Во-первых, "<=" - это оператор неблокирующего присваивания. Во-вторых, блокирующий/неблокирующий - именно так правильно. И речь идет не о блоке (который, вообще-то, хоть и называется блоком, по сути является составным оператором выражения always или initial), а блокировании или не блокировании последующих выражений. Т.е. оператор "=" является блокирующим - и он блокирует все нижележащие операторы данного always/initial до тех пор, пока не будет выполнен сам. А "<=" является неблокирующим, потому что не блокирует все остальные операторы. Заметьте, речь идет не только об операторах присваивания, но и обо всех остальных операторах тоже. Сорри, действительно не то сказал. Кому интересно, смотрите ниже.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|