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

Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится..

     if irq(0) = '1' then
      if det1flg(0) = '1' then
       fd_buf <=   dout1(0); 
      elsif det2flg(0) = '1' then 
       fd_buf <=   dout2(0); 
      elsif det3flg(0) = '1' then 
       fd_buf <=   dout3(0);
     end if;
    elsif irq(1) = '1' then
      if det1flg(1) = '1' then
       fd_buf <=   dout1(1); 
      elsif det2flg(1) = '1' then 
       fd_buf <=   dout2(1); 
      elsif det3flg(1) = '1' then 
       fd_buf <=   dout3(1);
     end if;
    elsif irq(2) = '1' then
      if det1flg(2) = '1' then
       fd_buf <=   dout1(2); 
      elsif det2flg(2) = '1' then 
       fd_buf <=   dout2(2); 
      elsif det3flg(2) = '1' then 
       fd_buf <=   dout3(2);
     end if;
    elsif irq(3) = '1' then
      if det1flg(3) = '1' then
       fd_buf <=   dout1(3); 
      elsif det2flg(3) = '1' then 
       fd_buf <=   dout2(3); 
      elsif det3flg(3) = '1' then 
       fd_buf <=   dout3(3);
     end if;
    end if;

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

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


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

Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится..

     if irq(0) = '1' then
      if det1flg(0) = '1' then
       fd_buf <=   dout1(0); 
      elsif det2flg(0) = '1' then 
       fd_buf <=   dout2(0); 
      elsif det3flg(0) = '1' then 
       fd_buf <=   dout3(0);
     end if;
    elsif irq(1) = '1' then
      if det1flg(1) = '1' then
       fd_buf <=   dout1(1); 
      elsif det2flg(1) = '1' then 
       fd_buf <=   dout2(1); 
      elsif det3flg(1) = '1' then 
       fd_buf <=   dout3(1);
     end if;
    elsif irq(2) = '1' then
      if det1flg(2) = '1' then
       fd_buf <=   dout1(2); 
      elsif det2flg(2) = '1' then 
       fd_buf <=   dout2(2); 
      elsif det3flg(2) = '1' then 
       fd_buf <=   dout3(2);
     end if;
    elsif irq(3) = '1' then
      if det1flg(3) = '1' then
       fd_buf <=   dout1(3); 
      elsif det2flg(3) = '1' then 
       fd_buf <=   dout2(3); 
      elsif det3flg(3) = '1' then 
       fd_buf <=   dout3(3);
     end if;
    end if;

что Вам в этом описании не нравиться?

 

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


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

Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится..

     if irq(0) = '1' then
      if det1flg(0) = '1' then
       fd_buf <=   dout1(0); 
      elsif det2flg(0) = '1' then 
       fd_buf <=   dout2(0); 
.....
      elsif det3flg(3) = '1' then 
       fd_buf <=   dout3(3);
     end if;
    end if;

 

На верилоге я бы сделал

casex

и далее в виде таблички с нулями и единицами....

 

always @(inst) begin

casex (inst) // synopsys parallel_case

/*

d i l w w d p j s p p p p a

i n o r a s s m k o u o u c

s p o _ i _ _ p i p s p s c

p u p s t c c p _ h _ h _

l t _ t _ n n r _ d _ o

_ _ d r s t t e r a d p

o p e o t t e t a

p s c b a t t

r e t

e */

8'b X_X_X_00000 : decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_0_0; // NOP

8'b X_X_X_00001 : decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_0_1; // ACC

8'b X_X_X_00100 : decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_1_0; // PUSH

8'b X_X_X_00101 : decodes = 14'b 0_0_0_1_0_0_0_0_0_0_0_1_0_0; // POP

 

8'b X_0_X_10011 : decodes = 14'b 0_0_0_0_0_0_1_0_1_0_0_0_0_0; // SKPFL0 = SKIP + Flag = false

8'b X_1_X_10011 : decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_0_0; // SKPFL0 = SKIP + Flag = true

 

8'b 0_X_X_10100 : decodes = 14'b 0_0_1_0_0_0_1_0_1_0_0_0_0_0; // SKPLP0 = SKIP + Loop = false

8'b 1_X_X_10100 : decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_0_0; // SKPLP0 = SKIP + Loop = true

 

default:

decodes = 14'b 0_0_0_0_0_0_0_0_0_0_0_0_0_0;

endcase

 

 

То, что в комментариях, должно быть "по вертикали" над нужной позицией из такого - 14'b 0_0_1_0_0_0_1_0_1_0_0_0_0_0;... Просто тут форматирование текста не поддерживается...

И остается только там, где нужно проставить "1"...

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


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

длинновато :laughing:

Не то слово. Не читается с ходу, а значит, что могут быть ошибки...

 

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


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

На верилоге я бы сделал

casex

э-э не...

Вот если бы case поддерживал break, тогда да, наверное помогло бы... У меня же по сути приоритетный шифратор, если к примеру irq(0) = '1', то всё, дальше не идем...

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


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

э-э не...

Вот если бы case поддерживал break, тогда да, наверное помогло бы... У меня же по сути приоритетный шифратор, если к примеру irq(0) = '1', то всё, дальше не идем...

У Вас 3 запроса, 8 комбинаций и что? Зачем Вам break, если из 8-ми строк выполнится только одна?

 

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


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

У Вас 3 запроса, 8 комбинаций и что? Зачем Вам break, если из 8-ми строк выполнится только одна?

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

на vhdl это будет выглядеть как-то так:

case (<2-bit select>) is

when "00" =>

<statement>;

when "01" =>

<statement>;

when "10" =>

<statement>;

when "11" =>

<statement>;

when others =>

<statement>;

end case;

 

То есть просто аналогия конструкции if-else, которую я использовал

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

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


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

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

на vhdl это будет выглядеть как-то так:

case (<2-bit select>) is

when "00" =>

<statement>;

when "01" =>

<statement>;

when "10" =>

<statement>;

when "11" =>

<statement>;

when others =>

<statement>;

end case;

 

То есть просто аналогия конструкции if-else, которую я использовал

 

Если скайп есть, то я могу просто показать рабочий стол и дать комментарии... Так проще будет...

 

decoder.jpg

 

Вот так делаете, как я уже написал...

 

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


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

Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится..

     if irq(0) = '1' then
      if det1flg(0) = '1' then
       fd_buf <=   dout1(0); 
      elsif det2flg(0) = '1' then 
       fd_buf <=   dout2(0); 
      elsif det3flg(0) = '1' then 
       fd_buf <=   dout3(0);
     end if;
    elsif irq(1) = '1' then

В VHDL же есть exit loop. Извините, не могу по-быстрому отступы правильно расставить из-за вашей табуляции.

selection_loop:
     for i in 0 to 3 loop
     if irq(i) = '1' then
      if det1flg(i) = '1' then
       fd_buf <=   dout1(i); 
      elsif det2flg(i) = '1' then 
       fd_buf <=   dout2(i); 
      elsif det3flg(i) = '1' then 
       fd_buf <=   dout3(i);
      end if;
         exit selection_loop;
        end if;
     end loop;

 

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


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

Оптимизировать текст работающего блока - последнее дело, т.к. никакого выигрыша это времяпрепровождение не дает. Только потраченное время и возможность налепить ошибок.

Все, что может быть нужно, - это написать unit test.

 

Но если уж так хочется, то сначала нужно поставить приоритетный шифратор для irq, а потом, в зависимости от его выхода выбирать биты из detXflg и doutX. С системной точки зрения это более понятно, чем столбик из if-elsif.

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


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

В VHDL же есть exit loop. Извините, не могу по-быстрому отступы правильно расставить из-за вашей табуляции.

странно, в language templates (ISE 8.2) про это не сказано. Надо будет попробовать . спасибо

 

Если скайп есть, то я могу просто показать рабочий стол и дать комментарии... Так проще будет...

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

