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 нужно подавать меандр, в противном случае схема работать не будет!!!

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

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

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

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

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <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>
  • Use to create page breaks.

More information about formatting options