Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как уменьшить время распространения сигнала (route)?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Среды разработки - обсуждаем САПРы
Tpeck
Доброго времени суток.
Есть дизайн c LDPC DVBS2 (около 25-30 % процентов ПЛИС), с тактовой частотой 200 МГц.
В проекте много однотипных юнитов.
После P/R с помощью PlanAhead вижу следующую таблицу.
Из неё видно, что значительная часть времянок уходит на route.
Как это время можно уменьшить, не используя loc, rloc, area_group и т. п. ручные механизмы?
А если это не уменьшить, то как грамотно использовать ручные механизмы?
Всем откликнувшимся - спасибо! sm.gif
svedach
Может организовать дополнительные регистры на входах и выходах модулей...
Tpeck
Цитата(svedach @ Jan 22 2018, 14:56) *
Может организовать дополнительные регистры на входах и выходах модулей...


ISE из-за этого будет модули компактнее делать?
Здесь route внутри модуля огромный, из-за "хаотичного" расположения компонента по кристаллу sad.gif
bogaev_roman
Цитата(Tpeck @ Jan 22 2018, 14:26) *
Доброго времени суток.
Есть дизайн c LDPC DVBS2 (около 25-30 % процентов ПЛИС), с тактовой частотой 200 МГц.
В проекте много однотипных юнитов.
После P/R с помощью PlanAhead вижу следующую таблицу.

У Вас временные ограничения не выполняются (они вообще заданы?)? Или Вам просто не нравится процентное соотношение задержек? Что за пути - может там по одному регистру на входе/выходе и сигнал тянется через весь кристалл?
Tpeck
Цитата(bogaev_roman @ Jan 22 2018, 15:28) *
У Вас временные ограничения не выполняются? Или Вам просто не нравится процентное соотношение задержек? Что за пути - может там по одному регистру на входе/выходе и сигнал тянется через весь кристалл?


Не выполняются. Не нравится. Тянется примерно через четверть кристалла. По Триггер->lut->триггер ->lut, fanout 1..4, иногда 2 триггера.
Я бы хоть как-то понял если бы они не выполнялись в такой связке, но даже не пути триггер-триггер не выполняется. 4 строчка в репорте.
Увеличение количества триггеров приведет к резкому увеличению используемых ресурсов.
alexadmin
Цитата(Tpeck @ Jan 22 2018, 15:37) *
Не выполняются. Не нравится. Тянется примерно через четверть кристалла. По Триггер->lut->триггер ->lut, fanout 1..4, иногда 2 триггера.
Я бы хоть как-то понял если бы они не выполнялись в такой связке, но даже не пути триггер-триггер не выполняется. 4 строчка в репорте.
Увеличение количества триггеров приведет к резкому увеличению используемых ресурсов.


Я бы для начала попробовал поиграть с настройками плэйсера (ну и рутера заодно). Если не поможет - фиксировать модули по определенным местам в кристалле через AREA_GROUP. Ну и для начала попробовать ответить на вопрос - какую задачу решает плэйсер распихивая соседние элементы по разным углам...
Tpeck
Цитата(alexadmin @ Jan 22 2018, 15:55) *
Если не поможет - фиксировать модули по определенным местам в кристалле через AREA_GROUP.
Сейчас нахожусь на этой стадии.

Цитата(alexadmin @ Jan 22 2018, 15:55) *
Ну и для начала попробовать ответить на вопрос - какую задачу решает плэйсер распихивая соседние элементы по разным углам...
Тут все зависит от первоначального размещения базовых элементов (?), расположение которых зависит практически от погоды на марсе и магической константы cosе table , если я правильно понял. А остальную мелочь он размещает после размещения базовых элементов.
В проекте много памяти и он раскидал её равномерно по всей окружности. Остальное начинает плясать от этого. Где-то адрес не дотягивается с fanout 8 ибо память к которой адрес идет по половине кристалла раскидана, хотя можно было рядом положить. Где-то данные. Пробовал память группировать с помощью rloc стало только хуже. Пробовал наложить AREA_GROUP, стало только хуже.
Надо какой-то системный подход, а какой я по понять не могу....sad.gif
TRILLER
Основная проблема раскладки проекта в ISE, на мой взгляд, это шины. Т.е. если у Вас сигналы образуют шину, то они будут распиханы по 4 штуки(по умолчанию) в SLICE. Ещё хуже то обстоятельство, что однобитные сигналы одинаковых модулей("empty" для фифо, например), описанных через генерейт(т.е. копи) будут объединены в шину. В итоге у вас большие массивы BRAM в разных углах кристалла будут стоять, а управляющие сигналы к ним будут в одном "месте" biggrin.gif
Как с этим бороться в уже готовом описании я даже не представляю.
В любом случае, советую уделить этой особенности работы маппера особое внимание.
bogaev_roman
Цитата(Tpeck @ Jan 22 2018, 15:37) *
Я бы хоть как-то понял если бы они не выполнялись в такой связке, но даже не пути триггер-триггер не выполняется. 4 строчка в репорте.

