dxp 112 March 23, 2007 Posted March 23, 2007 · Report post Судя по тому, что написано в quartus|| version 7.0 handbook, квартус поддерживает и always_comb, и always_latch. Квартус не только это поддерживает, но и пакованные структуры, массивы (одномерные на данный момент) и перечислимые типы, а так же типы, определяемые пользователем (если это можно так назвать - typedef есть не новый тип, а псевдоним). К сожалению, не поддерживает пока объединения (unions), но в любом случае это куда больше, чем поддерживает крутой Синплифай. Учитывая, что по кодогенерации Квартус уже близок к Синплифаю, имеет смысл задуматся о том, на чем предпочтительнее работать. Лично для меня фичи СистемВерилога весят больше, чем небольшое преимущество в кодогенерации Синплифая. Правда у Синплифая есть еще одна "вкусность" - классные вьюверы RTL и Technology Map. Таких классных ни у кого больше не видел, включая менторовский Прецижн. Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 March 23, 2007 Posted March 23, 2007 · Report post Вопрос к CaPpuCcino: у вас есть опыт успешно завершённого проекта, в котором вы использовали SystemVerilog? есть. Xilinx Virtex2Pro-70 забито 85%. очень сложный алгоритм - без абстракции СВ воспринимается оч сложно, некоторые модули были специально обновлены с В2К1 на СВ после того как нашёл синтезатор (а так же пересмотрены тестбенчи - в плане моделирования/верефицирования классы, ассоциативные массивы, динамические типизированные очереди, автоматические таски с передачей параметров по ссылке очень приятны) ЗЫ: хотя в общем-то что такое проект? - ведь СВ используется только на этапе компиляции(синтаксис) и моделирования/верефикации - остальное-то тем же самым манером(работа P&R от языка описания не зависит) - поэтому проектом может быть -относительно пользования СВ - и верификационная модель и софт-ядро Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 24, 2007 Posted March 24, 2007 · Report post Однако, ппоявились новые вопросы! Ситуация следующая - создаю счетчик, который должен переключаться не по всем перепадам clk, а только по отдельным, которые определяются 1 в sign_bit . Для этого написал следующую конструкцию: always @(posedge clk, posedge reset) begin if(reset) begin count_fir <= 0; end else begin if(sign_bit) count_fir <= count_fir + 1'b1; else count_fir <= count_fir; end end Если sign_bit всегда 1, то все нормально. Но если на этот провод подать строб, который выделяет только один положительный фронт clk, то счетчик срабатывает на втором перепаде clk после разрешающего строба! Если sign_bit использовать где-то в логическом выражении, то счетчик вообще считает очень странно 0-1-3-2-5-... В чем может быть дело? Может используется отрицательный фронт? Раньше в AHDL с таким не встречался - у каждого D-триггера есть вход ena и он работает по положительному фронту clk только когда, на ena "1". Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 24, 2007 Posted March 24, 2007 · Report post После потряхивания и постукивания проблему локализавал, но не понял! Если оставить два счетчика (первый 10 бит, второй - 20 бит) always @(posedge clk, posedge reset) begin if(reset) begin count_fir <= 0; end else begin if(ena) count_fir <= count_fir + 1'b1; else count_fir <= count_fir; end end always @(posedge clk, posedge reset) begin if(reset) begin count_nt <= 0; end else begin if(ena) count_nt <= count_nt + 1'b1; else count_nt <= count_nt; end end ena - разрешающий импульс, то происходит дополнительная задержка на такт. Если оставить только верхний счетчик, то все хорошо - перключается на заданном такте. В чем может быть дело? Может в одном модуле нельзя несколько операторов always @(posedge clk, posedge reset) использовать? Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 March 24, 2007 Posted March 24, 2007 · Report post Вот вы говорите, что переходите с AHDL на верилог. Нужели описав такое на AHDL, Вы получите задуманное? Что касается верилог, то все это синтезируемо. Естественно никого не волнует количество процессов в описании. Вот только так схему описывать - себя запутывать. Два счетчика, реагирующие на один и тот же ena синтезатор по умолчанию преобразует а один. Посмотрите количество ресурсов. затраченное на описание этих двух счетчиков. Как раз на один и получиться. Что в моделировании Вам удалось получить - ума не приложу. Этакий симбиоз из разрядностей одного и другого. В таком описании от одного ena должен быть только один счетчик на максимальный период. Тогда и с моделированием вопросов не будет. Что на верилог, что на ahdl. Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 24, 2007 Posted March 24, 2007 · Report post Вот вы говорите, что переходите с AHDL на верилог. Нужели описав такое на AHDL, Вы получите задуманное? То что Вы видите это уже результат потряхивания и постукивания (первоначально у них были разные ena в виде логических выражений). Что касается верилог, то все это синтезируемо. Естественно никого не волнует количество процессов в описании. Вот только так схему описывать - себя запутывать. Т.е. все не надо в один процесс загонять? Спасибо. А как надо описывать схему? Два счетчика, реагирующие на один и тот же ena синтезатор по умолчанию преобразует а один. Я это прекрасно понимаю, но вопрос в другом - куда такт делся? И почему когда описан только один счетчик, то все хорошо? Синтезатор может выбрасывать ячейки, но не должен менять хронологию!!! Если это такое свойство синтезатора Верилога - то мне видимо в другую сторону. Но, мне думается, что дело "дело было не в бобине" - где то у меня горботинка. В таком описании от одного ena должен быть только один счетчик на максимальный период. Тогда и с моделированием вопросов не будет. Что на верилог, что на ahdl. Повторюсь - изначально ena у счетчиков были разные. При моделировании заметил "чудеса". Стал упрощать. С AHDL чудес у этого же проекта не было. Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 March 25, 2007 Posted March 25, 2007 · Report post Т.е. все не надо в один процесс загонять? Спасибо. А как надо описывать схему? да всё у вас нормально описато. вы эт моделирование уже после P&R проводите? дайте модуль целиком - посмотрим - косяк наверняка где-то в дребезге. иначе это вообще что-то из разряда фантастики Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 25, 2007 Posted March 25, 2007 · Report post вы эт моделирование уже после P&R проводите? Не очень понял. Я провожу просто компиляцию в Квартусе. Предупреждает только на счет - clk (мол не описан как тактовый - а я не знаю как описать - но и так раньше вседа работало). дайте модуль целиком - посмотрим - косяк наверняка где-то в дребезге. иначе это вообще что-то из разряда фантастики module test (clk, reset, ena, sign_bit, number_sample, count_fir); input clk; input reset; input ena; input sign_bit; output[9:0] count_fir; output[20:0] number_sample; reg[9:0] count_fir; reg[20:0] count_nt; wire[20:0] number_sample; always @(posedge clk, posedge reset) begin if(reset) begin count_fir <= 0; end else begin if(sign_bit) count_fir <= count_fir + 1'b1; else count_fir <= count_fir; end end always @(posedge clk, posedge reset) begin if(reset) begin count_nt <= 0; end else begin if(ena & ~count_fir[2]) count_nt <= count_nt + 1'b1; else count_nt <= count_nt; end end assign number_sample = count_nt; endmodule Выходы count_fir Virtual Pin On Yes number_sample Virtual Pin On Yes Заметил, что если выходы не описывать, то симмулирует правильно, но компилятор ругается. А если описать, то на выходах действительно появляется что-то похожее на дребезг, но к сожалению длительностью в такт! Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 25, 2007 Posted March 25, 2007 · Report post Посмотрел результаты синтеза RTL viewer - дополнительных тактов не должно быть, но они есть. Каждый счетчик представлен в виде нетактируемого сумматора и линейки D-триггеров с разными входами разрешения. То что показал RTL viewer по стилю гораздо ближе к описанию на AHDL. Может критичные по времени секции надо писать на AHDL? Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 March 25, 2007 Posted March 25, 2007 · Report post Верилог и AHDL тут не причем. Все, что Вы описали на верилоге, работает правильно и симуляция верна. Для корректной проверки такой схемы, вырванной из основной схемы, нужно регистры на входе ставить. И от асинхронного ресета отказаться. хотя повторюсь, все правильно у Вас. Разбирайтесь с логикой работы. Что касается предупреждений по клоку, нужно сетап клока указывать. Констрейны. module ctи ( input clk, input reset, input ena, input sign_bit, output reg [9:0] count_fir, output [20:0] number_sample ); reg [20:0] count_nt; reg ena_rg; reg sign_bit_rg; always @(posedge clk) begin ena_rg <= ena; sign_bit_rg <= sign_bit; if(reset) begin count_fir <= 10'd0; count_nt <= 21'd0; end else begin if(sign_bit_rg) count_fir <= count_fir + 1'b1; if(ena_rg & ~count_fir[2]) count_nt <= count_nt + 1'b1; end end assign number_sample = count_nt; endmodule Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 25, 2007 Posted March 25, 2007 · Report post Для корректной проверки такой схемы, вырванной из основной схемы, нужно регистры на входе ставить. И от асинхронного ресета отказаться. хотя повторюсь, все правильно у Вас. Возможно Вы правы. Только эти входы у меня формируются другим блоком и естественно синхронны. Интересно другое - если откоммпилировать мой модуль то получается использован 31 триггер - т.е. лишней задержки нигде нет, а она моделируется. Попробовал Ваш модуль - занято 33 триггера. Если выходы не описывать, то все моделируется правильно. но если выходы перед компиляцией объявить виртуальными, то выход count_fir дополнительно задержан на такт при том же количестве триггеров (33). Я подаю ena в виде редких импульсов шириной в период тактовой частоты, а вход sign_bit скопировал с ena. Такое впечатление, что глючит симулятор - может где-то надо галку поставить? Что касается предупреждений по клоку, нужно сетап клока указывать. Констрейны. Наберусь наглости и еще спрошу - сетап клока задается в Timing Analysis Setting ? Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 March 25, 2007 Posted March 25, 2007 · Report post Ресурсов задействовано больше потому что синхронныйресет требует ресурсов. Что касается виртуальных пинов не в курсе. Функционально законченный модуль я моделируюю на BGA корпусах. Качественному модулю должно быть все равно на каком кристалле. С симулятором в квартусе все в порядке. Повторю нет никакой разницы какими средствами Вы описваете схему. Я вот например в графическом редакторе люблю. Что касается констрейнов, посмотрите http://www.dsioffe.narod.ru/myquartus/myquartus.htm Quote Share this post Link to post Share on other sites More sharing options...
vladv 0 March 25, 2007 Posted March 25, 2007 · Report post После потряхивания и постукивания проблему локализавал, но не понял! Если оставить два счетчика (первый 10 бит, второй - 20 бит) always @(posedge clk, posedge reset) begin if(reset) begin count_fir <= 0; end else begin if(ena) count_fir <= count_fir + 1'b1; else count_fir <= count_fir; end end always @(posedge clk, posedge reset) begin if(reset) begin count_nt <= 0; end else begin if(ena) count_nt <= count_nt + 1'b1; else count_nt <= count_nt; end end ena - разрешающий импульс, то происходит дополнительная задержка на такт. Если оставить только верхний счетчик, то все хорошо - перключается на заданном такте. В чем может быть дело? Может в одном модуле нельзя несколько операторов always @(posedge clk, posedge reset) использовать? Как формируется ena относительно clk? Если "одновременно", то действительно могут быть похожие проблемы. Например, если ena формировать так: always @(posedge clk) ena <= xxx; То count_nt/count_fir будут считать с задержкой на 2 такта от сигнала xxx. Если формирование ena описать так (блокирующее присваивание вместо неблокирующего): always @(posedge clk) ena = xxx; ну или: assign ena = clk & xxx; То могут быть сюрпризы: моделирование может выполняться по разному (это зависит от расположения конструкций в коде, порядка файлов и внутрениих заморочек симулятора): - count_nt/count_fir будут считать с задержкой на 2 такт от сигнала xxx - count_nt/count_fir будут считать с задержкой на 1 такт от сигнала xxx В общем, посмотрите или покажите, как (и где: в тесте или в другом синтезируемом блоке) формируется ena. Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 25, 2007 Posted March 25, 2007 · Report post sazh Ресурсов задействовано больше потому что синхронныйресет требует ресурсов. С этим все понятно - 2 триггера -синхронизация, 21 +10 - счетчики = 33. За ссылку спасибо! vladv По моему, ena формируется корректно - для моделирования блока я подаю импульс сформированный по спаду clk и длительностью в один период clk, так что фронт clk попадает точно в середину импульса ena. Таких импульсов на диаграмме ena - 5 штук. Сигнал sign_bit просто копия сигнала ena. Тактовых импульсов много больше. В результате сигалы с numder_sample отстают на такт от сигнала count_fir (модуль взял как предложил sazh). Если бы сам не видел - то не поверил бы! Почему так - х.з. Quote Share this post Link to post Share on other sites More sharing options...
Andr2I 0 March 25, 2007 Posted March 25, 2007 · Report post Всем спасибо! Дело было во входах. Сделал их виртуальными и все заработало правильно. Видимо задержки и приводили к позднему срабатыванию. Вера в "светлое будущее" восстановлена! Quote Share this post Link to post Share on other sites More sharing options...