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

Поясним, что значат ключи и магические цифры в команде:

  1. from/to это источник и приемник цепи, на которую накладывается мультицикл. Как вы понимаете, это могут быть только регистры (в комбинационных цепях никаких мультициклов быть не может).
  2. setup/hold описывает к какому именно временному ограничению относиться указываемая в констрейне величина.
  3. start/end  описывает что констрейн относиться к клоку источнику/приемнику сигнала. Это полезно в том случае, когда клоки разные. Но в нашем случае это не так. Поэтому используем значение по умолчанию (end)
  4. Цифры означают номер фронта клока приемника, относительно которого будет выполнен расчет. Поясню на примере. При одноцикловом анализе (single-cycle analysis) эти цифры равны 1/0 соответственно. Т.е. анализ по сетапу делается на соседних фронтах, следующих друг за другом, а по холду на одном и том же фронте. В используемом мной примере, я указал, что анализ по сетапу должен делаться со сдвигом на дополнительный фронт клока.

Тут может возникнуть подозрение, что и анализ по холду, тоже должен делаться со сдвигом на один фронт клока. Да так и будет, в том случае, если вы забудете задать констрейн по холду. В этом случае будет использоваться значение по умолчанию (0) и анализ будет не правильным.

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

Вот собственно и все про использование мультициклов для внутренней логики. Это была добрая сторона мультицилов. Теперь перейдем к злобной.

Перечисление всех регистров с мультициклами может быть достаточно утомительным занятием. Как бы это оптимизировать?

Один из способов это задание маски имени. Т.е. все регистры должны содержать в имени уникальный префикс/суффикс, по которому их можно будет однозначно задать. Но, такое решение, накладывает ограничение на пространство имен при разработке проекта и плохо подходит к уже существующему проекту.

Другой способ более красивый. Как видно из кода на все регистры источники/приемники приходит сигнал разрешения. Следовательно, для задания ограничений на весь проект можно описать мультицикл  так

set_multicycle_path 2 -to [get_fanouts [get_ports {ival}] -through [get_pins -hier *|*ena*]] -setup
set_multicycle_path 1 -to [get_fanouts [get_ports {ival}] -through [get_pins -hier *|*ena*]] -hold

Т.е. я воспользовался дополнительной функцией get_fanouts для вычисления всех путей от порта символьной частоты (ival) до сигнала разрешения тактовой частоты триггеров. Использование такого sdc файла дает точно такой же результат, что и использование предыдущего файла.

Казалось бы вот оно счастье, теперь можно просто констрейнить такие схемы. Но вот вам пример, на котором такой способ задания констрейна дает неправильный результат

module multicycle2
  #(parameter int pDAT_W = 16)
  (input  logic iclk, ival, input logic [pDAT_W-1 : 0] idat_re, idat_im,
   output logic oval,       output logic [pDAT_W-1 : 0] power ) ;

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

  localparam int cRES_W = pDAT_W + pDAT_W;

  logic signed [pDAT_W-1 : 0] dat_re;
  logic signed [pDAT_W-1 : 0] dat_im;

  logic signed [pDAT_W-1 : 0] dat2mult;
  logic signed [cRES_W-1 : 0] mult;

  logic signed [cRES_W-1 : 0] pow_re;
  logic signed [cRES_W-1 : 0] pow_im;
  logic signed [cRES_W-1 : 0] pow;

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

  always_ff @(posedge iclk) begin
    if (ival) begin
      dat_re <= idat_re;
      dat_im <= idat_im;
    end

    dat2mult <= ival ? dat_re : dat_im;
    mult     <= dat2mult * dat2mult;

    if (ival)
      pow_re <= mult;
    if (~ival)
      pow_im <= mult;

    if (ival) begin
      pow <= pow_re + pow_im;
    end

    oval <= ival;
  end

  assign power = pow[cRES_W-1 : cRES_W-pDAT_W];

endmodule

Как вы видите из кода пути mult->pow_re, pow_im и pow_im -> pow не мультицикловые (!!!), тогда как  TimeQuest считает наоборот.

В качестве последнего напутствия хочу еще отметить такую особенность мультициклов. Они требуют равномерности поступления сигнала разрешения тактовой частоты. Поясню на примере рассмотренного фильтра. Констрейн будет работать только в том случае, если символьная частота (стробы на порту ival) будет распределена равномерно. Если же это не выполняется (например, это  происходит в цепях восстановления тактовой частоты на основе интерполяторов и NCO ) то применять  мультициклы нельзя (!!!) или надо задавать в констрейне не среднее количество тактов, а их минимальное количество между стробами(!!!).

Это и есть злобная сторона мультициклов, которую нужно учитывать при работе %) 

Комментарии

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

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

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

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

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

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

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

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