Jump to content
    

VERILOG, тест бенч и не только

Для меня если честно совсем не понятны термины "блокирующий/не блокирующий". Был бы Вам признателен, если бы Вы подробней объяснили.

Share this post


Link to post
Share on other sites

Блокирующее присваивание - немедленное присваивание:

a=a+1;

a=a+2;

эта последовательность операторов присваиваний равносильна одному оператору присваивания:

a=a+3;

 

Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание:

a<=a+1;

a<=a+2;

эта последовательность операторов присваиваний равносильна одному оператору присваивания:

a<=a+2;

 

 

Share this post


Link to post
Share on other sites

Угу... Теперь понятно. Спасибо. А то, если честно что то никак допереть не мог. Подскажите ещё. Вот возьмём такую конструкцию в VHDL:

process(clk)
begin 
if clk'event and clk = '1' then
if en = '1' then 
a <= b;
end if;
end if;
end process;

Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте. Если же a- переменная, и выражение переписать как a:=b, то проверка и присвоение произойдёт на одном и том же фронте. А в verilog есть что то подобное?

Share this post


Link to post
Share on other sites

Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание:

a<=a+1;

a<=a+2;

и получим ошибку синтеза типа "Can't resolve multiple constant drivers for net..."

Можно сделать только одно присваивание в блоке.

Share this post


Link to post
Share on other sites

и получим ошибку синтеза типа "Can't resolve multiple constant drivers for net..."

Можно сделать только одно присваивание в блоке.

 

На сколько процентов Вы в этом уверены?

Share this post


Link to post
Share on other sites

Для меня если честно совсем не понятны термины "блокирующий/не блокирующий". Был бы Вам признателен, если бы Вы подробней объяснили.

блокирующее - блокирует выполнение следующих операторов, пока само не выполнится

неблокирующее - не блокирует, выполняются все одновременно, сохраняется результат, который последним в списке записан и вычислился

Share this post


Link to post
Share on other sites

На сколько процентов Вы в этом уверены?

Чтоб спорить дальше, нужен конкретный пример. Так нельзя:

always @(posedge clk) begin

a<=a+1;

a<=a+2;

end

 

Share this post


Link to post
Share on other sites

Чтоб спорить дальше, нужен конкретный пример. Так нельзя:

always @(posedge clk) begin

a<=a+1;

a<=a+2;

end

 

Конкретный пример -- это всегда хорошо.

Повторю свой вопрос касательно Вашего примера -- насколько Вы уверены, что так нельзя?

 

Если Вы уверены, что так нельзя, тогда прошу привести хотя бы одно из двух:

  • Пункт в стандарте, который это запрещает.
  • Пример синтезатора/симулятора (и его версию), который выдает ошибку на таком коде.

Share this post


Link to post
Share on other sites

...Вот возьмём такую конструкцию в VHDL:

process(clk)
begin 
if clk'event and clk = '1' then
if en = '1' then 
a <= b;
end if;
end if;
end process;

Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте. Если же a- переменная, и выражение переписать как a:=b, то проверка и присвоение произойдёт на одном и том же фронте.

...

 

Сильно сомневаюсь (из общих соображений, VHDL только сегодня поверхностно посмотрел).

Вот тут есть варианты триггера с о входом разрешения - на VHDL и на Verilog, и там и там проверка и присваивание в одном такте:

http://www.dsol.ru/stud/book7/chapter6/page6_02.html

 

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

 

 

блокирующее - блокирует выполнение следующих операторов, пока само не выполнится

неблокирующее - не блокирует, выполняются все одновременно, сохраняется результат, который последним в списке записан и вычислился

Это неверно, внутри always-блока абсолютно все операторы выполняются строго последовательно (независимо от типа присваивания и тп).

Поэтому термин "блокирующий" считаю неудачным, лучше "немедленный/отложенный".

Разные always-блоки выполняются параллельно, порядок не определен, отсюда все неоднозначности симуляции (но не синтеза).

 

Share this post


Link to post
Share on other sites

Конкретный пример -- это всегда хорошо.

Повторю свой вопрос касательно Вашего примера -- насколько Вы уверены, что так нельзя?

 

Если Вы уверены, что так нельзя, тогда прошу привести хотя бы одно из двух:

  • Пункт в стандарте, который это запрещает.
  • Пример синтезатора/симулятора (и его версию), который выдает ошибку на таком коде.

Признаю свою ошибку. :cranky:

Всегда считал, что так нельзя делать. Делать можно, только какой в этом смысл?

Share this post


Link to post
Share on other sites

Это неверно, внутри always-блока абсолютно все операторы выполняются строго последовательно (независимо от типа присваивания и тп).

Где же неверно? Вот ваш пример:

Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание:

a<=a+1;

a<=a+2;

эта последовательность операторов присваиваний равносильна одному оператору присваивания:

a<=a+2;

Это строго последовательно? Или все же одновременно? Понятное дело, в компьютере при симуляции операторы не вычисляются параллельно. Но результат их работы представляется, как будто все вычислены параллельно, с исходными данными, что были на входе. А сохраняются результаты, ну пусть будет, последовательно.

Share this post


Link to post
Share on other sites

Признаю свою ошибку. :cranky:

Всегда считал, что так нельзя делать. Делать можно, только какой в этом смысл?

 

Ну, делать 1 в 1 так, как в примере -- не очень много смысла.

 

Но если бы можно было делать только одно присваивание в блоке, то нельзя было бы писать, например, такой код:

always_ff @( posedge clk_i )
  begin
    if( increment )
      acc <= acc + write_size;

    if( decrement )
      acc <= acc - read_size;

    if( increment && decrement )
      acc <= acc + write_size - read_size;
  end

Я не утверждаю, что именно такой код следует использовать :)

Просто как пример.

 

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

Но, думаю, разработчики языка хотели дать нам гибкость и свободу выбора :)

Share this post


Link to post
Share on other sites

Где же неверно? Вот ваш пример:

Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание:

a<=a+1;

a<=a+2;

эта последовательность операторов присваиваний равносильна одному оператору присваивания:

a<=a+2;

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

Пример можно усложнить, перемешав "=" и "<=" (для разных сигналов, для одного не позволит синтезатор):

en = ...;

if(en) a <= a+1;

en = ...;

if(en) a <= a+2;

Это вполне синтезируемо (даже без варнингов), и имеет смысл только при строго последовательном "выполнении" операторов.

 

 

 

Share this post


Link to post
Share on other sites

Но если бы можно было делать только одно присваивание в блоке, то нельзя было бы писать, например, такой код:

always_ff @( posedge clk_i )
  begin
    if( increment )
      acc <= acc + write_size;

    if( decrement )
      acc <= acc - read_size;

    if( increment && decrement )
      acc <= acc + write_size - read_size;
  end

Я не утверждаю, что именно такой код следует использовать :)

Просто как пример.

Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами...

 

 

Share this post


Link to post
Share on other sites

Приветствую!

 

Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами...

Сами мы не догадались :cranky: - объясните почему и каким образом тут получится latch да еще и под always_ff ?

 

Удачи! Rob

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...