Jump to content

    
Sign in to follow this  
vlso

Плохие slack-и в IOE на Cyclone5 при тактировании через PLL

Recommended Posts

Доброго времени суток !

 

Прошу совета опытных разработчиков, знатоков Altera TimeQuest Analyzer.

Не могу понять особенностей работы FPLL в Cyclone5.

 

Quartus 13.1 Web Edition, FPGA Cyclone 5 GT - 5CGTFD5C5F23C7

Исследую особенности нового для себя семейства Cyclone5 GT.

 

Создал маленький тестовый проект на AHDL.

Все входы и выходы LVTTL 3.3v. Потом сделал 2.5v - разницы почти нет.

Имеется глобальный сигнал тактовой частоты 100 MHz, подаваемый на вход GCLK.

Имеются два входа и два выхода (можно и по одному - просто два для

более достоверной статистики и сравнения между собой).

Имеются две независимых группы триггеров по три триггера в каждой группе

с общим сигналом тактовой частоты.

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

а третий захлопывает второй и соединен с выходом.

В общем простейшая цепочка триггеров с входа на выход.

Крайние триггеры нужны, чтобы их запихать в IOE.

Средние триггеры так, для порядка (привычка с семейства ACEX). :)

 

Первый этап - проверка входных цепей (setup, hold). Пока на нём и застрял...

В .sdc файле TimeQuest Analyzer указал, что входной сигнал валиден

за 3 нс до положительного фронта тактовой частоты и 0 нс после.

TimeQuest Analyzer выдал 0.629ns setup slack и 0.973 ns hold slack.

Cуммарный slack примерно 1.6ns для самого тяжелого варианта

использования (Slow 1100mV 85C). Не густо, но терпимо.

То есть окно валидных данных на входном триггере

за счет особенностей FPGA уменьшилось на 1.4 ns.

 

Решил проверить работу FPLL. Создал мегавизардом вариацию,

которая ничего не делает с входной тактовой частотой (PLL в NORMAL mode)

в плане частоты и фазы. Просто умножает на 3, а потом делит на 3,

сохраняя фазу (подстраиваясь к входной тактовой частоте).

Подал тактовую частоту с выхода FPLL на входа всех триггеров.

Входные триггеры разумеется разместил в IOEs. По идее, за счёт PLL,

тактовая частота на портах .clk первого триггера практически

приближается по фазе к искомой, что на пине.

В .sdc файле соответственно добавил в группу тактовую частоту FPLL.

Почему-то ожидал соизмеримых slack-ов, а получил печальную картину.

Setup slack 0.042 ns, hold slack 0.4 ns.

Долго колупался. Перепробовал все мыслимые и немыслимые настройки,

пробовал все 13-ые версии Quartus, но значимо изменить

суммарный slack, относительно выходной тактовой частоты PLL

на .clk входе триггера, не получилось.

 

Заметил, что если подавать тактовую частоту на другие шарики GCLK,

то суммарный slack немного вырастает примерно до 0.85 ns.

Видно зависит от того, через какой именно CLKCTRL будет выход PLL пропущен.

 

А теперь самое интересное. Если проект компилировать под Cyclone4,

то суммарный slack с этой же схемой с PLL и аналогичным .sdc файлом около 1.8 ns !

Неужели так всё ухудшили в Cyclone 5...

 

Сравнил отчеты cyclone4 и cyclone5. Время компенсации GCLK для PLL

при расчете setup почти такое же, как и для HOLD. Соответственно

и задержки в CLKCTRL то же. А вот для Cyclone5 они уже начинают

разбегаться заметнее.

 

Думал дело в кривости новой мегафункции altera_pll вместо altpll.

Проверил. Компилировал с altpll. Quartus успешно скомпилировал altpll

для cyclone5, но slack-и от этого ничуть не выросли.

 

Подскажите в чем я заблуждаюсь.

Может в .sdc файле что не то сделал, но ведь в cyclone4 были те же .sdc

Идеи уже почти кончились.

Ниже привожу исходники, а также весь проект в аттаче.

 

include "FPLL.inc";

 

SUBDESIGN main

(

clk : input; -- 100Mhz core clock from external PLL chip

reset : input;

 

ina : input;

outa : output;

 

inb : input;

outb : output;

 

locked : output;

)

 

VARIABLE

 

inaL : dff;

midaL : dff;

outaL : dff;

 

inbL : dff;

midbL : dff;

outbL : dff;

 

FPLLM : FPLL;

 

BEGIN

 

FPLLM.refclk=clk;

FPLLM.rst=!reset;

-->FPLLM.outclk_0

-->FPLLM.locked

locked=FPLLM.locked;

 

 

inaL.clk=FPLLM.outclk_0;

inaL=ina;

 

midaL.clk=FPLLM.outclk_0;

midaL=inaL;

 

outaL.clk=FPLLM.outclk_0;

outaL=midaL;

outa=outaL;

 

 

inbL.clk=FPLLM.outclk_0;

inbL=inb;

 

midbL.clk=FPLLM.outclk_0;

midbL=inbL;

 

outbL.clk=FPLLM.outclk_0;

outbL=midbL;

outb=outbL;

 

END;

 

 

main.sdc файл:

 

