TimeQuest для чайников. Приложение 3 (Добрый и злобный Multicycle)

Добрый день уважаемый читатель.

В предыдущих блогах я рассказывал о том, что есть волшебный констрейн set_false_path с помощью которого можно творить прямо таки "чудеса" укладывания проекта в констрейны. У этого констрейна есть своеобразный друг. Добрый, но в то же время злобный, констрейн описания мультициклового пути set_multicycle_path.

Внимательный читатель скажет, что мы с ним уже знакомились, в разделе про задание ограничений для интерфейсов. Да это так, теперь давайте рассмотрим использование мультициклов для задания ограничений внутренней логики. Рассмотрим простой проект: кусочек ДСП системы - цифровой фильтр, с реализацией на цепи сумматоров:

 

 

module multicycle
  #(parameter int pDAT_W = 16)
  (input  logic iclk, ival, input logic [pDAT_W-1 : 0] idat,
   output logic oval,       output logic [pDAT_W-1 : 0] odat) ;

  //-----------------------------------
  //
  //-----------------------------------

  localparam int cCOE_W = 14;
  localparam int P      = 23;
  localparam int cRES_W = pDAT_W + cCOE_W;

  typedef logic signed [pDAT_W-1 : 0] dat_t ;
  typedef logic signed [cCOE_W-1 : 0] coe_t ;
  typedef logic signed [cRES_W-1 : 0] res_t ;

  localparam coe_t coe [0:P-1] = '{
             -1, //  1
             -2, //  2
              4, //  3
             15, //  4
            -24, //  5
            -76, //  6
            142, //  7
            246, //  8
           -657, //  9
           -501, // 10
           3331, // 11
           6225, // 12
           3331, // 13
           -501, // 14
           -657, // 15
            246, // 16
            142, // 17
            -76, // 18
            -24, // 19
             15, // 20
              4, // 21
             -2, // 22
             -1  // 23
  };

  //-----------------------------------
  //
  //-----------------------------------

  dat_t resample_in = '0;

  res_t mul_result [0: P-1] /*synthesis multstyle = "logic"*/;
  res_t acc        [0: P-1] ;

  //-----------------------------------
  //
  //-----------------------------------

  always_ff @(posedge iclk) begin
    int i;
    if (ival) begin
      resample_in <= idat;
      // mull + 1
      for (i = 0; i < P; i++) begin
        mul_result[i] <= resample_in * coe[P-1-i];
      end
      // add + 64 tap shift reg
      for (i = 0; i < P; i++) begin
        if (i == 0)
          acc [i] <= mul_result[i];
        else
          acc [i] <= mul_result[i] + acc[i-1];
      end
    end
    oval <= ival;
  end

  assign odat = acc[$high(acc)][cRES_W-1 : cRES_W-pDAT_W];

endmodule

 

Как вы видите, ничего сложного нет, обычный фильтр 23го порядка, с симметричной характеристикой, что позволяет сэкономить умножители. Теперь представим себе, что в нашем проекте есть тактовая частота в 250МГц (iclk) и символьная частота в 125МГц (ival). Возьмем, наш любимый сыклон 3 и сделаем такой sdc файл.

derive_clock_uncertainty
create_clock -name clk -period 250MHz [get_ports {iclk}]

собираем, запускаем TimeQuest и видим

облом %). По отчетам видно, что наш фильтр может работать только на частоте не выше 141МГц.

А давайте посмотрим, как именно TimeQuest намерил это. Смотрим критический путь и видим

что TimeQuest использует метод анализа времянок для одиночного цикла(single-cycle analysis). Т.е. он делает анализ, исходя из предположения, что данные изменяются каждый такт, т.е. символьная частота будет 250МГц (или что тоже самое, сигнал ival всегда стоит в единице).

Ну не тупая ли софтинка подумаете вы? Нет не тупая, как я уже неоднократно подчеркивал, TimeQuest анализирует только то, что вы ему указываете. И если вы что-то не указали, то это ваша вина.

Вот как раз для таких случаев и нужен констрейн задания мультициклов. С помощью этого констрейна вы говорите TimeQuestу что у него есть более чем один тактовый цикл для анализа времянки.

Зададим мультицикл самым простым способом. Дописываем в sdc файл строки

set_multicycle_path -from [get_registers {resample_in[*]}] -to [get_registers {mul_result[*]}]  -setup -end 2
set_multicycle_path -from [get_registers {resample_in[*]}] -to [get_registers {mul_result[*]}]  -hold -end 1
set_multicycle_path -from [get_registers {mul_result[*] acc[*]}]  -to [get_registers {acc[*]}]  -setup -end 2
set_multicycle_path -from [get_registers {mul_result[*] acc[*]}]  -to [get_registers {acc[*]}]  -hold -end 1

Запускаем анализ и вуаля

слаки ушли, тактовая частота проекта выросла до 282 МГц. Сплошная ляпота, но надо помнить что на ival нужно подавать меандр, в противном случае схема работать не будет!!!

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Большое спасибо за статью!

Большое спасибо за статью!

Не ошибается лишь тот, кто ничего не делает!

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

Содержание этого поля является приватным и не предназначено к показу.
  • 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>
  • Использовать как разделитель страниц.

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