Для начала - возьмите один длинный путь от триггера до триггера и проанализируйте кол-во fan-out на выходном триггере этого пути, а также наиболее длинный путь до входного триггера, возможно у Вас дикое кол-во fan-out.
Цитата
В итоге у вас большие массивы BRAM в разных углах кристалла будут стоять, а управляющие сигналы к ним будут в одном "месте" biggrin.gif
Как с этим бороться в уже готовом описании я даже не представляю.

Дублировать логику, можно для этих сигналов ограничить fan-out - тогда компилятор сам все продублирует.
Tpeck
Цитата(TRILLER @ Jan 22 2018, 16:14) *
Основная проблема раскладки проекта в ISE, на мой взгляд, это шины. Т.е. если у Вас сигналы образуют шину, то они будут распиханы по 4 штуки(по умолчанию) в SLICE. Ещё хуже то обстоятельство, что однобитные сигналы одинаковых модулей("empty" для фифо, например), описанных через генерейт(т.е. копи) будут объединены в шину. В итоге у вас большие массивы BRAM в разных углах кристалла будут стоять, а управляющие сигналы к ним будут в одном "месте" biggrin.gif

Управляющие сигнала древовидно разветвляются в две стадии, образуя относительно небольшой fanout.
Вопрос в другом, почему ISE, при исользовании четверти памяти, ставит их в разные углы плисины?


Цитата(bogaev_roman @ Jan 22 2018, 16:20) *
Для начала - возьмите один длинный путь от триггера до триггера и проанализируйте кол-во fan-out на выходном триггере этого пути, а также наиболее длинный путь до входного триггера, возможно у Вас дикое кол-во fan-out.


fan-out = 2.
bogaev_roman
Цитата(Tpeck @ Jan 22 2018, 16:22) *
fan-out = 2.

Это для выхода? Проанализируйте длину этих путей. Думаю, что тут без скриншота не обойтись.
TRILLER
Цитата(Tpeck @ Jan 22 2018, 16:22) *
Вопрос в другом, почему ISE, при исользовании четверти памяти, ставит их в разные углы плисины?

Лично я считаю хорошим тоном приколотить ВСЮ блочную память гвоздями. Несколько сотен штук - не так и много. Зато экономит кучу времени в дальнейшем. И САПРине сильно легчает.
Tpeck
Цитата(bogaev_roman @ Jan 22 2018, 16:27) *
Это для выхода? Проанализируйте длину этих путей. Думаю, что тут без скриншота не обойтись.

Да.
Длина - длинная sm.gif
Тут системная проблема и длинный путь - это следствие.


Цитата(TRILLER @ Jan 22 2018, 16:29) *
Лично я считаю хорошим тоном приколотить ВСЮ блочную память гвоздями. Несколько сотен штук - не так и много. Зато экономит кучу времени в дальнейшем. И САПРине сильно легчает.

А по-какому принципу ее приколачивать?
LOC, Rloc, AREA_GROUP?
Или еще какие-нибудь?

И главное, как её расположить так, чтобы хуже не стало? sm.gif
TRILLER
Цитата(Tpeck @ Jan 22 2018, 16:36) *
А по-какому принципу ее приколачивать?

Как вариант:
INST "*/u_layer_a/u_layer_b/gen_layer_c.0.u_layer_c/u_fifo/u_bram" AREA_GROUP = "pb_0_bram_0";
AREA_GROUP "pb_0_bram_0" RANGE=RAMB36_X7Y60:RAMB36_X7Y61;
INST "*/u_layer_a/u_layer_b/gen_layer_c.1.u_layer_c/u_fifo/u_bram" AREA_GROUP = "pb_0_bram_1";
AREA_GROUP "pb_0_bram_1" RANGE=RAMB36_X7Y62:RAMB36_X7Y63;

u_bram - собственно описание памяти.
П.С.: хотя я всё равно считаю, что проблема в шинах..
Tpeck
Цитата(TRILLER @ Jan 22 2018, 16:41) *
Как вариант:
INST "*/u_layer_a/u_layer_b/gen_layer_c.0.u_layer_c/u_fifo/u_bram" AREA_GROUP = "pb_0_bram_0";
AREA_GROUP "pb_0_bram_0" RANGE=RAMB36_X7Y60:RAMB36_X7Y61;
INST "*/u_layer_a/u_layer_b/gen_layer_c.1.u_layer_c/u_fifo/u_bram" AREA_GROUP = "pb_0_bram_1";
AREA_GROUP "pb_0_bram_1" RANGE=RAMB36_X7Y62:RAMB36_X7Y63;

u_bram - собственно описание памяти.


Значит каждый юнит отдельно...

Цитата(TRILLER @ Jan 22 2018, 16:41) *
П.С.: хотя я всё равно считаю, что проблема в шинах..


В шинах управления?
bogaev_roman
Цитата(Tpeck @ Jan 22 2018, 16:36) *
Тут системная проблема и длинный путь - это следствие.

Судя по описанию, это проблема не кривой разводки и решается она до парсера, на уровне описания алгоритма путем изменения логики и, как было выше описано, добавлением регистров. Вы можете попробовать все банки прибить гвоздями, но без четкого понимания того, каким образом Ваш алгоритм должен лечь на ПЛИС (архитектурно) это приведет только к ухудшения времянки и дополнительному времени разводки.
Цитата
Лично я считаю хорошим тоном приколотить ВСЮ блочную память гвоздями. Несколько сотен штук - не так и много. Зато экономит кучу времени в дальнейшем. И САПРине сильно легчает.

А что если вся эта память управляется из одного места и имеет стыки с интерфейсами типа ethernet или DDR3,которые уже жестко сидят - куда ее прибивать? Нам ТС ничего не поведал об алгоритме.
Tpeck
Цитата(bogaev_roman @ Jan 22 2018, 17:00) *
Судя по описанию, это проблема не кривой разводки и решается она до парсера, на уровне описания алгоритма путем изменения логики и, как было выше описано, добавлением регистров. Вы можете попробовать все банки прибить гвоздями, но без четкого понимания того, каким образом Ваш алгоритм должен лечь на ПЛИС (архитектурно) это приведет только к ухудшения времянки и дополнительному времени разводки.

А что если вся эта память управляется из одного места и имеет стыки с интерфейсами типа ethernet или DDR3,которые уже жестко сидят - куда ее прибивать? Нам ТС ничего не поведал об алгоритме.


Топикстартер ничего не понимает в том о чем он пишет biggrin.gif
Информация принята.
Алгоритм приведен в описание темы.
bogaev_roman
Цитата(Tpeck @ Jan 22 2018, 17:06) *
Топикстартер ничего не понимает в том о чем он пишет biggrin.gif
Информация принята.
Алгоритм приведен в описание темы.

Возможно, я неправильно выразился - отсутствует структурная схема, конкретно проблемный кусок.
Цитата
Есть дизайн c LDPC DVBS2
с точки зрения реализации в итоговой RTL схеме может варьироваться. Обычная линия задержки может иметь несколько вариантов реализации, не зная реализацию, сложно чем-то помочь.
Tpeck
Цитата(bogaev_roman @ Jan 22 2018, 17:34) *
Возможно, я неправильно выразился - отсутствует структурная схема, конкретно проблемный кусок.

Тут не в куске проблема. С проблемным куском я и сам бы разобрался sm.gif
C fan-out глобальных проблем нет.
Структурная схема - Память, сдвигатель, обработчик.
Проблема в том, как вежливо объяснить мапперу, что не надо память равномерно по всему кристаллу раскидывать.
Память размести компактней, сдвигатель поставь после неё, а обработчик поставь после сдвигателя и перед памятью.
А так память раскидал по всему кристаллу и между кристаллами начинает распихивать, сдвигатель, обработчик.
Там становится тесно и бах 90 % времни тратиться на распространение сигнала с fanout 2 .....
PS Белый цвет - это блоки памяти.
iosifk
Цитата(Tpeck @ Jan 24 2018, 11:51) *
Тут не в куске проблема. С проблемным куском я и сам бы разобрался sm.gif
C fan-out глобальных проблем нет.
Структурная схема - Память, сдвигатель, обработчик.
Проблема в том, как вежливо объяснить мапперу, что не надо память равномерно по всему кристаллу раскидывать.
Память размести компактней, сдвигатель поставь после неё, а обработчик поставь после сдвигателя и перед памятью.

