TimeQuest для чайников. Приложение 3 (Добрый и злобный Multicycle)
- ПЛИС |
- TimeQuest |
- constrains |
- altera
Поясним, что значат ключи и магические цифры в команде:
- from/to это источник и приемник цепи, на которую накладывается мультицикл. Как вы понимаете, это могут быть только регистры (в комбинационных цепях никаких мультициклов быть не может).
- setup/hold описывает к какому именно временному ограничению относиться указываемая в констрейне величина.
- start/end описывает что констрейн относиться к клоку источнику/приемнику сигнала. Это полезно в том случае, когда клоки разные. Но в нашем случае это не так. Поэтому используем значение по умолчанию (end)
- Цифры означают номер фронта клока приемника, относительно которого будет выполнен расчет. Поясню на примере. При одноцикловом анализе (single-cycle analysis) эти цифры равны 1/0 соответственно. Т.е. анализ по сетапу делается на соседних фронтах, следующих друг за другом, а по холду на одном и том же фронте. В используемом мной примере, я указал, что анализ по сетапу должен делаться со сдвигом на дополнительный фронт клока.
Тут может возникнуть подозрение, что и анализ по холду, тоже должен делаться со сдвигом на один фронт клока. Да так и будет, в том случае, если вы забудете задать констрейн по холду. В этом случае будет использоваться значение по умолчанию (0) и анализ будет не правильным.
Вот что бы такого не было, нужно задать констрейн по холду, который внесет соответствующую поправку. В этом случае анализ будет правильным.
Вот собственно и все про использование мультициклов для внутренней логики. Это была добрая сторона мультицилов. Теперь перейдем к злобной.
Перечисление всех регистров с мультициклами может быть достаточно утомительным занятием. Как бы это оптимизировать?
Один из способов это задание маски имени. Т.е. все регистры должны содержать в имени уникальный префикс/суффикс, по которому их можно будет однозначно задать. Но, такое решение, накладывает ограничение на пространство имен при разработке проекта и плохо подходит к уже существующему проекту.
Другой способ более красивый. Как видно из кода на все регистры источники/приемники приходит сигнал разрешения. Следовательно, для задания ограничений на весь проект можно описать мультицикл так
set_multicycle_path 2 -to [get_fanouts [get_ports {ival}] -through [get_pins -hier *|*ena*]] -setupset_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 ) то применять мультициклы нельзя (!!!) или надо задавать в констрейне не среднее количество тактов, а их минимальное количество между стробами(!!!).
Это и есть злобная сторона мультициклов, которую нужно учитывать при работе %)
- блог пользователя des00
- 22363 просмотра
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Комментарии
Большое спасибо за статью!
Большое спасибо за статью!
Отправить комментарий