TimeQuest для чайников. Приложение 1 (Внешняя обратная связь по клоку).

Вопрос возник на форуме electronix.ru и его правильное решение предложили пользователи des333 и SM. Я в этом вопросе целиком и полностью опростоволосился %).

Задача такая, как правильно описать констрены для такой системы

Как видите, клоки 50 и 100 МГц получены в разных местах, но передача данных между клоками есть. Для корректного выравнивания этих клоков нужно прописать между ними временные соотношения. Но тут есть тонкости : время задержки проводников по сигналам 200МГц и 100МГц и временные параметры внешнего делителя частоты. На рисунке видно 3нс, но положим что диапазон задержек делителя 3/5нс. 

Для простоты рассмотрения исключим PLL из рассмотрения

module clock_fb (input iclk50MHz, iclk200MHz, iclk100MHz, input idat, output oclk200MHz, odat);

  assign oclk200MHz = iclk200MHz;

  logic [1 : 0] dat;

  always_ff @(posedge iclk100MHz) begin
    dat <= (dat << 1) | idat;
  end

  always_ff @(posedge iclk50MHz) begin
    odat <= dat[1];
  end
endmodule

правильный sdc файл будет такой

# base clocks
create_clock -name clk50MHz -period 50MHz [get_ports {iclk50MHz}]
create_clock -name clk200MHz -period 200MHz [get_ports {iclk200MHz}]

# output path of feeback
create_generated_clock -name oclk200MHz -source [get_ports {iclk200MHz}]  [get_ports {oclk200MHz}]

# input path of feeback
create_generated_clock -name clk100MHz -source oclk200MHz -divide_by 2 -offset 4 [get_ports {iclk100MHz}]

# used uncertanty
set_clock_uncertainty -to [get_clocks clk100MHz] 1
set_clock_uncertainty -from [get_clocks clk100MHz] -to [get_clocks clk50MHz] 1

# synchronus transfers
set_clock_groups -exclusive -group {clk50MHz clk100MHz}

Рассмотрим те места sdc файла, на которые нужно обратить внимание

create_generated_clock -name oclk200MHz -source [get_ports {iclk200MHz}] [get_ports {oclk200MHz}]

Здесь все понятно, описываем клок в 200МГц, который выдаем наружу

create_generated_clock -name clk100MHz -source oclk200MHz -divide_by 2 -offset 4 [get_ports {iclk100MHz}]

А вот этой строкой, мы описываем внешний делитель, со смещением сигнала по времени на 4нс. Почему именно 4нс? Потому что используется среднее время задержки сигнала на внешнем делителе. Как же так скажете вы, у нас же диапазон задержки 3/5нс. А вот и он

set_clock_uncertainty -to [get_clocks clk100MHz] 1
set_clock_uncertainty -from [get_clocks clk100MHz] -to [get_clocks clk50MHz] 1

Мы задали нестабильность клока 100МГц в 1нс. Т.е. задержка клоков может изменяться в пределах 4нс ± 1нс. Всё, остальное выравнивание Квартус должен сделать сам. Собираем, запускаем и видим предупреждение от ТаймКвеста

Warning: No paths exist between clock target "iclk100MHz" of clock "clk100MHz" and its clock source. Assuming zero source clock latency.

Он пишет что не нашел источника частоты 100МГц, но мы то знаем где этот источник и прописали положение клока от него по времени. Поэтому на это предупреждение можно забить.Но теперь посмотрим на вейвформы которые рисует Таймквест. Делаем Report All Core Timings, смотрим передачу сигнала с частоты 100МГц, на частоту 50МГц и видим

А видим мы то, что TimeQuest не учел задержку от порта iclk200MHz до порта oclk200MHz. Очень странно не так ли. Лечиться это строкой

set_clock_latency -source 0 [get_clocks {clk100MHz}]

Смотрим что в итоге

В итоге все встало на свои места. Но вот только не понятно, почему TimeQuest, утверждая

Assuming zero source clock latency

Делает не правильный анализ. Отсюда второе правило TimeQuest.

Доверяй, но проверяй!!!

Будте осторожны %)

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <s> <strike> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <caption> <tbody> <tr> <td> <em> <b> <u> <i> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike>
  • Использовать как разделитель страниц.

Подробнее о форматировании