DuHast 0 21 ноября, 2015 Опубликовано 21 ноября, 2015 · Жалоба Всем привет. Работаю с VHDL довольно давно, но тут, от нечего делать, решил поиграться с Verilog и вод что получилось: always @(posedge Clk) begin cnt=cnt+1; // cnt<=cnt+1; end always @(posedge Clk) begin del<=cnt; end Здесь cnt - счетчик, del - он же, но задержанный на такт. Quartus синтезирует всё, как и было задумано, не зависимо от того, какое присваивание происходит в третьей строке. А вот при симуляции в ModelSim при блокируемом присваивании, задержка не происходит. Как если бы оба присваивания находились в одном always. Почему Quartus и ModelSim ведут себя по разному и как избежать подобных расхождений в дальнейшем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 21 ноября, 2015 Опубликовано 21 ноября, 2015 · Жалоба А вот при симуляции ... Просимулируйте со $strobe, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2015 Опубликовано 21 ноября, 2015 · Жалоба Интересная штука, проделал то же в Vivado - разницы нет. Похоже, вот обсуждение Вашего вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 21 ноября, 2015 Опубликовано 21 ноября, 2015 · Жалоба Просимулируйте со $strobe, задержки нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 21 ноября, 2015 Опубликовано 21 ноября, 2015 · Жалоба В Icarus Verilog чередуются строки с задержкой и без (тк в нем чередуется выполнение кода - сверху вниз и снизу вверх). В этом плане он лучше других симуляторов, но в нем нет поддержки многих синтезируемых конструкции SV. :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Для успешного ситнтеза с Verilog нужно принять некоторый свод не всегда логичных соглашений. Одно из них: комбинаторный процесс - только блокирующее присваивание тактируемый процесс - только неблокирующее присваивание reg [cnt_wid-1:0] cnt, cnt_r, del_r; always @( * ) begin cnt=cnt_r+1; end always @(posedge Clk) begin cnt_r<=cnt; del_r<=cnt_r; end Попытки найти этой необходимости логичное объяснение наталкиваются на гипотетический диалог c разработчиками стандарта (Cadence): - Why? - Because f*ck you that's why! решил поиграться.. и вот что получилось.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба комбинаторный процесс - только блокирующее присваивание тактируемый процесс - только неблокирующее присваивание Две переменных на один счетчик? Жуть. Комбинаторные процессы вообще считаю чем-то искусственным. Хотя... нашёл в этом рациональное зерно и сформулировал для себя следующие правила, которые буду тестировать на практике: 1) не использовать блокирующее присвоение, если это возможно. 2) Если к переменной применяется блокирующее присваивание, то значение этой переменной передаётся во вне процесса через другую переменную с неблокирующим присваиванием.(так в VHDL variable не видны вне процесса и выполнение этого пункта происходит автоматически) Тогда код будет выглядеть так(предполагается, что соблюдение первого пункта правил невозможно): always @( posedge Clk) begin cnt=cnt_r+1; cnt_r<=cnt; end always @(posedge Clk) begin del<=cnt_r; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Дело же не в счетчике, дело в принципе. Есть общепринятый способ описания машины состояний: т.н. "2-process FSM". // Описываем функционал FSM always @( * ) begin state_new = F( fsm_inputs, state ); end always @( posedge clk ) begin state <= state_new; end // Формируем выходные сигналы always @( * ) begin output_fsm_moore = G( state ); output_fsm_mealy = H( state_new, state ); end Такое описание обладает хорошей видимостью: его легко контролировать и вносить в него изменения при необходимости. Этот способ одинаково пригоден как при Verilog-, так и при VHDL-описании. Счетчик можно рассматривать, как частный случай FSM. Любые методы, правила и убеждения хороши, если они приводят к желаемому результату. Но, как мне кажется, лучше сосредоточиться на функционале описываемого узла, а не на экспериментах с особенностями языка описания. Две переменных на один счетчик? Комбинаторные процессы вообще считаю чем-то искусственным. нашёл в этом рациональное зерно и сформулировал для себя следующие правила, которые буду тестировать на практике: 1) не использовать блокирующее присвоение, если это возможно. 2) Если к переменной применяется блокирующее присваивание, то значение этой переменной передаётся во вне процесса через другую переменную с неблокирующим присваиванием.(так в VHDL variable не видны вне процесса и выполнение этого пункта происходит автоматически) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Есть общепринятый способ описания машины состояний: т.н. "2-process FSM". Но любые методы и правила хороши, если они приводят к результату. Результат результатом, но велосипед изобретать тоже не хочется. Буду делать соответствующие выводы. Всем спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Любые методы, правила и убеждения хороши, если они приводят к желаемому результату. Но, как мне кажется, лучше сосредоточиться на функционале описываемого узла, а не на экспериментах с особенностями языка описания. :bb-offtopic: Приделать к Си 2 новых типа, "bit" и "reg", и можно писать дизайн на Си. Без разных типов присваиваний, "always", и прочих надуманных штучек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба какова конечная цель? - писать однозначно синтезируемый RTL ? или - искать проблемы на свою пятую точку? ваши "эксперименты" могут вести к любому из этих двух результатов. Вопрос лишь в том, к какой из вышеназванных целей вы хотите прийти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 (изменено) · Жалоба какова конечная цель? Если ко мне вопрос, то - "писать однозначно синтезируемый RTL". Цель вполне достигнута, уже больше года пишу на "Си". На основе опыта и утверждаю, что "можно писать дизайн ... Без разных типов присваиваний, "always", и прочих надуманных штучек." Изменено 22 ноября, 2015 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Если ко мне вопрос, то - "писать однозначно синтезируемый RTL". Цель вполне достигнута, уже больше года пишу на "Си". На основе опыта и утверждаю, что "можно писать дизайн ... Без разных типов присваиваний, "always", и прочих надуманных штучек." Сжечь еретика. :maniac: А если серьезно, то можете привести пример на каких частотах, в каких кристаллах и какой функционал Ваших проектов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба можете привести пример на каких частотах, в каких кристаллах и какой функционал Ваших проектов. http://marsohod.org/forum/razdel-predlozhe...intez-proshivki http://marsohod.org/forum/proekty-polzovat...ilog-bez-always Еще стробирующий осциллограф с 1Гвыб/сек, см заглохшую ветку "народный осциллограф" на этом форуме. На Верилоге только Альтеровские примитивы типа PLL, BRAM, DDR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Поясните, пожалуйста, в чем будет выигрыш от такого решения? Приделать к Си 2 новых типа, "bit" и "reg", и можно писать дизайн на Си. Без разных типов присваиваний, "always", и прочих надуманных штучек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться