Jump to content

    

Правильный констрейн на выход, как его выполнить

Навеяло соседним топиком с set_multycycle_path. Есть выход, один из многих, у которого при правильных на мой взгляд констрейнах они не выполняются.
 

create_clock -name {ifclk} -period 20.834 -waveform { 0.000 10.417 } [get_ports {ifclk}]


set_output_delay -add_delay  -max -clock [get_clocks {ifclk}]  [expr 14.600 + 2.500] [get_ports {pktend}]
set_output_delay -add_delay  -min -clock [get_clocks {ifclk}]  [expr 0 + 2.500] [get_ports {pktend}]


# при такой записи (set_multycycle_path -setup N и без -hold [N-1]) фиттер должен сделать так, чтобы самый длинный путь был не больше T*N, а короткий не короче T*[N-1]
set_multicycle_path -setup -start -to [get_keepers {pktend}] 2

Даже с использованием output register, констрейн по setup не выполняется. Решил применить set_multycycle_path, чтобы pktend сдвинуть  на такт. Опять не помогло. Да и разбег между Data Arrival Time у setup и hold стал слишком большой 46.552-36.550=10,002 нс. А у меня должно быть не более 20.834-14.6=6,234 нс.

FPGA-CycloneV. Используется преобразователь уровней, поэтому появилась задержка в приходе тактовой на FPGA 2.5 нс.

Также не могу понять значение clock delay нормально или великовато? Тактовая ifclk заведена на спец вход и является Global Clock. Провести ifclk через pll и сдвинуть по фазе не могу, уже две pll питаются от этого входа.

setup.thumb.png.1553f6a31bb58022aee768eb87456a37.pnghold.thumb.png.25b5a7fb1d7c39b84c73b68050ba4e3f.png

Share this post


Link to post
Share on other sites
2 hours ago, dinam said:

Тактовая ifclk заведена на спец вход и является Global Clock. Провести ifclk через pll и сдвинуть по фазе не могу, уже две pll питаются от этого входа.

а тактовая на которой работает приемник сигнала с портов плис pktend откуда берется? с плис, раздатчика опоры и т.д. Ведь по идее, set_output_delay задает параметры tsu/th внешнего, относительно плис, "регистра"-приемника

Share this post


Link to post
Share on other sites

Тактовую выдает сам приемник сигнала pktend. Приёмник выдает 48 МГц 3,3 В, а банк FPGA питается от 1,5 В. Поэтому используется преобразователь уровней.

Share this post


Link to post
Share on other sites

Вопрос не понятен. Судя по вейвформам, переходные процессы (окно между hold и setup) сдвинулось на один период вправо, и данные пришли во втором такте, а не первом. Получилось что то около 3/4 периода сетап и около 1/4 периода холд (по скринам точнее не скажешь) - соотвествует требованиям задания констрейнтов set_output_delay. Итого, констрейнты, включая multicycle 2, выполнены, все в порядке.

Другое дело, что судя по скрину данные (data required) должны придти в первом такте а не втором ... но тогда малтисайкл использовать нельзя!

Share this post


Link to post
Share on other sites

Я немного другое вижу. Во первых, тактовая FPGA немного задержана, относительно тактовой приёмника , поэтому для приёмника данные должны прийти во втором такте. Data Arrival Time у setup оказалось таким большим, что оно уже залезло на третий такт. 

Т.е. если не использовать set_multicycle_path, то с output register, наносекунд 6 не хватает, насколько я помню. Если использовать set_multicycle_path, то сразу перепрыгиваем на третий такт. А промежуточного значения не получается.

Share this post


Link to post
Share on other sites
16 hours ago, dinam said:

Тактовую выдает сам приемник сигнала pktend. Приёмник выдает 48 МГц 3,3 В, а банк FPGA питается от 1,5 В. Поэтому используется преобразователь уровней.

Понятно, правда я такие вещи делаю через виртуальный клок в одной группе с вашим ifclk. Но тут это роли не играет. Все на ваших скринах верно. И задание ваших параметров и применение мультицикла.

Вы сами задали задержку выходного сигнала как 14.600 + 2.500+20.834 ~= 38нс, + задержка выходного буфера порядка 3нс, получается ваши 41 нс. Задержка тактового дерева, от ifclk до триггеров внутри плиса 4.7нс, затем от него отсчитывается ваше время 41.нс. Поэтому все четко по Data Arrival

По Data Required вы сами прописали себе окно по tsu = 14.6 + 2.5 = 17.1нс. Вот от него и отсчиталось время.

