Перейти к содержанию
    

Сумма и сравнение, экономия ЛУТов

Всем привет!

 

Есть спартан 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 такта конвеером.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если Value = 0, то счетчик ничего не считает ?

и откуда Value берется? может можно параллельно ввести еще одну переменную, показывающую знак Value. тогда компараторы будут на 2 разряда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Value это число со знаком то можно вот так попробовать.

 Counter <= Counter  + 1 - {Value[31], 1'd0};

Изменено пользователем ivan219

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при value = 0 счетчик не туда и не суда.

 

сейчас я примерно так и делаю, я выбираю знак, и значение

и прибавляю это к счетчику, но сумматором он от этого не стал, а жалко...

 

Counter <= Counter + {Value[31], | Value [30:0]}

 

неужели надо руками ДСП блоки расставлять

 

и теперь вопрос про

 

if (Value > MAX_VAL_CONSTAN)
  Value <= MAX_VAL_CONSTAN;

 

на дсп блоке сравнение понятно как сделать, вычесть одно из другого и проверить что не поменялся знак. А что дальше? Как в случае если да, присвоение сделать? Мультиплексор - это самое короткое с точки зрения ЛУТов решение?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а во что раскладывается строчка

if(Value >0)

?

в компаратор 32\64 разряда?

просто если Value знаковое число, то достаточно смотреть только старший знаковый разряд и проверять равенство на 0, чтобы не считал Counter.

 

как упростить

if (Value > MAX_VAL_CONSTAN)
  Value <= MAX_VAL_CONSTAN;

мыслей нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

компараторы 32 и 64 разряда. Их несколько. Тут вообще многие блоки по 5-6 раз повторяются....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если MAX_VAL_CONSTAN не совсем произвольное число, а имеет четко известные пределы (не больше Х, не меньше Х), то

if (Value > MAX_VAL_CONSTAN)

тоже можно упростить, сравнивать ограниченное число разрядов чисел MAX_VAL_CONSTAN и Value

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оно не то что не совсем произвольное, оно совсем не произвольное

 

Допустим Value N бит,

то MAX_VAL_CONSTAN это {0,0, (N-2){1}};

то MIN_VAL_CONSTAN это {1,1, (N-3){0}, 1};

то есть это как бы +- максимум от числа на 1 бит меньшей разрядности,

 

при этом есть проблема, что самое маленькое отрицательное число на 1 больше самого большого взятого со знаком минус. И вторая беда, проверка на больше либо равно, опять же заставляет проверять все число, или я не прав?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оно не то что не совсем произвольное, оно совсем не произвольное

 

Это все абстрактные рассуждения. Надо смотреть, что конкретно наоптимизировал синтезатор. Потому как он может оказаться как умнее любого инженера на уровне микрооптимизаций, так и жестко зафэйлить что-нибудь.

 

PS А упаковку логики в RAM включать не пробовали? Может это сэкономит чуть-чуть места, чтобы влез оставшийся блок и на этом финита?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я боюсь что придется все таки мозгом решать. ДСП блоки 48 битные, значит за 1 такт сложение или сравнение 64 бит не сделать. Потому синтезатор никаким образом не соптимизит эту беду... Если просить оптимизить по объему, он все запихивает, но падает частота работы. То есть ресурсы на оптимизацию есть, но надо ими как то грамотно распорядится...

 

Логику в РАМ не пробовал, думаете поможет без потери скорости?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может есть какие-то более легкие и правильные решения моих задач с экономией ЛУТов, только не хотелось бы очень потерять в скорости. Сейчас все работает на 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МГц?

И не могли бы Вы полнее привести алгоритм в виде кода, а то в представленном выше - только отдельные вырезки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на дсп блоке сравнение понятно как сделать, вычесть одно из другого и проверить что не поменялся знак. А что дальше? Как в случае если да, присвоение сделать? Мультиплексор - это самое короткое с точки зрения ЛУТов решение?

Можно извратится и сделать присвоение на DSP48 - задать на входах нужные константы и манипулируя opmode переключать входы мультиплексоров X и Z между константой и 0, а post-adder установить в X+Z.

Счетчик на нем же можно сделать - режим P +/- CIN.

Но придется делать вручную.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем если попросить оптимизить по площади время клока минимальное становится 10.3 нс, при это тратиться всего лишь 90% ЛУТов.

Если поставить использовать по максимуму ДСП модули, то опять проседает частота, но все влезает.

 

 

Там большой проект, и путанный трудно исходники приводить.

 

 

А как можно попросить синтезатор отдельные модули оптимизить по размеру, а другие по частоте? Потому что есть куча модулей, у которых огромный запас частоты, их бы по площади оптимизнуть, а 2 критических модуля где как раз идет 64 битное суммирование, я бы оптимизнул по скорости...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В первом приближении можно и даже нужно описать design constraints.

 

Следующий шаг: разбить весь проект на блоки, синтезировать их по-отдельности с той оптимизацией, которая нужна.

Потом на верхнем уровне подключить эти ранее синтезированные блоки, как библиотечные компоненты. Это большая работа, т.к. ограничения, включая и пограничные (set_input_delay, set_output_delay и т.п.), придется описывать для каждого блока.

 

Потом можно заняться ручным размещением. Здесь вообще простор для фантазии огромный.

 

Но из того, что Вы тут описываете (32 и 64 бита, многократное дублирование каких-то конструкций), похоже, что структурная оптимизация и оптимизация на уровне RTL-описания еще до конца себя не исчерпали.

 

А как можно попросить синтезатор отдельные модули оптимизить по размеру, а другие по частоте? Потому что есть куча модулей, у которых огромный запас частоты, их бы по площади оптимизнуть, а 2 критических модуля где как раз идет 64 битное суммирование, я бы оптимизнул по скорости...

 

Скорее всего в этом основная причина затруднений

 

Там большой проект, и путанный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Логику в РАМ не пробовал, думаете поможет без потери скорости?

 

Черт знает. Сперва можно попробовать что будет с ресурсами. Если даст достаточный выйгрыш, то можно попробовать решить проблему со скоростью конвейеризацией (регистры на входе/выходе памяти "бесплатные"). Если нет - значит не судьба...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...