TimeQuest для чайников. Приложение 3 (Добрый и злобный Multicycle)
- ПЛИС |
- TimeQuest |
- constrains |
- altera
Добрый день уважаемый читатель.
В предыдущих блогах я рассказывал о том, что есть волшебный констрейн 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_uncertaintycreate_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 2set_multicycle_path -from [get_registers {resample_in[*]}] -to [get_registers {mul_result[*]}] -hold -end 1set_multicycle_path -from [get_registers {mul_result[*] acc[*]}] -to [get_registers {acc[*]}] -setup -end 2set_multicycle_path -from [get_registers {mul_result[*] acc[*]}] -to [get_registers {acc[*]}] -hold -end 1
Запускаем анализ и вуаля
слаки ушли, тактовая частота проекта выросла до 282 МГц. Сплошная ляпота, но надо помнить что на ival нужно подавать меандр, в противном случае схема работать не будет!!!
- блог пользователя des00
- 21845 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика 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 на русский микропроцессор КРОЛИК
Комментарии
Большое спасибо за статью!
Большое спасибо за статью!
Отправить комментарий