set_time_format -unit ns -decimal_places 3

 

create_clock -name {clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {clk}]

derive_pll_clocks -create_base_clocks

derive_clock_uncertainty

 

set_clock_groups -exclusive -group {clk FPLLM|fpll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}

 

# delay calculation: x=period-Tsu

set_input_delay -clock "clk" -max 7ns [get_ports {ina}]

set_input_delay -clock "clk" -max 7ns [get_ports {inb}]

 

# delay calculation: x=Th

set_input_delay -clock "clk" -min 0ns [get_ports {ina}]

set_input_delay -clock "clk" -min 0ns [get_ports {inb}]

 

 

и .qsf настройки:

set_global_assignment -name FAMILY "Cyclone V"

set_global_assignment -name DEVICE 5CGTFD5C5F23C7

set_global_assignment -name TOP_LEVEL_ENTITY main

set_global_assignment -name ORIGINAL_QUARTUS_VERSION "13.0 SP1"

set_global_assignment -name PROJECT_CREATION_TIME_DATE "14:54:42 FEBRUARY 13, 2014"

set_global_assignment -name LAST_QUARTUS_VERSION 13.1

set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files

set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top

set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top

set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top

set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0

set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85

set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "ACTIVE SERIAL X1"

set_global_assignment -name USE_CONFIGURATION_DEVICE ON

set_global_assignment -name STRATIXII_CONFIGURATION_DEVICE EPCS64

set_global_assignment -name GENERATE_TTF_FILE ON

set_global_assignment -name GENERATE_RBF_FILE ON

set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF

set_global_assignment -name ON_CHIP_BITSTREAM_DECOMPRESSION OFF

set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V"

set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise

set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall

set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise

set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall

set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_50MHZ

set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON

set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON

set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR"

set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"

set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON

set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL NORMAL

 

set_location_assignment PIN_E10 -to clk

set_location_assignment PIN_A5 -to ina

set_location_assignment PIN_A12 -to inb

set_global_assignment -name SDC_FILE main.sdc

set_global_assignment -name AHDL_FILE main.tdf

set_global_assignment -name QIP_FILE FPLL.qip

set_global_assignment -name SIP_FILE FPLL.sip

set_global_assignment -name OPTIMIZATION_TECHNIQUE SPEED

set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS"

set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON

set_global_assignment -name FITTER_EFFORT "STANDARD FIT"

set_instance_assignment -name FAST_INPUT_REGISTER ON -to ina

set_instance_assignment -name FAST_INPUT_REGISTER ON -to inb

set_instance_assignment -name PLL_FEEDBACK_CLOCK_SIGNAL "GLOBAL CLOCK" -to "*FPLL_0002*|altera_pll:altera_pll_i*|*outclk_wire[0]"

set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

Test.zip

Share this post


Link to post
Share on other sites

Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE.

Share this post


Link to post
Share on other sites
...Почему-то ожидал соизмеримых slack-ов, а получил печальную картину.

Setup slack 0.042 ns, hold slack 0.4 ns....

Info (332146): Worst-case setup slack is 9.401

Info (332146): Worst-case hold slack is 0.227

Info (332146): Worst-case minimum pulse width slack is 1.250

 

Что я делаю не так ? :rolleyes:

Test_5CGTFD5C5F23C7.7z

Share this post


Link to post
Share on other sites
Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE.

 

Спасибо за совет. Попробовал.

Подогнал так, чтобы обе задержки убрать до 0.

Немножко улучшилось - суммарный slack увеличился примерно на 0.1ns.

Но в целом картина всё равно заметно хуже, чем совсем без PLL (напрямую с GCLK).

 

 

 

Info (332146): Worst-case setup slack is 9.401

Info (332146): Worst-case hold slack is 0.227

Info (332146): Worst-case minimum pulse width slack is 1.250

 

Что я делаю не так ? :rolleyes:

 

В .sdc файле Вы не включили оба тактовых сигнала в одну группу.

Поэтому TimeQuest совсем не стал анализировать путь от входного

тактового сигнала до первого триггера. Он попросту игнорировал

в sdc ограничения 7ns/0ns и посчитал просто по периоду 10ns.

Поэтому Вы привели только setup и hold slack для среднего и выходного

триггера. К тому же Вы привели самый быстрый случай FAST 1100mA 0C.

Я же приводил для Slow 1100mV 85C.

В вашем примере для Slow 1100mV 85C на внутреннем триггере получается

чуть хуже, но меньше 1 ns. Если бы так или близко к этому

было бы на входном триггере в IOE, то у меня вопрос бы не

возник.

 

В любом случае, большое спасибо за рабочий пример на verilog-е.

Всё равно мне надо его осваивать потихоньку будет.

 

Так что вопрос для меня пока остаётся открытым.

 

Share this post


Link to post
Share on other sites

Начал тоже более плотно общаться с Cyclone 5 и также недоумеваю насчет ужасных таймингов на IO. Вот моя тема http://electronix.ru/forum/index.php?showtopic=127523 (там еще какие-то проблемы с командой derive_pll_clocks). Но даже если без нее, задержки по сравнению с Cylone 4 просто огромные. Так и не пойму в чем дело.

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.

Sign in to follow this