Jump to content
    

Переход с AHDL на Verilog

Судя по тому, что написано в quartus|| version 7.0 handbook, квартус поддерживает и always_comb, и always_latch.

Квартус не только это поддерживает, но и пакованные структуры, массивы (одномерные на данный момент) и перечислимые типы, а так же типы, определяемые пользователем (если это можно так назвать - typedef есть не новый тип, а псевдоним). К сожалению, не поддерживает пока объединения (unions), но в любом случае это куда больше, чем поддерживает крутой Синплифай. Учитывая, что по кодогенерации Квартус уже близок к Синплифаю, имеет смысл задуматся о том, на чем предпочтительнее работать. Лично для меня фичи СистемВерилога весят больше, чем небольшое преимущество в кодогенерации Синплифая. Правда у Синплифая есть еще одна "вкусность" - классные вьюверы RTL и Technology Map. Таких классных ни у кого больше не видел, включая менторовский Прецижн.

Share this post


Link to post
Share on other sites

Вопрос к CaPpuCcino: у вас есть опыт успешно завершённого проекта, в котором вы использовали SystemVerilog?

есть. Xilinx Virtex2Pro-70 забито 85%. очень сложный алгоритм - без абстракции СВ воспринимается оч сложно, некоторые модули были специально обновлены с В2К1 на СВ после того как нашёл синтезатор (а так же пересмотрены тестбенчи - в плане моделирования/верефицирования классы, ассоциативные массивы, динамические типизированные очереди, автоматические таски с передачей параметров по ссылке очень приятны)

ЗЫ: хотя в общем-то что такое проект? - ведь СВ используется только на этапе компиляции(синтаксис) и моделирования/верефикации - остальное-то тем же самым манером(работа P&R от языка описания не зависит) - поэтому проектом может быть -относительно пользования СВ - и верификационная модель и софт-ядро

Share this post


Link to post
Share on other sites

Однако, ппоявились новые вопросы!

Ситуация следующая - создаю счетчик, который должен переключаться не по всем перепадам 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".

Share this post


Link to post
Share on other sites

После потряхивания и постукивания проблему локализавал, но не понял!

Если оставить два счетчика (первый 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) использовать?

Share this post


Link to post
Share on other sites

Вот вы говорите, что переходите с AHDL на верилог. Нужели описав такое на AHDL, Вы получите задуманное?

Что касается верилог, то все это синтезируемо. Естественно никого не волнует количество процессов в описании. Вот только так схему описывать - себя запутывать.

Два счетчика, реагирующие на один и тот же ena синтезатор по умолчанию преобразует а один. Посмотрите количество ресурсов. затраченное на описание этих двух счетчиков. Как раз на один и получиться.

Что в моделировании Вам удалось получить - ума не приложу. Этакий симбиоз из разрядностей одного и другого.

В таком описании от одного ena должен быть только один счетчик на максимальный период. Тогда и с моделированием вопросов не будет. Что на верилог, что на ahdl.

Share this post


Link to post
Share on other sites

Вот вы говорите, что переходите с AHDL на верилог. Нужели описав такое на AHDL, Вы получите задуманное?

 

То что Вы видите это уже результат потряхивания и постукивания (первоначально у них были разные ena в виде логических выражений).

 

 

Что касается верилог, то все это синтезируемо. Естественно никого не волнует количество процессов в описании. Вот только так схему описывать - себя запутывать.

 

Т.е. все не надо в один процесс загонять? Спасибо. А как надо описывать схему?

 

Два счетчика, реагирующие на один и тот же ena синтезатор по умолчанию преобразует а один.

 

Я это прекрасно понимаю, но вопрос в другом - куда такт делся? И почему когда описан только один счетчик, то все хорошо? Синтезатор может выбрасывать ячейки, но не должен менять хронологию!!! Если это такое свойство синтезатора Верилога - то мне видимо в другую сторону. Но, мне думается, что дело "дело было не в бобине" - где то у меня горботинка.

 

В таком описании от одного ena должен быть только один счетчик на максимальный период. Тогда и с моделированием вопросов не будет. Что на верилог, что на ahdl.

 

