|
TimeQuest, кто ж тебя выдумал?, поговорим на простом нестандартном примере |
|
|
|
Jan 7 2018, 11:06
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Возясь со своим реальным проектом, сделал простой учебный. Пытаюсь разобраться в констрейнах (хотя некогда считал себя достаточно грамотным в этой теме). Вот SystemVerilog проект. Ниже - констрейны для него. Работаю в Quartus 13.1, ПЛИС EP3C5E144I7. Код module ClockDivider ( (* chip_pin = "84" *) input ResetN, (* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn, (* chip_pin = "28" *) output ClkOut, (* chip_pin = "30" *) input ClkSel, (* chip_pin = "32" *) input DataIn, (* chip_pin = "33" *) output DataOut );
bit ClkDiv; always_ff @(posedge ClkIn, negedge ResetN) if (!ResetN) ClkDiv <= 0; else ClkDiv <= !ClkDiv;
always_comb if (!ClkSel) ClkOut = ClkIn; else ClkOut = ClkDiv; always_ff @(posedge ClkOut, negedge ResetN) if (!ResetN) DataOut <= 0; else DataOut <= DataIn;
endmodule : ClockDivider Код set_time_format -unit ns -decimal_places 3
create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn
create_clock -name clk_virt -period "100 MHz"
create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn
# derive_clocks
derive_clock_uncertainty
set_input_delay -clock clk_virt -min 0.0 ClkSel set_input_delay -clock clk_virt -max 1.0 ClkSel
set_input_delay -clock clk_virt -min 0.0 ResetN set_input_delay -clock clk_virt -max 1.0 ResetN
set_input_delay -clock clk_virt -min 0.0 DataIn set_input_delay -clock clk_virt -max 1.0 DataIn
set_output_delay -clock clk_virt -min -2.0 ClkOut set_output_delay -clock clk_virt -max -1.0 ClkOut
set_output_delay -clock clk_virt -min -2.0 DataOut set_output_delay -clock clk_virt -max -1.0 DataOut Вопросы. Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере? Почему для выходных сигналов пришлось сделать отрицательную задержку, иначе ограничения не выполнялись? Когда смотрел в TimeQuest временнЫе пути, Launch Clock запускался по срезу. Прикладываю картину ниже. Правильные ли вообще эти констрейны? Любые советы почитаю с интересом. (К сожалению, ответить смогу только завтра, ибо предстоит культурное мероприятие). Вот картина-отчет. Как ее интерпретировать? Нужно ли описывать сигнал после мультиплексора как тактовый? Пишут, вроде, нужно. А что же TimeQuest не ругается?
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Jan 7 2018, 16:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
текст, помеченный тегами [ b ] [ /b ] - моя писанина. Код module ClockDivider ( [b] // Блин эти аттрибуты бы вывести нахрен в топ-левел. и в топ-левел должны остаться только связи между модулями. никакой логики, а то это какой-то базар-вокзал.[/b] [b] // хуже того, заранее становится проблемой, к чему конкретно привяжутся констрейны. как обычно беда в названиях и их поиске и назначении констрейнов[/b] [b] // на соответствующие физические ячейки квартусом. всё не найденное будет проигнорировано.[/b] (* chip_pin = "84" *) input ResetN, (* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn, [b] // вот это я так понимаю фигня из соседней темы[/b] (* chip_pin = "28" *) output ClkOut, (* chip_pin = "30" *) input ClkSel, (* chip_pin = "32" *) input DataIn, (* chip_pin = "33" *) output DataOut );
bit ClkDiv; always_ff @(posedge ClkIn, negedge ResetN) if (!ResetN) ClkDiv <= 0; else ClkDiv <= !ClkDiv; [b]// тут видно что ClkDiv тикает от ClkIn. ок. заделили пополам. ставим себе пометку - на температуре поплывёт.[/b]
always_comb if (!ClkSel) ClkOut = ClkIn; [b]// тут видна достаточно конкретная жопа в случае с насасыванием со входа ClkSel "иголок" и прочего мусора[/b] else ClkOut = ClkDiv; [b]// если нужно стабильное поведение, ClkSel должен быть предварительно прорегистрен, хотя бы через double-flop[/b] [b]// далее, тут же видна жопа с моментом переключения из одного состояния в другое. следующим блокам просто необходим сигнал сброса при таком переключении[/b] [b]// если всё же необходимо изменять частоту без сброса, есть специальные техники glitch-free clock switching[/b] always_ff @(posedge ClkOut, negedge ResetN) if (!ResetN) DataOut <= 0; else DataOut <= DataIn; [b]// тут видно что DataOut тикает вместе с DataIn по ClkOut. в принципе тоже ок, но будет нормально работать только [/b] [b]// при отсутствии "иголок" и glitch-free переключениях частоты при помощи ClkSel)[/b]
endmodule : ClockDivider Код set_time_format -unit ns -decimal_places 3
create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn [b]# OK. здесь квартус действительно увидит что 100 МГц действительно зашло на вход ClkIn.[/b]
create_clock -name clk_virt -period "100 MHz" [b]# OK. создали "нечто" никуда не назначенное.[/b]
create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn [b]# OK. тактовую создали, название дали, источник показали. куда она дальше расходится будет - квартус не поймёт. нужна будет ещё одна подсказка.[/b]
# derive_clocks
derive_clock_uncertainty [b]# приняли значения по умолчанию из шаблона конкретной модели ПЛИС. ОК.[/b]
set_input_delay -clock clk_virt -min 0.0 ClkSel [b]# не понятно что имелось ввиду # здесь фактически указано, что снаружи ПЛИС задержка от 0 до 1 нс[/b] set_input_delay -clock clk_virt -max 1.0 ClkSel [b]# поэтому нужно скорректировать её на внутренней логике от пинов до входов always_ff и always_comb где-то внутри по ресурсам ПЛИС[/b] [b]# но поскольку clk_virt ни к чему не привязан, квартус ничего не понимает[/b]
set_input_delay -clock clk_virt -min 0.0 ResetN [b]# аналогично не понятно что имелось ввиду[/b] set_input_delay -clock clk_virt -max 1.0 ResetN
set_input_delay -clock clk_virt -min 0.0 DataIn [b]# аналогично не понятно что имелось ввиду[/b] set_input_delay -clock clk_virt -max 1.0 DataIn
set_output_delay -clock clk_virt -min -2.0 ClkOut [b]# аналогично не понятно что имелось ввиду[/b] set_output_delay -clock clk_virt -max -1.0 ClkOut
set_output_delay -clock clk_virt -min -2.0 DataOut [b]# аналогично не понятно что имелось ввиду[/b] set_output_delay -clock clk_virt -max -1.0 DataOut с учетом вышесказанного - "более-менее" это хозяйство будет работать на частоте не выше 5...10 МГц. Для 100/50 придётся переделывать. на ClkOut констрейн не назначился - квартус его не нашел, возможно, из-за больших/маленьких букв, возможно из-за того что всё это в топ-модуле (или нет? отсюда не видно) поэтому на DataOut будет фигня от сборки к сборке.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
Сообщений в этой теме
ViKo TimeQuest, кто ж тебя выдумал? Jan 7 2018, 11:06 Flip-fl0p А разве не надо писать констрейн между вашим клоко... Jan 7 2018, 11:27 ViKo Виртуальные такты - всегда снаружи ПЛИС. Ничего бо... Jan 7 2018, 11:47 Alexey_Rostov Цитата(ViKo @ Jan 7 2018, 14:06) Вопросы.... Jan 7 2018, 15:48 ViKo Видимо, Tclk-q?
Эти времена понятны. Но разве я их... Jan 7 2018, 15:56 Flip-fl0p Вообще, если я не ошибаюсь то для мультиплексирова... Jan 7 2018, 17:59 ViKo krux, по делу есть чего сказать?
Это и есть top.
Н... Jan 7 2018, 18:03 Flip-fl0p А можно уточняющий вопрос ?
Задача учебного проект... Jan 7 2018, 18:28 Shivers Пример плохой, потому что мультиплексор клоков в н... Jan 7 2018, 18:46 krux ViKo
по делу - выкинуть и переписать.
но для нача... Jan 7 2018, 18:53 ViKo Жажду увидеть правильные констрейны. Выкинуть любо... Jan 7 2018, 19:31 krux я понял в чем проблема, в вашем чипе CLKCTRL так к... Jan 7 2018, 19:46 ViKo Насчет виртуальных тактов. Уже выбросил, заменил н... Jan 8 2018, 13:03 Flip-fl0p Цитата(ViKo @ Jan 8 2018, 16:03) Однако, ... Jan 9 2018, 05:46 wolfman А если взять другую версию Квартуса? Jan 9 2018, 07:36 _Anatoliy . Jan 9 2018, 07:38 ViKo Цитата(wolfman @ Jan 9 2018, 10:36) А есл... Jan 9 2018, 07:52 warrior-2001 На клоковый вход блока DataOut подан не клок! ... Jan 9 2018, 12:36 ViKo Кодset_time_format -unit ns -decimal_places 3
# c... Jan 9 2018, 12:42 warrior-2001 Цитата(ViKo @ Jan 9 2018, 15:42) Вам на т... Jan 10 2018, 09:23  ViKo Цитата(warrior-2001 @ Jan 10 2018, 12... Jan 10 2018, 09:42  andrew_b Цитата(warrior-2001 @ Jan 10 2018, 12... Jan 10 2018, 09:48 Flip-fl0p Я как понял ваших данных работает на частоте clk_d... Jan 9 2018, 13:03 ViKo Цитата(Flip-fl0p @ Jan 9 2018, 16:03... Jan 9 2018, 13:05  Flip-fl0p Цитата(ViKo @ Jan 9 2018, 16:05) А я же ц... Jan 9 2018, 13:15   ViKo Цитата(Flip-fl0p @ Jan 9 2018, 16:15... Jan 9 2018, 13:23 Flip-fl0p Меня вот один вопрос мучает. А как Timequest поним... Jan 10 2018, 10:19 ViKo Цитата(Flip-fl0p @ Jan 10 2018, 13:1... Jan 10 2018, 10:26 ViKo В результате изучения литературы сделал следующие ... Jan 10 2018, 13:20 _Anatoliy Цитата(ViKo @ Jan 10 2018, 16:20) Вот, ка... Jan 11 2018, 06:15  ViKo Цитата(_Anatoliy @ Jan 11 2018, 09:15) Зд... Jan 11 2018, 07:45   dima32rus Цитата(ViKo @ Jan 11 2018, 10:45) и в дор... Jan 11 2018, 09:45    ViKo Цитата(dima32rus @ Jan 11 2018, 12:45) Не... Jan 11 2018, 10:02     dima32rus Цитата(ViKo @ Jan 11 2018, 13:02) # Задер... Jan 11 2018, 10:45      _Anatoliy Цитата(dima32rus @ Jan 11 2018, 13:45) Пр... Jan 11 2018, 10:52       ViKo Цитата(_Anatoliy @ Jan 11 2018, 13:52) Дл... Jan 11 2018, 10:54       dima32rus Цитата(_Anatoliy @ Jan 11 2018, 13:52) Дл... Jan 11 2018, 11:50        ViKo Цитата(dima32rus @ Jan 11 2018, 14:50) AD... Jan 11 2018, 11:55         dima32rus Цитата(ViKo @ Jan 11 2018, 14:55) Во-перв... Jan 11 2018, 12:02 Shivers Виртуальный клок нужен чтобы достроить граф STA на... Jan 11 2018, 05:30 Flip-fl0p Вот наткнулся на интересную штуку по констрейнам: ... Jan 16 2018, 10:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|