Грендайзер 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Для меня если честно совсем не понятны термины "блокирующий/не блокирующий". Был бы Вам признателен, если бы Вы подробней объяснили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Блокирующее присваивание - немедленное присваивание: a=a+1; a=a+2; эта последовательность операторов присваиваний равносильна одному оператору присваивания: a=a+3; Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание: a<=a+1; a<=a+2; эта последовательность операторов присваиваний равносильна одному оператору присваивания: a<=a+2; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Угу... Теперь понятно. Спасибо. А то, если честно что то никак допереть не мог. Подскажите ещё. Вот возьмём такую конструкцию в 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 есть что то подобное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание: a<=a+1; a<=a+2; и получим ошибку синтеза типа "Can't resolve multiple constant drivers for net..." Можно сделать только одно присваивание в блоке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба и получим ошибку синтеза типа "Can't resolve multiple constant drivers for net..." Можно сделать только одно присваивание в блоке. На сколько процентов Вы в этом уверены? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Для меня если честно совсем не понятны термины "блокирующий/не блокирующий". Был бы Вам признателен, если бы Вы подробней объяснили. блокирующее - блокирует выполнение следующих операторов, пока само не выполнится неблокирующее - не блокирует, выполняются все одновременно, сохраняется результат, который последним в списке записан и вычислился Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба На сколько процентов Вы в этом уверены? Чтоб спорить дальше, нужен конкретный пример. Так нельзя: always @(posedge clk) begin a<=a+1; a<=a+2; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Чтоб спорить дальше, нужен конкретный пример. Так нельзя: always @(posedge clk) begin a<=a+1; a<=a+2; end Конкретный пример -- это всегда хорошо. Повторю свой вопрос касательно Вашего примера -- насколько Вы уверены, что так нельзя? Если Вы уверены, что так нельзя, тогда прошу привести хотя бы одно из двух: Пункт в стандарте, который это запрещает. Пример синтезатора/симулятора (и его версию), который выдает ошибку на таком коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба ...Вот возьмём такую конструкцию в 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-блоки выполняются параллельно, порядок не определен, отсюда все неоднозначности симуляции (но не синтеза). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Конкретный пример -- это всегда хорошо. Повторю свой вопрос касательно Вашего примера -- насколько Вы уверены, что так нельзя? Если Вы уверены, что так нельзя, тогда прошу привести хотя бы одно из двух: Пункт в стандарте, который это запрещает. Пример синтезатора/симулятора (и его версию), который выдает ошибку на таком коде. Признаю свою ошибку. :cranky: Всегда считал, что так нельзя делать. Делать можно, только какой в этом смысл? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Это неверно, внутри always-блока абсолютно все операторы выполняются строго последовательно (независимо от типа присваивания и тп). Где же неверно? Вот ваш пример: Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание: a<=a+1; a<=a+2; эта последовательность операторов присваиваний равносильна одному оператору присваивания: a<=a+2; Это строго последовательно? Или все же одновременно? Понятное дело, в компьютере при симуляции операторы не вычисляются параллельно. Но результат их работы представляется, как будто все вычислены параллельно, с исходными данными, что были на входе. А сохраняются результаты, ну пусть будет, последовательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Признаю свою ошибку. :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. Но, думаю, разработчики языка хотели дать нам гибкость и свободу выбора :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 27 ноября, 2016 Опубликовано 27 ноября, 2016 · Жалоба Где же неверно? Вот ваш пример: Неблокирующее присваивание - отложенное (до прохождения всего always-блока) присваивание: a<=a+1; a<=a+2; эта последовательность операторов присваиваний равносильна одному оператору присваивания: a<=a+2; Это строго последовательно? Или все же одновременно? Понятное дело, в компьютере при симуляции операторы не вычисляются параллельно. Но результат их работы представляется, как будто все вычислены параллельно, с исходными данными, что были на входе. Пример можно усложнить, перемешав "=" и "<=" (для разных сигналов, для одного не позволит синтезатор): en = ...; if(en) a <= a+1; en = ...; if(en) a <= a+2; Это вполне синтезируемо (даже без варнингов), и имеет смысл только при строго последовательном "выполнении" операторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба Но если бы можно было делать только одно присваивание в блоке, то нельзя было бы писать, например, такой код: 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 Я не утверждаю, что именно такой код следует использовать :) Просто как пример. Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба Приветствую! Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами... Сами мы не догадались :cranky: - объясните почему и каким образом тут получится latch да еще и под always_ff ? Удачи! Rob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться