Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алтера: описание внешнего такта, TimeQuest
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
solidreg
Нужна помощ с описанием внешнего такта в SDC языке для TimeQuest (Altera)
У меня PLL генерирует 200MHz и 50MHz такты. Этот 200MHz идёт сразу на внешний чип, каторый делит этот такт на два, и через кокое то время (скажем, 3nS) посупает опять на FPGA. И потом этот сигнал пользуется как такт в внутренних цепях.
Нарисовал картинку чтоб было бы ясно.


Написал так:
Код
create_generated_clock -source <..PLL> -name MHz50
create_clock -period 10.000 -name MHz100 [get_ports {Clk2}]

Но как правильно описать эту задержку (фазу)?
des333
Я не специалист по TQ, но, на мой взгляд, Вам следует описать MHz100 как generated_clock от MHz200 с указанием сдвига фазы.

Но, лучше подождите ответов гуру. smile.gif
solidreg
Цитата(des333 @ Jan 23 2010, 16:22) *
Я не специалист по TQ, но, на мой взгляд, Вам следует описать MHz100 как generated_clock от MHz200 с указанием сдвига фазы.

Да, пробовал. Но тогда Quartus ругается(warning), что не может найти как этот клок был сгенерирован. В резултате, это описание игнориуруется
des00
Цитата(des333 @ Jan 23 2010, 07:22) *
Я не специалист по TQ, но, на мой взгляд, Вам следует описать MHz100 как generated_clock от MHz200 с указанием сдвига фазы.

create_generated_clock не может использоваться без указания физического источника этого клока, т.е. в данном случае вариант отпадает.

Цитата(solidreg @ Jan 23 2010, 07:10) *
Но как правильно описать эту задержку (фазу)?

Описывается стандартно через create_clock.
У вас есть передача данных их домена 100МГц в домен 50МГц? Если нет, то задержка не важна.
Если есть то это сложнее, я вижу единственную возможность это задать сдвиг по фазе между клоками с помошью ключа waveform. Но тут есть тонкий момент, у вашего делителя скоре всего нормируются максимальные и минимальные параметры задержки, и как вы будете учитывать их при анализе мне не совсем понятно. Может быть гуру объяснят.

Еще мне не понятно, зачем делить клок на внешнем устройстве, если есть PLL. Или почему бы не сгенерировать 50МГц со 100МГц получаемых с внешнего делителя.
solidreg
Цитата(des00 @ Jan 23 2010, 19:34) *
Еще мне не понятно, зачем делить клок на внешнем устройстве, если есть PLL. Или почему бы не сгенерировать 50МГц со 100МГц получаемых с внешнего делителя.

Это упрощенное обяснение проекта. Внешная микросчема не всегда этот сигнал выдаёт. Но когда работает - 100MHz там есть.

Да, передача данных там есть от обеих доменов. Потому мне и надо описать их корректно.

Задержка там фиксированна, окола 3-5nS.

Спасибо за идею о сдвиг. Может быть поможет.
des00
Цитата
Задержка там фиксированна, окола 3-5nS.

Она то фиксирована, но вам надо рассмотреть крайние варианты, что бы быть уверенным в работоспособности. А то на одной плате может работать, а на другой нет. Как тут быть не совсем понятно.

Цитата
Да, передача данных там есть от обеих доменов. Потому мне и надо описать их корректно.

я бы рассмотрел внимательно передачу данных и рассмотрел вариант использования фифо %)
des333
Цитата(des00 @ Jan 23 2010, 18:34) *
create_generated_clock не может использоваться без указания физического источника этого клока, т.е. в данном случае вариант отпадает.

Так ведь у автора MHz200 выходит с FPGA, почему он не подходит как физический источник?
des00
Цитата(des333 @ Jan 23 2010, 10:56) *
Так ведь у автора MHz200 выходит с FPGA, почему он не подходит как физический источник?

200 выходит, делится на внешнем устройстве и 100 заходит в плис. Вот эти 100 с помощью генерайтед клоков описать нельзя %)
des333
Цитата(des00 @ Jan 23 2010, 20:40) *
200 выходит, делится на внешнем устройстве и 100 заходит в плис. Вот эти 100 с помощью генерайтед клоков описать нельзя %)

Хм...


А так разве нельзя?

Код
module count(

input  clk50_i,
output clk50_o,
input  clk100_i,
output clk100_o
);


assign clk50_o = clk50_i;
assign clk100_o = clk100_i;


endmodule


Код
create_clock -period 20.000 -name clk50i [get_ports {clk50_i}]
create_generated_clock -name clk50o -source [get_ports {clk50_i}] -divide_by 1 -multiply_by 1 [get_ports {clk50_o}]

create_generated_clock -name clk100i -source [get_ports {clk50_o}] -divide_by 2 -multiply_by 1  [get_ports {clk100_i}]
create_generated_clock -name clk100o -source [get_ports {clk100_i}] -divide_by 1 -multiply_by 1 [get_ports {clk100_o}]


Квартус ругается:

Цитата
Warning: No paths exist between clock target "clk100_i" of clock "clk100i" and its clock source. Assuming zero source clock latency.


Смотрим справку:

Цитата
ACTION:Check the value of the -source option to specify a valid clock source in the combinational fan-in of the generated clock target. If the generated clock is assigned to an input port to model a feedback clock, then the -source should be an output port with a clock assigned to it. If no paths are expected between the clock source and clock target (e.g., to model a feedback clock), use the set_clock_latency SDC command to specify any source latency.


Добавляем в .sdc строку:


Код
set_clock_latency -source 3 [get_clocks {clk100i}]


И все в порядке.
SM
Цитата(des00 @ Jan 23 2010, 20:40) *
200 выходит, делится на внешнем устройстве и 100 заходит в плис. Вот эти 100 с помощью генерайтед клоков описать нельзя %)

Это Вас кто-то наобманул smile.gif

верилог:
Код
module time_test (input master_clk,
                  output out_clk,
                  input ret_clk,
                  input d,
                  output reg o
                  );

assign out_clk = !master_clk;

always @(posedge ret_clk)
o <= d;
endmodule


SDC:
Код
create_clock -name mclk -period "100 MHz" master_clk
create_generated_clock -name gclk -source master_clk -invert out_clk
create_generated_clock -name rclk -source out_clk -divide_by 2 -offset 4 ret_clk
set_clock_uncertainty -to [get_clocks rclk] 1


первый - описывает входной клок.
Второй - описывает генерейтед клок на выходном пине с учетом всех задержек.
Третий - описывает генерейтед клок, пришедший снаружи, сделанный из второго, деленный напополам и смещенный на 4 наны.
ну и uncertainty на +-1 нану, так как там ведь 3..5, а не 4.

А варнинг... Ну и что, что варнинг... Забить на него следует.
Warning: No paths exist between clock target "ret_clk" of clock "rclk" and its clock source. Assuming zero source clock latency.
И правильно говорит варнинг. Внутри путей нет, и считает latency за ноль, о чем на всякий пожарный и сообщает, мало ли, человек ошибся, случайно не ту ноду указал... Но мы-то знаем, что ту ноду, и что не ноль там, а 3..5, и это описали через -offset и через uncertainty. Можно и без оффсета, через дополнительный set_clock_latency. Ну и еще set_load не помешал бы, чтобы задать емкость нагрузки на выходной пин клока. Но я что-то не уверен в наличии такой команды в таймквесте
solidreg
Цитата(SM @ Jan 23 2010, 23:11) *
SDC:
Код
create_clock -name mclk -period "100 MHz" master_clk
create_generated_clock -name gclk -source master_clk -invert out_clk
create_generated_clock -name rclk -source out_clk -divide_by 2 -offset 4 ret_clk
set_clock_uncertainty -to [get_clocks rclk] 1


первый - описывает входной клок.
Второй - описывает генерейтед клок на выходном пине с учетом всех задержек.
Третий - описывает генерейтед клок, пришедший снаружи, сделанный из второго, деленный напополам и смещенный на 4 наны.
ну и uncertainty на +-1 нану, так как там ведь 3..5, а не 4.

А варнинг... Ну и что, что варнинг... Забить на него следует.
Warning: No paths exist between clock target "ret_clk" of clock "rclk" and its clock source. Assuming zero source clock latency.
И правильно говорит варнинг. Внутри путей нет, и считает latency за ноль, о чем на всякий пожарный и сообщает, мало ли, человек ошибся, случайно не ту ноду указал... Но мы-то знаем, что ту ноду, и что не ноль там, а 3..5, и это описали через -offset и через uncertainty. Можно и без оффсета, через дополнительный set_clock_latency. Ну и еще set_load не помешал бы, чтобы задать емкость нагрузки на выходной пин клока. Но я что-то не уверен в наличии такой команды в таймквесте


Wow!
Вот это решение! Очень спасибо.
А то так и было - на одной плате работает, а на другой нет.
des00
Цитата(des333 @ Jan 23 2010, 12:49) *
А так разве нельзя?

Цитата(SM @ Jan 23 2010, 13:11) *
Это Вас кто-то наобманул smile.gif

теперь вижу что можно, как всегда невнимательно читал даташит %)

UPD 2 SM и des333, надеюсь вы не возражаете если этот пример я сохраню для всех %)

Кстати по тому примеру что там выложен. Если сделать посмотреть анализ времянок и пути клока в 200МГц

Цитата
report_path -from [get_ports {iclk200MHz}] -to [get_ports {oclk200MHz}] -npaths 1
Info: Path #1: Delay is 4.770


то возникает вопрос, откуда кварутс насчитал 6нс между клоками, тогда как должно быть 7.7...9.7 нс ?
Нажмите для просмотра прикрепленного файла
UPD2 Поковырялся. 6 нс это период 100МГц 10нс минус смещение 4 нс. uncertanty учитывается при расчете Data Required и для клоков не рассматривается. А где учтена задержка по сигналу 200МГц... Странно.

UPD3.
Сделал так
Код
lcell lcell1 (iclk200MHz, oclk200MHz);

задержка выросла
Цитата
Info: Path #1: Delay is 6.240

но анализ того самого пути изменился на 0.03нс и то за счет того что Clock Delay по clk50MHz выросла, ИМХО это подтверждение того, что задержка clk200MHz не учитывается %)
des333
Если добавить строчку:
Код
set_clock_latency -source 0 [get_clocks {clk100MHz}]


то задержка lcell начнет учитываться.
des00
Цитата(des333 @ Jan 24 2010, 01:22) *
Если добавить строчку:
Код
set_clock_latency -source 0 [get_clocks {clk100MHz}]


то задержка lcell начнет учитываться.

Точно, занятно. Значит таймквест, утвержая
Цитата
Warning: No paths exist between clock target "iclk100MHz" of clock "clk100MHz" and its clock source. Assuming zero source clock latency.
нагло врет в текстовой форме %)
des333
Цитата(des00 @ Jan 24 2010, 10:35) *
Точно, занятно. Значит таймквест, утвержая
нагло врет в текстовой форме %)

smile.gif

Возможно разработчики имели в виду, что TQ не будет учитывать никакие задержки связанные с источником этого клока.
des00
Цитата(des333 @ Jan 24 2010, 01:41) *
Возможно разработчики имели в виду, что TQ не будет учитывать никакие задержки связанные с источником этого клока.

а вот это надо спросить уже у Stewart Little %)

ЗЫ. Блог подправил и описал сию фичу отдельной строкой %)
SM
Цитата(des333 @ Jan 24 2010, 10:41) *
Возможно разработчики имели в виду, что TQ не будет учитывать никакие задержки связанные с источником этого клока.


Разработчики имели в виду, что не будет учитываться задержка от source (указанного ы ключике -source) до таргета, указанного без всяких ключиков в конце команды. Т.е. будет, но она равна нулю, так как ее он сам посчитать не может. Но не никакие - ручная set_clock_latency - будет. Оффсеты и фазы от генерейтед-клока - будут.


ЗЫ. des00 - а почему у вас там все называется TQ для чайников? Когда в реальности это скорее SDC для чайников, с примерами на TQ.
des00
Цитата(SM @ Jan 24 2010, 02:17) *
Разработчики имели в виду, что не будет учитываться задержка от source (указанного ы ключике -source) до таргета, указанного без всяких ключиков в конце команды. Т.е. будет, но она равна нулю, так как ее он сам посчитать не может. Но не никакие - ручная set_clock_latency - будет. Оффсеты и фазы от генерейтед-клока - будут.

хмм, т.е. TQ в этой ситуации, когда выкидывает задержку клока clk200MHz из анализа, прав?