Да, пожалуй, принципиально упростить можно только с помощью цикла

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

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


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

Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится..

     if irq(0) = '1' then
      if det1flg(0) = '1' then
       fd_buf <=   dout1(0); 
      elsif det2flg(0) = '1' then 
       fd_buf <=   dout2(0); 
      elsif det3flg(0) = '1' then 
       fd_buf <=   dout3(0);
     end if;
    elsif irq(1) = '1' then
      if det1flg(1) = '1' then
       fd_buf <=   dout1(1); 
      elsif det2flg(1) = '1' then 
       fd_buf <=   dout2(1); 
      elsif det3flg(1) = '1' then 
       fd_buf <=   dout3(1);
     end if;
    elsif irq(2) = '1' then
      if det1flg(2) = '1' then
       fd_buf <=   dout1(2); 
      elsif det2flg(2) = '1' then 
       fd_buf <=   dout2(2); 
      elsif det3flg(2) = '1' then 
       fd_buf <=   dout3(2);
     end if;
    elsif irq(3) = '1' then
      if det1flg(3) = '1' then
       fd_buf <=   dout1(3); 
      elsif det2flg(3) = '1' then 
       fd_buf <=   dout2(3); 
      elsif det3flg(3) = '1' then 
       fd_buf <=   dout3(3);
     end if;
    end if;

 

Конкретно в данном случае "глаза мозолит" индекс разряда операндов. Поэтому, если навскидку, исходя из данных разрядностей, количества операндов и т.д., оптимальное решение мне видится каким-то таким:

 

architecture RTL of optimization is
    signal irq_idx : integer;
begin

    irq_idx <= 0 when irq(0) = '1' else 1 when irq(1) = '1' else 2 when irq(2) = '1' else 3; -- (i.e. when irq(3) = '1', but be sure irq /= 0);

    process(CLK) begin
        if (CLK'Event and (CLK = '1')) then
            if (irq /= "0000") then
                if    det1flg(irq_idx) = '1' then
                    fd_buf <=   dout1(irq_idx); 
                elsif det2flg(irq_idx) = '1' then 
                    fd_buf <=   dout2(irq_idx); 
                elsif det3flg(irq_idx) = '1' then 
                    fd_buf <=   dout3(irq_idx);
                end if;
            end if;
        end if;
    end process;
     
end RTL;

 

За соответствие поведения исходному варианту ни капли не ручаюсь, я только показал ход мысли. Тест-бенчи, юнит-тесты прояснят ситуацию. ну или вдумчивый анализ...

PS: вариант, как писал выше, -- "навскидку". Можно и компактнее сделать в случае, если изменятся условия задачи. Можно и функции, и циклы прикрутить.

 

Но если уж так хочется, то сначала нужно поставить приоритетный шифратор для irq, а потом, в зависимости от его выхода выбирать биты из detXflg и doutX. С системной точки зрения это более понятно, чем столбик из if-elsif.

Невнимательно прочитал. Да, именно это я и имел в виду.

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


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

На верилоге я бы сделал

casex

и далее в виде таблички с нулями и единицами....

 

always @(inst) begin

casex (inst) // synopsys parallel_case

 

не советую пользовать casex.

вот например Freescale Semiconductor Reuse Standard говорит нам следующее.

Rule 7.10.16. Use of casex is not allowed

case or casez must be used for all case statements.

Reason: casex treats the X and Z states as don’t cares in synthesis, which can result in different simulation behavior

pre- and post-synthesis. The X state must be generated and handled in such a way to determine whether the

true don’t care conditions will affect the operation of the design, rather than cover up a problem.

смысл в том, что при синтезе с casex страдают всякие комбинаторки, особенно с вырожденной петлёй, которая образовалась при соединении пачки из 3-4-5-и т.д. модулей, и которую глазами не видно.

вместо подстановки "0" и "1" в таблицы истинности зависимых функций и честного их решения, переменная вообще в таблицы истинности не попадает, в итоге после оптимизации выкидывается часть полезной логики, часто значительная.

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


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

Но если уж так хочется, то сначала нужно поставить приоритетный шифратор для irq, а потом, в зависимости от его выхода выбирать биты из detXflg и doutX. С системной точки зрения это более понятно, чем столбик из if-elsif.

Да, вот оно самое логичное решение, надо иногда мыслить еще и как программист, но пока не научился совмещать :wacko:

А с циклом судя по всему равнозначно, только еще компактнее

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

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


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

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

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

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

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

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

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

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

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

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