shide_3 0 10 мая, 2016 Опубликовано 10 мая, 2016 (изменено) · Жалоба Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится.. 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; Изменено 10 мая, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится.. 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; что Вам в этом описании не нравиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится.. 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"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба что Вам в этом описании не нравиться? длинновато :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба длинновато :laughing: Не то слово. Не читается с ходу, а значит, что могут быть ошибки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба На верилоге я бы сделал casex э-э не... Вот если бы case поддерживал break, тогда да, наверное помогло бы... У меня же по сути приоритетный шифратор, если к примеру irq(0) = '1', то всё, дальше не идем... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба э-э не... Вот если бы case поддерживал break, тогда да, наверное помогло бы... У меня же по сути приоритетный шифратор, если к примеру irq(0) = '1', то всё, дальше не идем... У Вас 3 запроса, 8 комбинаций и что? Зачем Вам break, если из 8-ми строк выполнится только одна? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 мая, 2016 Опубликовано 10 мая, 2016 (изменено) · Жалоба У Вас 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, которую я использовал Изменено 10 мая, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба прошу прощения, не сразу сообразил, просто 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, которую я использовал Если скайп есть, то я могу просто показать рабочий стол и дать комментарии... Так проще будет... Вот так делаете, как я уже написал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится.. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба Оптимизировать текст работающего блока - последнее дело, т.к. никакого выигрыша это времяпрепровождение не дает. Только потраченное время и возможность налепить ошибок. Все, что может быть нужно, - это написать unit test. Но если уж так хочется, то сначала нужно поставить приоритетный шифратор для irq, а потом, в зависимости от его выхода выбирать биты из detXflg и doutX. С системной точки зрения это более понятно, чем столбик из if-elsif. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 мая, 2016 Опубликовано 10 мая, 2016 (изменено) · Жалоба В VHDL же есть exit loop. Извините, не могу по-быстрому отступы правильно расставить из-за вашей табуляции. странно, в language templates (ISE 8.2) про это не сказано. Надо будет попробовать . спасибо Если скайп есть, то я могу просто показать рабочий стол и дать комментарии... Так проще будет... со скайпом к сожалению проблемы. пробую разобраться с Вашим кодом, верилог пока трудноват для понимания.. Да, пожалуй, принципиально упростить можно только с помощью цикла Изменено 10 мая, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба Уважаемые коллеги, как на ваш взгляд, можно ли как-то оптимизировать (урезать) данный код? с помощью цикла вряд-ли получится.. 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. Невнимательно прочитал. Да, именно это я и имел в виду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 10 мая, 2016 Опубликовано 10 мая, 2016 · Жалоба На верилоге я бы сделал 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" в таблицы истинности зависимых функций и честного их решения, переменная вообще в таблицы истинности не попадает, в итоге после оптимизации выкидывается часть полезной логики, часто значительная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 11 мая, 2016 Опубликовано 11 мая, 2016 (изменено) · Жалоба Но если уж так хочется, то сначала нужно поставить приоритетный шифратор для irq, а потом, в зависимости от его выхода выбирать биты из detXflg и doutX. С системной точки зрения это более понятно, чем столбик из if-elsif. Да, вот оно самое логичное решение, надо иногда мыслить еще и как программист, но пока не научился совмещать А с циклом судя по всему равнозначно, только еще компактнее Изменено 11 мая, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться