Jump to content

    

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) Или все таки может сильно уменьшить размер буфера и вернуться к технологии разбора практически на лету.

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

Edited by new123

Share this post


Link to post
Share on other sites

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

27 minutes ago, new123 said:

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

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites

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

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

 

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

 

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

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

Share this post


Link to post
Share on other sites
8 minutes ago, andrew_b said:

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

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

Share this post


Link to post
Share on other sites
9 minutes ago, andrew_b said:

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

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

 

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites

Эта моя штуковина на вскидку заняла примерно 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

 

Edited by new123

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 minute ago, Lmx2315 said:

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

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

Edited by new123

Share this post


Link to post
Share on other sites

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

8 minutes ago, new123 said:

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

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

2 minutes ago, Lmx2315 said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
4 hours ago, Lmx2315 said:

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

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

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites
5 часов назад, Lmx2315 сказал:

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

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

Share this post


Link to post
Share on other sites

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

4 minutes ago, thermit said:

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

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

6 minutes ago, thermit said:

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

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

Удачи. Rob.

Share this post


Link to post
Share on other sites

Вам не надо заморачиваться такими глупостями. В любом смысле.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this