Golikov 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба Всем привет! Есть спартан 6, который забить под завязку. Причем последний блок, который бы хотелось туда запихать не лезет. Осталось 300 ЛУТов, при этом свободны все ДСП блоки и немного БРАМов. Огромное количество ЛУТов были съедины на операции типа if(Value >0) Counter <= Counter + 1; else if( Value < 0) Counter <= Counter - 1; if (Value > MAX_VAL_CONSTAN) Value <= MAX_VAL_CONSTAN; if (Value < MIN_VAL_CONSTAN) Value <= MIN_VAL_CONSTAN; assign Out = (Counter1 > Counter2) ? 1'b1 : 1'b0 Это 64 и 32 битная арифметика. Фактически это счетчик с указанным направлением и разрешением счета. Ограничитель величины константой И сравнение 64 битных чисел. Подозреваю что можно как то это сделать на ДСП блоках, и сэкономить ЛУТики, как попросить синтезатор рассмотреть такой вариант? Существует ли такой вариант? Может есть какие-то более легкие и правильные решения моих задач с экономией ЛУТов, только не хотелось бы очень потерять в скорости. Сейчас все работает на 113 МГц (рабочая частота 100), если врубить оптимизацию по размеру, то частота падает до 80 МГц, а этого бы не хотелось, лучше я сделаю какие то операции за 2 такта конвеером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба а если Value = 0, то счетчик ничего не считает ? и откуда Value берется? может можно параллельно ввести еще одну переменную, показывающую знак Value. тогда компараторы будут на 2 разряда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan219 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 (изменено) · Жалоба Если Value это число со знаком то можно вот так попробовать. Counter <= Counter + 1 - {Value[31], 1'd0}; Изменено 29 сентября, 2013 пользователем ivan219 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба при value = 0 счетчик не туда и не суда. сейчас я примерно так и делаю, я выбираю знак, и значение и прибавляю это к счетчику, но сумматором он от этого не стал, а жалко... Counter <= Counter + {Value[31], | Value [30:0]} неужели надо руками ДСП блоки расставлять и теперь вопрос про if (Value > MAX_VAL_CONSTAN) Value <= MAX_VAL_CONSTAN; на дсп блоке сравнение понятно как сделать, вычесть одно из другого и проверить что не поменялся знак. А что дальше? Как в случае если да, присвоение сделать? Мультиплексор - это самое короткое с точки зрения ЛУТов решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба а во что раскладывается строчка if(Value >0) ? в компаратор 32\64 разряда? просто если Value знаковое число, то достаточно смотреть только старший знаковый разряд и проверять равенство на 0, чтобы не считал Counter. как упростить if (Value > MAX_VAL_CONSTAN) Value <= MAX_VAL_CONSTAN; мыслей нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба компараторы 32 и 64 разряда. Их несколько. Тут вообще многие блоки по 5-6 раз повторяются.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба если MAX_VAL_CONSTAN не совсем произвольное число, а имеет четко известные пределы (не больше Х, не меньше Х), то if (Value > MAX_VAL_CONSTAN) тоже можно упростить, сравнивать ограниченное число разрядов чисел MAX_VAL_CONSTAN и Value Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба оно не то что не совсем произвольное, оно совсем не произвольное Допустим Value N бит, то MAX_VAL_CONSTAN это {0,0, (N-2){1}}; то MIN_VAL_CONSTAN это {1,1, (N-3){0}, 1}; то есть это как бы +- максимум от числа на 1 бит меньшей разрядности, при этом есть проблема, что самое маленькое отрицательное число на 1 больше самого большого взятого со знаком минус. И вторая беда, проверка на больше либо равно, опять же заставляет проверять все число, или я не прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба оно не то что не совсем произвольное, оно совсем не произвольное Это все абстрактные рассуждения. Надо смотреть, что конкретно наоптимизировал синтезатор. Потому как он может оказаться как умнее любого инженера на уровне микрооптимизаций, так и жестко зафэйлить что-нибудь. PS А упаковку логики в RAM включать не пробовали? Может это сэкономит чуть-чуть места, чтобы влез оставшийся блок и на этом финита? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Я боюсь что придется все таки мозгом решать. ДСП блоки 48 битные, значит за 1 такт сложение или сравнение 64 бит не сделать. Потому синтезатор никаким образом не соптимизит эту беду... Если просить оптимизить по объему, он все запихивает, но падает частота работы. То есть ресурсы на оптимизацию есть, но надо ими как то грамотно распорядится... Логику в РАМ не пробовал, думаете поможет без потери скорости? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Может есть какие-то более легкие и правильные решения моих задач с экономией ЛУТов, только не хотелось бы очень потерять в скорости. Сейчас все работает на 113 МГц (рабочая частота 100), если врубить оптимизацию по размеру, то частота падает до 80 МГц, а этого бы не хотелось, лучше я сделаю какие то операции за 2 такта конвеером. Может имеет смысл все на партиции разделить. Взять жирный кусок, относительно независимый, без обвязки и попробовать его отдельно скомпилировать с оптимизацией по площади и если из требуемой частоты выбирается - пофиксить. Можно еще попробовать проанализировать критичные пути, если их не очень много, и каким-то образом RTL поменять. К примеру reg [9:0] cnt; always @(posedge clk) cnt<=cnt+10'd1; always @(posedge clk) if (cnt==10'd0) ......... поменять на reg [10:0] cnt; always @(posedge clk) if (cnt[10]) cnt<=11'd1; else cnt<=cnt+11'd1; always @(posedge clk) if (cnt[10]) ......... PS// А какая, кстати, заполненность кристалла при 80МГц? И не могли бы Вы полнее привести алгоритм в виде кода, а то в представленном выше - только отдельные вырезки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akorud 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба на дсп блоке сравнение понятно как сделать, вычесть одно из другого и проверить что не поменялся знак. А что дальше? Как в случае если да, присвоение сделать? Мультиплексор - это самое короткое с точки зрения ЛУТов решение? Можно извратится и сделать присвоение на DSP48 - задать на входах нужные константы и манипулируя opmode переключать входы мультиплексоров X и Z между константой и 0, а post-adder установить в X+Z. Счетчик на нем же можно сделать - режим P +/- CIN. Но придется делать вручную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Вообщем если попросить оптимизить по площади время клока минимальное становится 10.3 нс, при это тратиться всего лишь 90% ЛУТов. Если поставить использовать по максимуму ДСП модули, то опять проседает частота, но все влезает. Там большой проект, и путанный трудно исходники приводить. А как можно попросить синтезатор отдельные модули оптимизить по размеру, а другие по частоте? Потому что есть куча модулей, у которых огромный запас частоты, их бы по площади оптимизнуть, а 2 критических модуля где как раз идет 64 битное суммирование, я бы оптимизнул по скорости... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба В первом приближении можно и даже нужно описать design constraints. Следующий шаг: разбить весь проект на блоки, синтезировать их по-отдельности с той оптимизацией, которая нужна. Потом на верхнем уровне подключить эти ранее синтезированные блоки, как библиотечные компоненты. Это большая работа, т.к. ограничения, включая и пограничные (set_input_delay, set_output_delay и т.п.), придется описывать для каждого блока. Потом можно заняться ручным размещением. Здесь вообще простор для фантазии огромный. Но из того, что Вы тут описываете (32 и 64 бита, многократное дублирование каких-то конструкций), похоже, что структурная оптимизация и оптимизация на уровне RTL-описания еще до конца себя не исчерпали. А как можно попросить синтезатор отдельные модули оптимизить по размеру, а другие по частоте? Потому что есть куча модулей, у которых огромный запас частоты, их бы по площади оптимизнуть, а 2 критических модуля где как раз идет 64 битное суммирование, я бы оптимизнул по скорости... Скорее всего в этом основная причина затруднений Там большой проект, и путанный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Логику в РАМ не пробовал, думаете поможет без потери скорости? Черт знает. Сперва можно попробовать что будет с ресурсами. Если даст достаточный выйгрыш, то можно попробовать решить проблему со скоростью конвейеризацией (регистры на входе/выходе памяти "бесплатные"). Если нет - значит не судьба... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться