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

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

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

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


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

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

a=a+1;

a=a+2;

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

a=a+3;

 

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

a<=a+1;

a<=a+2;

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

a<=a+2;

 

 

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


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

Угу... Теперь понятно. Спасибо. А то, если честно что то никак допереть не мог. Подскажите ещё. Вот возьмём такую конструкцию в 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 есть что то подобное?

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


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

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

a<=a+1;

a<=a+2;

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

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

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


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

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

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

 

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

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


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

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

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

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

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


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

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

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

always @(posedge clk) begin

a<=a+1;

a<=a+2;

end

 

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


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

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

always @(posedge clk) begin

a<=a+1;

a<=a+2;

end

 

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

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

 

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

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

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


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

...Вот возьмём такую конструкцию в 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-блоки выполняются параллельно, порядок не определен, отсюда все неоднозначности симуляции (но не синтеза).

 

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


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

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

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

 

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

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

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

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

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


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

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

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

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

a<=a+1;

a<=a+2;

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

a<=a+2;

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

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


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

Признаю свою ошибку. :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.

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

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


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

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

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

a<=a+1;

a<=a+2;

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

a<=a+2;

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

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

en = ...;

if(en) a <= a+1;

en = ...;

if(en) a <= a+2;

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

 

 

 

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


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

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

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

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

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

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

 

 

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


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

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

 

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

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

 

Удачи! Rob

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


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

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

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

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

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

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

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

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

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

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