Цитата
ЗЫ. des00 - а почему у вас там все называется TQ для чайников? Когда в реальности это скорее SDC для чайников, с примерами на TQ.

потому что всё выросло из вопроса "как пользоваться TQ?" %)
des333
Цитата(SM @ Jan 24 2010, 11:17) *
Разработчики имели в виду, что не будет учитываться задержка от source (указанного ы ключике -source) до таргета, указанного без всяких ключиков в конце команды. Т.е. будет, но она равна нулю, так как ее он сам посчитать не может. Но не никакие - ручная set_clock_latency - будет. Оффсеты и фазы от генерейтед-клока - будут.



Тогда не понятно, почему добавление lcell'ов при отсутсвии ручной set_clock_latency не влияет на результат, при наличии же

ручной set_clock_latency=0 влияет?

В чем разница автоматического приравнивание к нулю, так как TQ сам ее посчитать не смог и ручного приравнивания к нулю? 
SM
Цитата(des333 @ Jan 24 2010, 18:20) *
В чем разница автоматического приравнивание к нулю, так как TQ сам ее посчитать не смог и ручного приравнивания к нулю? 


Ну я разницы-то не заметил, в моем примере он четко берет фронт выходного клока out_clk с учетом всех его задержек и еще и offset-а. Эти задержки еще второй create_generated_clock рассчитал. Или может не туда смотрел?
des333
Цитата(SM @ Jan 24 2010, 21:15) *
Ну я разницы-то не заметил, в моем примере он четко берет фронт выходного клока out_clk с учетом всех его задержек и еще и offset-а. Эти задержки еще второй create_generated_clock рассчитал. Или может не туда смотрел?


Добавив в ваш код триггер, тактируемый мастер клоком, и несколько lcell, я получил следующее:


Код
`define SEVEN_LCELL

module count (    
  input master_clk,
  output out_clk,
  input ret_clk,
  input d,
  output reg o
);

logic d1;
logic t1, t2, t3, t4, t5 , t6, t7;

`ifdef SEVEN_LCELL

  lcell lcell1 (master_clk, t1);
  lcell lcell2 (t1, t2);
  lcell lcell3 (t2, t3);
  lcell lcell4 (t3, t4);
  lcell lcell5 (t4, t5);
  lcell lcell6 (t5, t6);
  lcell lcell7 (t6, t7);

`else

  lcell lcell1 (master_clk, t1);
  lcell lcell2 (t1, t7);

`endif



assign out_clk = !t7;

always @(posedge ret_clk)
d1 <= d;

always @(posedge master_clk)
o <= d1;

endmodule


При этом .sdc файл остался неизменным:

Код
create_clock -name mclk -period "100 MHz" master_clk
create_generated_clock -name gclk -source master_clk -invert out_clk
create_generated_clock -name rclk -source out_clk -divide_by 2 -offset 1 ret_clk
set_clock_uncertainty -to [get_clocks rclk] 1


На команду:

Цитата
report_timing -from_clock { rclk } -to_clock { mclk } -setup -npaths 1 -detail path_only -panel_name {Report Timing}


мы получаем следующее результаты.


При 2-х lcell:

Цитата
Worst case slack is 2.802


При 7-ми lcell:

Цитата
Worst case slack is 2.802




Если же добавить в .sdc файл строку:

Цитата
set_clock_latency -source 0 [get_clocks {rclk}]


то результаты будут следующие:



При 2-х lcell:

Цитата
Worst case slack is -2.211


При 7-ми lcell:

Цитата
Worst case slack is -4.194



Вопрос:

почему при добавлении вышеуказанной строки появляется разница в задержке при разном количестве lcell, а при отсутствии этой строки количество lcell не задержку никак не влияет?
SM
Цитата(des333 @ Jan 24 2010, 23:19) *
Вопрос:

почему при добавлении вышеуказанной строки появляется разница в задержке при разном количестве lcell, а при отсутствии этой строки количество lcell не задержку никак не влияет?


ХЗ. Глюк наверное. По идее-то разницы никакой, вручную лэтенси ноль влепить, или автоматом... Родоначальник SDC - синопсис - этим не страдает.
des00
Цитата(SM @ Jan 25 2010, 16:55) *
ХЗ. Глюк наверное.

я так и предположил, Stewart Little пока тоже молчит по этому вопросу %)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.