ЕМНИП для tsu/th нужно задать минимальное(наихудшее)  время предустановки/удержания исходя их характеристик чипа приемника. У вас по tsu действительно указано минимальное время предустановки 14.6нс или 70% периода частоты 20,834нс?  Настолько плохой чип?

Уберите для начала мультицикл, поставьте правильные значение tsu/th с учетом задержек трас и вашего буфера, проанализируйте картину. Может быть все решится подбором выходных задержек(если они есть в буферах). Ну а если нет, тогда на полтакта можно сдвинуться по выходу.

 

Share this post


Link to post
Share on other sites

Это не самый "плохой" сигнал есть и tsu=18.7 нс, чип CY7C68013A. На полтакта это сделать по спадающему фронту? Если да, то надо почитать как правильно это сделать и констрейны прописать.

pktend.png

Share this post


Link to post
Share on other sites
Just now, dinam said:

Это не самый "плохой" сигнал есть и tsu=18.7 нс, чип CY7C68013A. На полтакта это сделать по спадающему фронту? Если да, то надо почитать как правильно это сделать и констрейны прописать.

Ого, тогда печально( придется попотеть. Может просто pktend сделать 2 такта? я не помню интерфейс этого чипа) Да, на полтакта это инверсия клока в выходных буферах.

Share this post


Link to post
Share on other sites

На мой взгляд, малтисайкл ни к чему здесь, а проблема - в фазах клока, поскольку, я так понял, с генератора тактирование подается и на ПЛИС, и на CY7C68013A, причем в ПЛИС явно клок задерживается больше. А лучше бы было наоборот, так что надо очень аккуратно задержать фазу приемного клока в CY7C68013A - пропустить через ПЛИС (взять клок с выхода), или скорректировать внешней RC. И еще, необходимо проанализировать возможности ПЛИС в выдаче сигнала pktend в интервале 0..14.6нс : если разница в репортах между сетап и холд окажется больше 14.6нс, то корректировки фазы недостаточно, и придется увеличивать период IFCLK.

+ Можно еще попробовать подвинуть фазу клока выходного триггера ptkend - вроде бы современные ПЛИС допускают небольшие манипуляции с деревом клока (на этапе мэппера). Но это лучше почитать в документации.

И еще замечание. Задержку внешнего преобразователя неверно считать как 2.5нс одинаковой и для сетап и для холд. Т.е. по сетап наверно правильно, а вот по холду лучше брать более жесткое (меньшее) значение, скажем 1.5нс (если в даташите не указан разброс задержек) - так гарантированно не промахнетесь.
 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

я в свое время списал у Cypress задержку тактовой частоты на DDR регистре. И это был FX3, соответственно частота 100 MHz, а не 50

 

-- PCLK output
		u0 : entity work.clk_ddio PORT MAP (
				aclr			=> '0',--greset_h,
				datain_h		=> (others => '0'),
				datain_l		=> (others => '1'),
				outclock		=> clk100,
				dataout		=> FX3_PCLK);

 

Share this post


Link to post
Share on other sites

to Sergey_Bekrenyov 

То ли не понял вашу идею, то ли не понял как её реализовать. Вы предлагаете способ уменьшить Clock delay, которая у меня порядка 5 нс? Если не сложно, можете чуть подробнее?

Сделал по спадающему такту. Все получилось.

setup_pktend.png

hold_pktend.png

Share this post


Link to post
Share on other sites
4 minutes ago, dinam said:

То ли не понял вашу идею, то ли не понял как её реализовать. Вы предлагаете способ уменьшить Clock delay, которая у меня порядка 5 нс? Если не сложно, можете чуть подробнее?

У Сергея в коде инверсия на DDR регистре(посмотрите назначение h/l), это более хорошее решение, если DDR регистры в проекте есть

4 minutes ago, dinam said:

Сделал по спадающему такту. Все получилось.

вы как раз это и сделали)

Share this post


Link to post
Share on other sites
6 hours ago, dinam said:

to Sergey_Bekrenyov 

То ли не понял вашу идею, то ли не понял как её реализовать. Вы предлагаете способ уменьшить Clock delay, которая у меня порядка 5 нс? Если не сложно, можете чуть подробнее?

Сделал по спадающему такту. Все получилось.

 

Задержать на 180 или инвертировать, все верно. 

Share this post


Link to post
Share on other sites

Теперь главное - не понижать частоту. Потому что если период будет больше или равен 22.724,  посыпется холд. Такова плата за использование малтисайкла.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now