А если память взять как инстанс из библиотеки - RAMB32 и т.д. А сдвигатель как SRL32...
И память составлять из кусков не по "адресам", а по "данным"... Тогда не понадобится мультиплексор шины данных от разных кусков памяти....
Tpeck
Цитата(iosifk @ Jan 24 2018, 12:00) *
А если память взять как инстанс из библиотеки - RAMB32 и т.д. А сдвигатель как SRL32...
И память составлять из кусков не по "адресам", а по "данным"... Тогда не понадобится мультиплексор шины данных от разных кусков памяти....

Память и так используется как инстанс.
Используется циклический сдвигатель. Известный как barrel shifter.
Как его сделать на SRL32 не знаю и даже не уверен, что можно.


blackfin
Цитата(Tpeck @ Jan 24 2018, 12:20) *
Используется циклический сдвигатель. Известный как barrel shifter.
Как его сделать на SRL32 не знаю и даже не уверен, что можно.

А сигнал сброса в этом сдвигателе используется?

Xilinx, ug474_7Series_CLB, page 45:
Цитата
Control Signals
• Use control signals only as necessary.
• Avoid using a routed global reset signal and minimize use of local resets to maximize opportunity to use FPGA resources.
• Use active-High control signals.
• Avoid having both set and reset on the same flip-flop.
• Avoid control signals on small shift registers and storage arrays in order to use LUTs instead of flip-flops, to maximize utilization and minimize power.

То есть, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs. /См. UG474, page 50/
Tpeck
Цитата(blackfin @ Jan 24 2018, 12:24) *
А сигнал сброса в этом сдвигателе используется?

нет sm.gif
А нужно?
blackfin
Цитата(Tpeck @ Jan 24 2018, 12:26) *
нет sm.gif
А нужно?

Не нужно.. biggrin.gif
Tpeck
Цитата(blackfin @ Jan 24 2018, 12:34) *
Не нужно.. biggrin.gif

Отлегло disco.gif
blackfin
Цитата(Tpeck @ Jan 24 2018, 11:51) *
Проблема в том, как вежливо объяснить мапперу, что не надо память равномерно по всему кристаллу раскидывать.
Память размести компактней, сдвигатель поставь после неё, а обработчик поставь после сдвигателя и перед памятью.

Использовать Pblocks?
Tpeck
Цитата(blackfin @ Jan 24 2018, 12:24) *
Xilinx, ug474_7Series_CLB, page 45:
То есть, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs. /См. UG474, page 50/

Это-то понятно, но только как с помощью SRL реализовать циклический сдвиг 360-ти 8-битных слов? Да еще и с произвольным шагом. Может быть укажите где на это можно посмотреть?

Цитата(blackfin @ Jan 24 2018, 12:43) *
Использовать Pblocks?

Ключевое слово - вежливо sm.gif
Ведь у проекта будет еще верхний уровень, а у него своя логика и память будет.
А вообще использовал.
Но пока получалось только хуже.
Там получается адовая шина данных и не понятно, что с этим делать.
blackfin
Цитата(Tpeck @ Jan 24 2018, 12:47) *
Это-то понятно, но только как с помощью SRL реализовать циклический сдвиг 360-ти 8-битных слов? Да еще и с произвольным шагом. Может быть укажите где на это можно посмотреть?

Может быть, поможет вот это:
Цитата
Define sets of design elements with U Set (U_SET) or HU Set (HU_SET) constraints.
• Each element of the set is placed in relation to the other elements of the set by Relative Location (RLOC) constraints.
• Logic elements with RLOC constraints and common set names are associated in an RPM.
U_SET, HU_SET, and RLOC constraints:
• Must be defined as properties in the HDL design files.
• Are not supported in Xilinx® Design Constraints format (XDC).

См., UG903 (v2017.4) стр. 156.

И вот ещё:
Цитата
RLOC
Relative Location (RLOC) constraints define the relative placement of logic elements assigned to a set, such as an H_SET, HU_SET, or U_SET.
When RLOC is present in the RTL source files, the H_SET, HU_SET, or U_SET properties get translated into a read-only RPM property on cells in the synthesized netlist. The RLOC property is preserved, but becomes a read-only property after synthesis. For more information on using these properties, and defining RPMs, refer to the Vivado Design Suite
User Guide: Using Constraints (UG903) [Ref 19].

You can define the placement of any element within the set relative to other elements in the set, regardless of the eventual placement of the entire group onto the target device. For example, if RLOC constraints are applied to a group of eight flip-flops organized in a column, the mapper maintains the column and moves the entire group of flip-flops as a single unit.