Повторюсь - изначально ena у счетчиков были разные. При моделировании заметил "чудеса". Стал упрощать. С AHDL чудес у этого же проекта не было.

Share this post


Link to post
Share on other sites

Т.е. все не надо в один процесс загонять? Спасибо. А как надо описывать схему?

да всё у вас нормально описато. вы эт моделирование уже после P&R проводите?

дайте модуль целиком - посмотрим - косяк наверняка где-то в дребезге. иначе это вообще что-то из разряда фантастики

Share this post


Link to post
Share on other sites

вы эт моделирование уже после 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

 

Заметил, что если выходы не описывать, то симмулирует правильно, но компилятор ругается. А если описать, то на выходах действительно появляется что-то похожее на дребезг, но к сожалению длительностью в такт!

Share this post


Link to post
Share on other sites

Посмотрел результаты синтеза RTL viewer - дополнительных тактов не должно быть, но они есть. Каждый счетчик представлен в виде нетактируемого сумматора и линейки D-триггеров с разными входами разрешения. То что показал RTL viewer по стилю гораздо ближе к описанию на AHDL. Может критичные по времени секции надо писать на AHDL?

Share this post


Link to post
Share on other sites

Верилог и 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

Share this post


Link to post
Share on other sites

Для корректной проверки такой схемы, вырванной из основной схемы, нужно регистры на входе ставить. И от асинхронного ресета отказаться. хотя повторюсь, все правильно у Вас.

Возможно Вы правы. Только эти входы у меня формируются другим блоком и естественно синхронны. Интересно другое - если откоммпилировать мой модуль то получается использован 31 триггер - т.е. лишней задержки нигде нет, а она моделируется.

 

Попробовал Ваш модуль - занято 33 триггера. Если выходы не описывать, то все моделируется правильно. но если выходы перед компиляцией объявить виртуальными, то выход count_fir дополнительно задержан на такт при том же количестве триггеров (33). Я подаю ena в виде редких импульсов шириной в период тактовой частоты, а вход sign_bit скопировал с ena. Такое впечатление, что глючит симулятор - может где-то надо галку поставить?

 

 

 

Что касается предупреждений по клоку, нужно сетап клока указывать. Констрейны.

 

Наберусь наглости и еще спрошу - сетап клока задается в Timing Analysis Setting ?

Share this post


Link to post
Share on other sites

Ресурсов задействовано больше потому что синхронныйресет требует ресурсов.

Что касается виртуальных пинов не в курсе. Функционально законченный модуль я моделируюю на BGA корпусах. Качественному модулю должно быть все равно на каком кристалле.

С симулятором в квартусе все в порядке. Повторю нет никакой разницы какими средствами Вы описваете схему. Я вот например в графическом редакторе люблю.

Что касается констрейнов, посмотрите

http://www.dsioffe.narod.ru/myquartus/myquartus.htm

Share this post


Link to post
Share on other sites

После потряхивания и постукивания проблему локализавал, но не понял!

Если оставить два счетчика (первый 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.

Share this post


Link to post
Share on other sites

sazh

Ресурсов задействовано больше потому что синхронныйресет требует ресурсов.

С этим все понятно - 2 триггера -синхронизация, 21 +10 - счетчики = 33.

 

За ссылку спасибо!

 

vladv

 

По моему, ena формируется корректно - для моделирования блока я подаю импульс сформированный по спаду clk и длительностью в один период clk, так что фронт clk попадает точно в середину импульса ena. Таких импульсов на диаграмме ena - 5 штук. Сигнал sign_bit просто копия сигнала ena. Тактовых импульсов много больше. В результате сигалы с numder_sample отстают на такт от сигнала count_fir (модуль взял как предложил sazh).

Если бы сам не видел - то не поверил бы! Почему так - х.з.

Share this post


Link to post
Share on other sites

Всем спасибо!

Дело было во входах. Сделал их виртуальными и все заработало правильно. Видимо задержки и приводили к позднему срабатыванию. Вера в "светлое будущее" восстановлена!

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...