реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Синтаксис в Verilog для знаков = и <=
Волощенко
сообщение Feb 16 2006, 09:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Помогите разобраться!
При синтезе на Verilog можно использовать знаки = и <= для операций присвоения.
Когда и какой из них лучше и правильней использовать?
Спасибо за ответ. Сергей.
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 16 2006, 10:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
kyb
сообщение Feb 16 2006, 10:50
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034



Точнее сказать будут отличасться результаты моделирования до синтеза и после.
Если строго следовать рекомендациям стандарта, то при моделировании конструкции
always@ ( posedge clk) begin
Go to the top of the page
 
+Quote Post
kyb
сообщение Feb 16 2006, 11:03
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034



Точнее сказать, будут отличаться результаты моделирования до синтеза и после.
Если строго следовать рекомендациям стандарта, то при моделировании конструкции
always@ ( posedge clk) begin
a = b;
c = a;
end

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

В то же время, моделирование конструкции
always@ (posedge clk) begin
a <= b;
c <= a;
end
ВСЕГДА будет соответствовать последовательности из двух триггеров.

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

Очень подробно о использовании разных типов присваивания можно почитать в http://www.sunburst-design.com/papers/Cumm...G2000SJ_NBA.pdf .
Go to the top of the page
 
+Quote Post
virt1984
сообщение Feb 16 2006, 11:18
Сообщение #5





Группа: Новичок
Сообщений: 1
Регистрация: 8-11-04
Пользователь №: 1 072



Я ведь пример привел. Неужели трудно посмотреть. За счет свойств оператора блокирующего присваивания получился ОДИН 2х разрядный регистр именно после синтеза.. Это две разных схемы. Два разных результата при моделировании.
Go to the top of the page
 
+Quote Post
kyb
сообщение Feb 16 2006, 11:54
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034



Опаньки. С синтезом я погарячился. blush.gif А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 16 2006, 12:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



//А вот моделирование действительно может отличаться, ведь никто не гарантирует в каком порядке будут рассмотрены строки с `=`. В разных моделяторах последовательность отличается.//
Я посмотрел Ваш документ. Очень хороший. Все понятно.
А строки "=" будут рассмотрены по порядку. Манипулируя порядком расположения этих строк, можно манипулировать результатом. За счет СВОЙСТВ этого оператора.
Причем результаты во всех системах будут одинаковы. Это же стандарт.
Go to the top of the page
 
+Quote Post
kyb
сообщение Feb 16 2006, 12:37
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 6-02-06
Пользователь №: 14 034



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

Я в так наелся последствиями использования в описаниях триггеров оператора `=`, что сейчас всех агитирую использовать только `<=` для триггеров, а `=` для комбинационной логики. maniac.gif
Go to the top of the page
 
+Quote Post
sazh
сообщение Feb 16 2006, 13:25
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Мне кажется, Вы неправильно интерпритируете оператор <=
Оператор <= (неблокируещее процедурное присваивание переменной) обладает задержкой присваивания как минимум равной бесконечно малой величине T_DELTA и не блокирует выполнение следующих за ним операторов в одном процессе. Отсюда и желаемое порождение схемы (количество декларируемых регистров соотвествует количеству синтезированных) независимо от следования этих операторов в одном процессе.
Короче, да здравствует оператор <=
Go to the top of the page
 
+Quote Post
Gate
сообщение Feb 16 2006, 13:30
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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/


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Feb 16 2006, 15:09
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Расширенное спасибо за поток ответов!
Приятно удивлен Вашей активностью и уже чувствую себя просветленным, а статья "Nonblocking Assignments in Verilog Synthesis..." и подборка книг по теме - выше всех ожиданий. smile.gif
Go to the top of the page
 
+Quote Post
Camelot
сообщение Feb 16 2006, 15:50
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 17 2006, 05:36
Сообщение #13


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Camelot @ Feb 16 2006, 21:50) *
IMHO оператор "<=" следует интерпретировать не как "блокирующий" а как "блоковый", так как в конечном итоге в цикле always новые значения присваиваются одновременно всему блоку.

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Camelot
сообщение Feb 17 2006, 07:31
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



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


Сорри, действительно не то сказал. Кому интересно, смотрите ниже.
Прикрепленные файлы
Прикрепленный файл  Verilog_assign.pdf ( 60.32 килобайт ) Кол-во скачиваний: 103
 
Go to the top of the page
 
+Quote Post
Yra
сообщение Mar 1 2006, 16:10
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 396
Регистрация: 22-10-04
Из: Воронеж
Пользователь №: 962



В такой конструкции 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 - Mar 1 2006, 16:39


--------------------
всё можно наладить, если достаточно долго вертеть в руках /Законы Мерфи/
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th April 2024 - 18:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01566 секунд с 7
ELECTRONIX ©2004-2016