См, UG912 (v2017.4), стр 307.

И пример для сдвигателя:
Цитата
The following Verilog module defines RLOC and HU_SET properties for the shift register Flops in the module.

См, UG912 (v2017.4), стр.207.

PS:
Цитата
About Relatively Placed Macros
A Relatively Placed Macro (RPM) is a list of basic logic elements (BELs) grouped into a set.
Examples of logic elements include:
• FF
• LUT
• DSP
• RAM
RPMs are primarily used to place small groups of logic close together in order to improve resource efficiency and enable faster interconnections.

См, UG903 (v2017.4), стр 156.

Упс.. Только сейчас заметил, что вся тема про ISE.. Пардон.. wink.gif
RobFPGA
Приветствую!

Увы - алгоритм P&R ISE страдает "размазыванием" логики и BRAM в частности по всему кристаллу. Поэтому сначала нужно зафиксить эту память используя AREA_GROUP.
Необязательно каждый BRAM отдельно - достаточно назначить регион достаточного размера для соответствующих функциональных блоков памяти.
Типа такого:
Код
INST "inst_top/inst_1/inst_name" AREA_GROUP = "AG_inst_name";
#AREA_GROUP "AG_inst_name" RANGE = SLICE_X0Y60:SLICE_X23Y99;
AREA_GROUP "AG_inst_name" RANGE = RAMB18_X0Y24:RAMB18_X1Y39;
AREA_GROUP "AG_inst_name" RANGE = RAMB36_X0Y12:RAMB36_X1Y19, RAMB36_X2Y12:RAMB36_X2Y19;

Обычно за 2-3 итерации P&R находится стабильная конфигурация.
Заодно такой дизайн "гвоздями" обычно сокращает (и значительно) время сборки для больших проектов.

Удачи! Rob.
starley
Цитата(Tpeck @ Jan 22 2018, 15:37) *
Увеличение количества триггеров приведет к резкому увеличению используемых ресурсов.

В ASIC - да, а в ПЛИСе они и так есть, поэтому какой смысл их экономить? Если LUT уже задействован, то триггер под другие сигналы особо уже не используешь, поэтому отказываться от них из экономии в большинстве случаев неразумно. На выходах памяти, предполагающей длинные линии, я обычно ставлю регистры, как раз чтобы потом херней с ее приколачиванием не страдать.Если частоты уж совсем большие, тогда, конечно, только флорпленить остается.
Tpeck
Цитата(starley @ Jan 24 2018, 19:02) *
В ASIC - да, а в ПЛИСе они и так есть, поэтому какой смысл их экономить? Если LUT уже задействован, то триггер под другие сигналы особо уже не используешь, поэтому отказываться от них из экономии в большинстве случаев неразумно. На выходах памяти, предполагающей длинные линии, я обычно ставлю регистры, как раз чтобы потом херней с ее приколачиванием не страдать.Если частоты уж совсем большие, тогда, конечно, только флорпленить остается.

Я их не то чтобы сильно экономлю. У меня на 1 lut два триггера в среднем по проекту sm.gif


Цитата(blackfin @ Jan 24 2018, 12:53) *
Упс.. Только сейчас заметил, что вся тема про ISE.. Пардон.. wink.gif

Это и в ISE есть, так что норм sm.gif
Важны методы, а средства найдутся.

Цитата(RobFPGA @ Jan 24 2018, 13:15) *
Обычно за 2-3 итерации P&R находится стабильная конфигурация.
Заодно такой дизайн "гвоздями" обычно сокращает (и значительно) время сборки для больших проектов.

Спасибо.
А насколько сокращает?
Был час стало полчаса.
Или было три часа, стал час?
RobFPGA
Приветствую!

Цитата(Tpeck @ Jan 24 2018, 19:19) *
...
А насколько сокращает?
Был час стало полчаса.
Или было три часа, стал час?
Все сугубо индивидуально для проекта.
Как пример - Virtex5 sx240t, было ~18 часов стало ~1.5 laughing.gif - но я там не только BRAM фиксировал.

Успехов! Rob.





svedach
ТС. А как у Вас расположены входы и выходы проекта? Может они по всему периметру кристалла раскиданы? И по этому Плейсер раскидывает ресуры по всему кристаллу... Если внутрь модуля залезть не можете/нецелесообразно, то все-таки рекомендую ставить регистры между модулями... Существенно улучшит времянку. Можно попытаться еще мультипатч констрейны использовать...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.