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

sv, сложность синтеза больших циклов на большом буфере

Форумчане привет.
Разработал я тут код и прибалдел от результата =)).

Что делаю.

1) Имею буфер.
2) Получаю данные в карту и складирую их по-тихоньку в этот буфер
3) Когда насобираю X байт, циклом обхожу этот буфер, размечаю полученные данные, грубо говоря парсю их.

reg [170 - 1:0][7:0] 	buffer_recv;

for (int i = 0; i <= 161; i = i + 1) begin
....
end

Морально, я был готов получить слаки в 3-4 такта. В итоге отхватил слаки в 10-15 тактов. Но это еще не все. Такая штука заняла 80% чипа и 3 часа компиляции (против 40мин). Что гигантски много и неожиданно.

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

Например, что думаю я.
1) Может использовать GENERATE LOOP? Но я прочитал, что generate используется для instance, assign, а это никак вроде не ложится в мою задачу. Цикл просто пробегает у меня и вычленяет нужные значения переменной длины из разных частей буфера
2) Думаю может уменьшить кол-во итераций и разложить все на много циклов, раскидав все по тактам с помощью case
3) Или все таки может сильно уменьшить размер буфера и вернуться к технологии разбора практически на лету.

За любые советы буду признателен.

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

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


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

Приветствую!

27 minutes ago, new123 said:

Разработал я тут код и прибалдел от результата =)).

Мы тоже прибалдели  -  что творится! Совсем синтезаторы совесть потеряли - на "пустом" цикле  10-15 уровне логики лепят! :biggrin:

Или может там под "..." скрывается нечто что  мешает синтезатору честно выполнять свою работу за 3-4 такта? 

Удачи! Rob.

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


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

170 8-битных слов -- это 1 блок памяти.

Что вы там такого написали, что у вас это заняло почти весь чип?

 

reg [170 - 1:0][7:0] 	buffer_recv;

 

Может, надо так написапть?

reg [7:0] buffer_recv [170 - 1:0];

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


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

8 minutes ago, andrew_b said:

Может, надо так написапть?

не поможет. ошибка в консерватории, он за 1 такт обрабатывает все 170 слов.

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


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

9 minutes ago, andrew_b said:

170 8-битных слов -- это 1 блок памяти.

Сдаётся мне, что тот загадочный цикл не дал эти самые слова уложить в блок памяти, а размазал их ровным слоем по тригерам.

 

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


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

Приветствую!

28 minutes ago, andrew_b said:

Что вы там такого написали, что у вас это заняло почти весь чип?

Достаточно написать 

always @(posedge clk) begin
  if (rst) begin 
    buffer_recv <= '0;
  end
  else begin
    ...
    for (int i = 0; i <= 161; i = i + 1) begin
      rdataA <= buffer_recv[i];
      ...
    end
end

и вам обеспечен mux на 170  входов .  И не важно  упакованный это массив или неупакованный. И это без всякой дополнительной обработки. В приступе  вангования могу предположить что там таких rdata* несколько с разными смещениями от i. Соответственно и mux тоже несколько. :cray2:

Удачи! Rob.

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


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

Эта моя штуковина на вскидку заняла примерно 400 RAM блоков и 70т ALM =))

 

Решил все таки не делать буфер и все на лету пробовать делать. И избавиться от этого цикла

1 hour ago, RobFPGA said:

В приступе  вангования могу предположить что там таких rdata*

Схема примерно такая. Сильно не смейтесь =))

Тут все как не надо. И блокирующие присваивания и кучу ветвлений в цикле

for (i..) begin
	ширина_поля = ширина_поля + 1;
	
	if (байт[i] является последним в поле?) begin
          номер_поля = номер_поля + 1

          case (ширина поля)
              3: begin
                  case (номер поля)
                      1:..
                      2:..
                      n...
                  endcase
              end

              4: begin
                  case (номер поля)
                      1:..
                      2:..
                      n...
                  endcase
              end

              N1: begin
                  case (номер поля)
                      1:..
                      2:..
                      n...
                  endcase
              end 

              N2: begin
                  case (номер поля)
                      1:..
                      2:..
                      n...
                  endcase
              end                       
          endcase
          
          ширина_поля = 0
   	 end
end

 

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

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


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

Для общего развития вопрос: Я в систем верилоге не волоку, но что там конструкция с "for" синтезируется как цикл? Такое возможно? А то мне это трудно представить.

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


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

1 minute ago, Lmx2315 said:

но что там конструкция с "for" синтезируется как цикл? Такое возможно? А то мне это трудно представить.

мне уже объяснили что нет. А я так надеялся =)) Не трогал их 2 года и не надо было трогать

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

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


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

Приветствую!

8 minutes ago, new123 said:

Схема примерно такая. Сильно не смейтесь =))

Ну разве что сквозь слезы  :don-t_mention:.  FAST парсим? 

2 minutes ago, Lmx2315 said:

но что там конструкция с "for" синтезируется как цикл? Такое возможно?

Возможно. Во что синтезируется  зависит от контекста применения. Но все же надо уточнить что вы подразумеваете под цикл. 

Удачи! Rob.

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


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

4 hours ago, Lmx2315 said:

"for" синтезируется как цикл? Такое возможно?

А что в схемотехнике понимать под циклом? Огромный мультиплексор со счётчиком включённым на вход выбора порта? Или генерированная конструкция из тучи триггеров с какой-то логикой? Первый вариант в SV нужно так же писать ручками. Второй при правильно объявлении можно через цикл

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


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

Приветствую!

30 minutes ago, Nick_K said:

... Первый вариант в SV нужно так же писать ручками. Второй при правильно объявлении можно через цикл

Первый вариант (mux) тоже можно при помощи цикла описать. 

   mux_out = '0;
   for (int ii=0; ii<N; ++ii) begin
     if (ii==mux_sel) mux_out = mux_in[ii];
   end

Удачи! Rob.

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


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

5 часов назад, Lmx2315 сказал:

Для общего развития вопрос: Я в систем верилоге не волоку, но что там конструкция с "for" синтезируется как цикл? Такое возможно? А то мне это трудно представить.

Такая конструкция в верилоге  единственная синтезируемая конструкция (не знаю как систем-вр), которая выражается в буферном соединении кучи чего-то с кучей чего-то через логику или тупо проводами. В хдл циклов,  в программерском смысле как таковых не бывает. Если только специально этим не заморочиться. Для простого соединения проводами ,без буферизации используется for под generate.

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


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

Приветствую!

4 minutes ago, thermit said:

... В хдл циклов,  в программерском смысле как таковых не бывает ... 

:scratch_one-s_head: что значит цикл в программистском смысле ?

6 minutes ago, thermit said:

Если только специально этим не заморочиться.

Так все же бывают!? :shok:  Если заморочится.  Какая-то странная логика получается (но вполне в HDLстиле -  'х.. знает есть ли программистские циклы или их нет :biggrin:).

Удачи. Rob.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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