реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Плохие slack-и в IOE на Cyclone5 при тактировании через PLL, проблемы при тестировании простого примера
vlso
сообщение Feb 21 2014, 15:41
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 22-06-11
Из: Екатеринбург
Пользователь №: 65 833



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

Прошу совета опытных разработчиков, знатоков 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). sm.gif

Первый этап - проверка входных цепей (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 ( 23.74 килобайт ) Кол-во скачиваний: 13
 
Go to the top of the page
 
+Quote Post
Timmy
сообщение Feb 21 2014, 16:34
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE.
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Feb 21 2014, 20:12
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(vlso @ Feb 21 2014, 19:41) *
...Почему-то ожидал соизмеримых 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.gif
Прикрепленные файлы
Прикрепленный файл  Test_5CGTFD5C5F23C7.7z ( 158.01 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
vlso
сообщение Feb 24 2014, 08:19
Сообщение #4





Группа: Участник
Сообщений: 6
Регистрация: 22-06-11
Из: Екатеринбург
Пользователь №: 65 833



Цитата(Timmy @ Feb 21 2014, 22:34) *
Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE.


Спасибо за совет. Попробовал.
Подогнал так, чтобы обе задержки убрать до 0.
Немножко улучшилось - суммарный slack увеличился примерно на 0.1ns.
Но в целом картина всё равно заметно хуже, чем совсем без PLL (напрямую с GCLK).



Цитата(Konst_777 @ Feb 22 2014, 02:12) *
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.gif


В .sdc файле Вы не включили оба тактовых сигнала в одну группу.
Поэтому TimeQuest совсем не стал анализировать путь от входного
тактового сигнала до первого триггера. Он попросту игнорировал
в sdc ограничения 7ns/0ns и посчитал просто по периоду 10ns.
Поэтому Вы привели только setup и hold slack для среднего и выходного
триггера. К тому же Вы привели самый быстрый случай FAST 1100mA 0C.
Я же приводил для Slow 1100mV 85C.
В вашем примере для Slow 1100mV 85C на внутреннем триггере получается
чуть хуже, но меньше 1 ns. Если бы так или близко к этому
было бы на входном триггере в IOE, то у меня вопрос бы не
возник.

В любом случае, большое спасибо за рабочий пример на verilog-е.
Всё равно мне надо его осваивать потихоньку будет.

Так что вопрос для меня пока остаётся открытым.
Go to the top of the page
 
+Quote Post
Tue
сообщение Apr 28 2015, 14:56
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340



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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016