В настоящее время я работаю над проектом с использованием маломощной FPGA Ice40 от Lattice Semiconductor.
Программа для проектирования программирования на ПЛИС называется IceCube2.
Дизайн должен работать на относительно высокой тактовой частоте.
Для некоторых довольно сложных операций мне нужна сниженная частота обновления.
Сейчас я довольно часто читал, что вы должны использовать сигнал включения часов вместе с быстрыми часами, чтобы получить оптимальный результат.
Как следствие, на языке SDC должно быть ограничение многоциклового тактового сигнала, чтобы указать, что у логики есть дополнительное время для выполнения своих задач (поскольку частота обновления уменьшается сигналом включения тактового генератора).
SDC - это язык, полученный из TCL.
Если это ограничение не добавлено, статический анализ синхронизации завершится неудачей.
Однако у меня были некоторые проблемы в течение нескольких месяцев, определяя эти ограничения.
Я не очень понимаю синтаксис SDC, и трудно найти хороший источник по этому поводу.
В icecube2 есть инструмент для генерации кода SDC, но, на мой взгляд, он не очень полезен.
Я пишу свой код в Verilog. В моем дизайне есть модуль верхнего уровня, в котором есть регистры, такие как:
reg MCC2_data_available_irq_o;
reg MCC2_buffer_quarter_irq_o;
Кроме того, я включаю модуль " div_stage_entity ". В этом модуле есть
некоторые регистры, которые выглядят так:
reg [DIVISOR_BIT_WIDTH+QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0] MCC2_minu [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0];
reg [DIVISOR_BIT_WIDTH-1:0] MCC2_subtra [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS:0];
reg [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0] MCC2_quot [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0];
Я добавил префикс имени MCC2 , чтобы указать, что ограничение синхронизации должно применяться к этим регистрам. Редактор ограничений в Icecube теперь выводит код SDC, который выглядит следующим образом:
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.MCC2_subtra_2_[12]/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.MCC2_subtra_0_[1]/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.genblk3[1].MCC2_minu[1][8]/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.genblk3[1].MCC2_minu[1][12]/D}] 2
весь файл имеет длину около 300 строк. Поддержание этого файла было бы полной болью. Поэтому я хочу объединить эти ограничения вместе.
Я хотел бы иметь что-то вроде:
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {MCC2_*/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.MCC2_*/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.genblk*.MCC2_*/D}] 2
Однако эти ограничения игнорируются. Когда я запускаю проверку синхронизации, я получаю пути, которые не соответствуют синхронизации.
Отчет выглядит так:
Start read_adr_freeze_4_LC_10_5_3/lcout
End MCC2_data_available_irq_o_LC_14_1_2/in3
Reference clk_f
Setup Constraint 11240(p)
Path Slack -2985(p)
Capture Clock Arrival Time(clk_f:R#2) 11240
+ Master Clock Source Latency 0
+ Capture Clock Path Delay 3512
- Setup Time -728
------------------------------------ --------
End-of-path required time (ps) 14023
Launch Clock Arrival Time(clk_f:R#1) 0
+ Master Clock Source Latency 0
+ Launch Clock Path Delay 3512
+ Clock To Q 1391
+ Data Path Delay 12106
------------------------------------ --------
End-of-path arrival time (ps) 17008
Отрицательный провал указывает, что путь не прошел проверку синхронизации. Если ограничение было применено правильно,
время прибытия часов захвата должно быть ~ 22 нс (время цикла 11,1 нс). Время прибытия в отчет 11,24 нс. Это указывает на то, что ограничение не было применено вообще.
Кроме того, отображаемый путь не заканчивается регистром (будет показывать "/ D"), но где-то в комбинаторной логике ("/ in3").
Для меня более поздняя часть не имеет никакого смысла. Я уверен, что это регистр, а не какая-то защелка.
Как я могу объединить подобные ограничения вместе? Похоже, что IceCube имеет ограниченную поддержку для подстановочных знаков, есть ли другая возможность? И кто-нибудь знает, что может означать этот странный отчет о времени?