Presentation is loading. Please wait.

Presentation is loading. Please wait.

Комбинационе мреже Ефикасно HDL моделовање Дељење оператора

Similar presentations


Presentation on theme: "Комбинационе мреже Ефикасно HDL моделовање Дељење оператора"— Presentation transcript:

1 Комбинационе мреже Ефикасно HDL моделовање Дељење оператора
Дељење функционалности Оптимизација распоређивања Опште мреже

2 Ефикасно HDL моделовање
Језик за МОДЕЛОВАЊЕ физичких уређаја Погрешан приступ замислити C програм и превести га у HDL код Добар приступ истраживање области да се пронађе ефикасан модел преточити дати модел у HDL код

3 Дељење (sharing) Сложеност физичких модела варира
Аритметички оператори: гломазни минимална оптимизација од стране алата Оптимизација може да се постигне дељењем на RTL нивоу: дељење оператора дељење функционалности

4 CMOS имплементација стандардних ћелија

5 Дељење оператора Израчунавање више израза је међусобно искључиво.
Само један од резултата се прослеђује на излаз. Пример представља условна додела вредности сигналу: sig <= value_1 when boolean_1 else value_2 when boolean_2 else value_3 when boolean_3 else . . . value_n;

6 Дељење оператора Пример: r <= a + b when boolean_exp else a + c;

7 Дељење оператора Модификован код: src0 <= b when boolean_exp else
r <= a + src0;

8 Дељење оператора Простор: 2 add, 1 mux
Кашњење: max(Tadd, Tbool) + Tmux Простор: 1 add, 1 mux Кашњење: Tadd + Tbool + Tmux

9 Дељење оператора Дељење се ради додавањем мреже за рутирање
Добробити од дељења зависe од сложености имплементације оператора и мреже за рутирање У идеалном случају би алат обављао овај посао

10 Дељење функционалности
Велика мрежа може имати пуно функционалности Неке од функционалности могу бити сличне Сличне функционалности могу да деле исти hardware Ради се за конкретан случај (ad hoc) Алат не може лако да одради дељење функционалности, јер не разуме тј. не тумачи функционалности

11 Компаратор – пример (1) Компаратор са два мода рада:
поређење неозначених бројева поређење означених бројева Ширина података је 8 бита водити рачуна о проширивости тј. скалабилности

12 Компаратор – пример (2) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity cmp2m is port( a, b: in std_logic_vector(7 downto 0); mode : in std_logic; f_out : out std_logic ); end entity cmp2m;

13 Компаратор – пример (3) architecture direct_arch of cmp2m is signal f_out_signed, f_out_unsigned : std_logic; begin f_out_signed <= '1' when signed(a) > signed(b) else '0'; f_out_unsigned <= '1' when unsigned(a) > unsigned(b) else f_out <= f_out_unsigned when mode = '0' else f_out_signed; end architecture direct_arch;

14 Компаратор – пример (4)

15 Компаратор – пример (5) architecture shared_arch of cmp2m is signal a1_b0, f_out_cmp : std_logic; begin a1_b0 <= '1' when a(7) = '1' and b(7) = '0' else '0'; f_out_cmp <= '1' when a(6 downto 0) > b(6 downto 0) else f_out <= f_out_cmp when (a(7) = b(7)) else a1_b0 when mode = '0' else not a1_b0; end architecture shared_arch;

16 Компаратор – пример (6)

17 Оптимизација распоређивања
Распоређивање компоненти на самом чипу врши се у оквиру фазе Place and Route која следи након синтезе VHDL не може да специфицира тачан распоред VHDL може да специфицира приближан облик чип је дводимензионалан дводимензионални облик бољи од једнодимензионог условна додела генерише хоризонталан ланац селекциона додела генерише вертикалан ланац ни један ни други није идеалан

18 Вишебитно XOR коло (1)

19 Вишебитно XOR коло (2) library ieee; use ieee.std_logic_1164.all; entity r_xor is port( a : in std_logic_vector(7 downto 0); f : out std_logic ); end entity r_xor; architecture cascade_arch_1 of r_xor is begin f <= a(0) xor a(1) xor a(2) xor a(3) xor a(4) xor a(5) xor a(6) xor a(7); end architecture cascade_arch_1; Проблем?

20 loop Бесконачна петља: могуће искочити из средине. loop_statement ⇐
⟦ loop_label: ⟧ loop ⦃ sequential_statement ⦄ end loop ⟦ loop_label ⟧; Бесконачна петља: могуће искочити из средине.

21 loop Пример: incrementer : process is variable count_value : natural := 0; begin count <= count_value; label: loop wait until clk; count_value := (count_value + 1) mod 16; count <= count_value; end loop label; end process incrementer;

22 exit Користи се за излазак из петље.
exit_statement ⇐ ⟦ exit_label: ⟧ exit ⟦ loop_label ⟧ ⟦ when condition ⟧; Користи се за излазак из петље. Лабелом loop_label одређено је из које петље се излази: ако је наведена лабела loop_label, онда се излази из петље означене са том лабелом, ако није наведена лабела loop_label, онда се излази из окружујуће петље.

23 Пример outer : loop inner : loop exit outer when condition_1; -- target B exit when condition_2; -- target A end loop inner; target A exit outer when condition_3; -- target B end loop outer; target B

24 next Прескаче остатак текуће итерације петље.
next_statement ⇐ ⟦ next_label: ⟧ next ⟦ loop_label ⟧ ⟦ when condition ⟧; Прескаче остатак текуће итерације петље. Уколико се лабелом loop_label специфицира нека окружујућа петља, угнежђене петље се завршавају и прескаче се остатак текуће итерације наведене петље.

25 while loop Петља са условом на почетку. while_loop_statement ⇐
⟦ while_label: ⟧ while condition loop ⦃ sequential_statement ⦄ end loop ⟦ while_label ⟧ ; Петља са условом на почетку.

26 for loop Бројачку променљиву (identifier):
for_loop_statement ⇐ ⟦ for_label: ⟧ for identifier in discrete_range loop ⦃ sequential_statement ⦄ end loop ⟦ for_label ⟧; discrete_range ⇐ simple_expression ⦅ to | downto ⦆ simple_expression Бројачку променљиву (identifier): није потребно експлицитно дефинисати, може се користити само у телу петље, није дозвољен упис у бројачку променљиву, прикрива друге променљиве истог назива.

27 Пример лоше употребе erroneous : process is variable i, j : integer; begin i := loop_param; -- error! for loop_param in 1 to 10 loop loop_param := 5; -- error! end loop; j := loop_param; -- error! end process erroneous;

28 Вишебитно XOR коло (3) architecture cascade_arch_2 of r_xor is constant WIDTH : integer := 8; begin process (a) is variable tmp : std_logic; tmp := a(0); for i in 1 to WIDTH-1 loop tmp := tmp xor a(i); end loop; f <= tmp; end process; end architecture cascade_arch_2;

29 Вишебитно XOR коло (4) architecture cascade_arch_3 of r_xor is constant WIDTH : integer := 8; signal p : std_logic_vector(WIDTH-1 downto 0); begin p <= (p(WIDTH-2 downto 0) & '0') xor a; f <= p(WIDTH-1); end architecture cascade_arch_3;

30 Вишебитно XOR коло (5) architecture tree_arch of r_xor is begin f <= (((a(0) xor a(1)) xor (a(2) xor a(3))) xor ((a(4) xor a(5)) xor (a(6) xor a(7)))); end architecture tree_arch;

31 Вишебитно XOR коло (6)

32 Вишебитно XOR коло (7) Упоређивање:
Ланац: Простор: (n – 1) xor кола Кашњење: (n – 1) Кодирање: лако се скалира Дрво: Кашњење: log2n Кодирање: не скалира се лако У зависности од алата и технологије имплементације конверзија може да буде аутоматска

33 Опште мреже Пример – Грејев бројач:

34 Грејев бројач (1) library ieee; use ieee.std_logic_1164.all; entity gray_inc is port( g : in std_logic_vector(3 downto 0); g1 : out std_logic_vector(3 downto 0) ); end entity gray_inc;

35 Грејев бројач (2) architecture direct_arch of gray_inc is begin with g select g1 <= "0001" when "0000", "0011" when "0001", "0010" when "0011", "1001" when "1011", ... "1000" when "1001", "0000" when others; -- "1000" end architecture direct_arch;

36 Грејев бројач (3) Архитектура из претходног примера је нескалабилна у случају промене ширине улаза. Не постоји општи алгоритам за инкрементирање Грејевог кода. Други приступ: конвертовати у бинарни број, инкрементирати, вратити у Грејев код.

37 Грејев бројач (4) architecture compact_arch of gray_inc is constant WIDTH : integer := 4; signal b, b1 : std_logic_vector(WIDTH-1 downto 0); begin -- Gray to Binary b <= g xor ('0' & b(WIDTH-1 downto 1)); -- Binary increment b1 <= std_logic_vector((unsigned(b)) + 1); -- Binary to Gray g1 <= b1 xor ('0' & g1(WIDTH-1 downto 1)); end architecture compact_arch ;

38 wait wait_statement ⇐ ⟦ wait_label: ⟧ wait ⟦ on signal_name ⦃,...⦄ ⟧ ⟦ until boolean_expression ⟧ ⟦ for time_expression ⟧ Пружа могућност суспендовања секвенцијалног процесирања све до испуњења неке од клаузула: догађај на неком сигналу (sensitivity clause – on signal_name ⦃,...⦄), испуњење задатог логичког услова (condition clause – until boolean_expression), истек задатог временског интервала (timeout clause – for time_expression).

39 wait Један wait исказ може имати произвољну комбинацију клаузула (ниједна, једна или више клаузула). Тумачење wait исказа у случају постојања више клаузула: сваки пут када дође до догађаја на неком од сигнала наведених у on клаузули проверава се логички услов из until клаузуле (ако је логички услов испуњен наставља се са секвенцијалним процесирањем), дужина временског интервала суспендовања је увек ограничена временом наведеним у for клаузули. Логички услов се проверава: на сваки догађај било ког сигнала наведеног у until клаузули (ако није наведена on клаузула), на сваки догађај било ког сигнала наведеног у on клаузули (ако јесте наведена on клаузула).

40 wait -- sekvencijalno procesiranje se nastavlja kada se desi:
-- dogadjaj na signalima a i/ili b wait on a, b; -- vrednost signala clk = '1' -- (uslov se proverava usled dogadjaja na signalu clk) wait until clk = '1' -- dogadjaj na signalu clk i vrednost signala rst = '0' wait on clk until rst = '0' -- vrednost signala trigger = '1' ili dok ne prodje 1 ms -- (uslov se proverava usled dogadjaja na signalu trigger) wait until trigger = '1' for 1 ms

41 if-then-else if_statement ⇐ ⟦ if_label: ⟧ if condition then ⦃ sequential_statement ⦄ ⦃ elsif condition then ⦃ sequential_statement ⦄ ⦄ ⟦ else ⦃ sequential_statement ⦄ ⟧ end if ⟦ if_label ⟧; Обезбеђује условно извршавање других секвенцијалних исказа. Условно извршавање је приоритирано; када се наиђе на први тачан услов, прекида се провера осталих. Могуће угнездити више if-then-else исказа.

42 Пример 1 if sel0 = '0' and sel1 = '0' then z <= d0; elsif sel0 = '1' and sel1 = '0' then z <= d1; elsif sel0 = '0' and sel1 = '1' then z <= d2; elsif sel0 = '1' and sel1 = '1' then z <= d3; end if;

43 Синтетизован модел примера 1 – RTL поглед
Пример 1 Конкурентна условна додела вредности

44 Синтетизован модел примера 1 –технолошки поглед

45 Пример 2 if sel0 = '0' and sel1 = '0' then z <= d0; elsif sel0 = '1' and sel1 = '0' then z <= d1; elsif sel0 = '0' and sel1 = '1' then z <= d2; else z <= d3; end if; Због постојања else никада не остаје стара вредност. Зато синтетизовани модел нема леч коло. Погодно за синтезу, али при тестирању може да прикрије потенцијални проблем.

46 Синтетизован модел примера 2 – RTL поглед

47 Пример 3 if sel0 = '0' and sel1 = '0' then z <= d0; elsif sel0 = '1' and sel1 = '0' then z <= d1; elsif sel0 = '1' and sel1 = '1' then z <= d3; end if;

48 Синтетизован модел примера 3 – RTL поглед
Пример 3 Конкурентна условна додела вредности

49 Пример 4 if sel0 = '0' and sel1 = '0' then z <= d0; elsif sel0 = '1' and sel1 = '0' then z <= d1; elsе z <= d3; end if;

50 Синтетизован модел примера 4 – RTL поглед
Пример 4 Конкурентна условна додела вредности

51 Пример 5 if sel1 = '0' then if sel0 = '0' then z <= d0; else z <= d1; end if; else if sel0 = '0' then z <= d2; else z <= d3; end if; end if;

52 Синтетизован модел примера 5

53 Пример 6 Унутар било којег блока може да буде и више секвенцијалних исказа. if opcode = halt_opcode then PC := effective_address; executing := false; halt_indicator <= true; end if;

54 Секвенцијална условна додела променљивој
conditional_variable_assignment ⇐ ⦅ name | aggregate ⦆ := expression when condition ⦃ else expression when condition ⦄ ⟦ else expression ⟧; Појављује се тек у стандарду VHDL-2008

55 Секвенцијална условна додела променљивој
Пример: result := a - b when mode = subtract else a + b; Еквивалентно датом примеру: if mode = subtract then result := a - b; else result := a + b; end if;

56 case case_statement ⇐ ⟦ case_label: ⟧ case⟦?⟧ expression is ⦅ when choices => ⦃ sequential_statement ⦄ ⦆ ⦃...⦄ end case ⟦ case_label ⟧; choices ⇐ ⦅ simple_expr | discrete_range | others ⦆ ⦃|...⦄ Омогућава извршавање одговарајућег низа исказа у зависности од вредности исказа. Извршава се само једна опција. Нема приоритета. Свака могућа вредност се у опцијама мора појавити тачно једном (погледати белешке уз слајд). Израз за селекцију (expression између case и is) се може конвертовати у одговарајући подтип ако се жели скратити скуп опција. naziv_podtipa'(izraz)

57 Пример 1 case func is when pass1 => result := operand1; when pass2 => result := operand2; when add => result := operand1 + operand2; when subtract => result := operand1 - operand2; end case;

58 Пример 2 case opcode is when load | add | subtract => operand := memory_operand; when store | jump | jumpsub | branch => operand := address_operand; when others => operand := 0; end case;

59 Пример 3 entity mux is port(
d0, d1, d2, d3 : in std_logic; sel : in std_logic_vector(1 downto 0); z : out std_logic ); end entity mux; architecture dataflow of mux is begin process (d0, d1, d2, d3, sel) is begin case sel is when "00" => z <= d0; when "01" => z <= d1; when "10" => z <= d2; when "11" => z <= d3; end case; end process; end architecture dataflow;

60 Пример 4 type opcodes is (nop, add, subtract, load, store,
jump, jumpsub, branch, halt); case opcode is when add to load => operand := memory_operand; when branch downto store => operand := address_operand; when others => operand := 0; end case;

61 Пример 5 type opcodes is (nop, add, subtract, load, store,
jump, jumpsub, branch, halt); subtype control_transfer_opcodes is opcodes range jump to branch; case opcode is when add to load => operand := memory_operand; when control_transfer_opcodes | store => operand := address_operand; when others => operand := 0; end case;

62 Пример нерегуларног case исказа
variable N : integer := 1; case expression is when N | N+1 => when N+2 to N+5 => when others => ... end case; За случај да је N константа, горњи исказ би био коректан.

63 Секвенцијална селекциона додела променљивој
Секвенцијална селекциона додела променљивој selected_variable_assignment ⇐ with expression select⟦?⟧ ⦅ name | aggregate ⦆ := ⦃ expression when choices , ⦄ expression when choices ; choices ⇐ ⦅ simple_expr | discrete_range | others ⦆ ⦃|...⦄ Појављује се тек у стандарду VHDL-2008

64 Секвенцијална селекциона додела променљивој
Секвенцијална селекциона додела променљивој Пример: with func select result := operand1 when pass1, operand2 when pass2, operand1 + operand2 when add, operand1 - operand2 when subtract;

65 null Начин да се специфицира да се у неком случају не дешава ништа.
Пример: case opcode is when add => Acc := Acc + operand; when subtract => Acc := Acc - operand; when nop => null; end case; control_section : process (sensitivity_list) is begin null; end process control_section;

66 assert Исказ намењен за помоћ при провери исправности модела.
assertion_statement ⇐ ⟦ assert_label: ⟧ assert condition ⟦ report expression ⟧ ⟦ severity expression ⟧; Исказ намењен за помоћ при провери исправности модела. Генерише обавештење уколико се у току симулације деси да услов у оквиру assert клаузуле не буде испуњен. Алат за синтезу може сматрати да ће услов бити испуњен.

67 assert У оквиру assert клаузуле наводи се тврдња (assertion) тј. услов који мора бити испуњен. У оквиру report клаузуле пише се текст обавештења које ће симулатор исписати (на пример, детаљан опис грешке). У оквиру severity клаузуле дефинише се у којој мери одступање од тврдње утиче на извршавање симулације: note (подразумевано) – одступање од тврдње не утиче на извршавање симулације (испис поруке у току симулације), warning – одступање од тврдње након којег се симулација може наставити, али резултати могу бити неочекивани, error – одступање од тврдње тј. грешка услед које је неопходно покренути акције опоравка, failure – одступање од тврдње које представља ситуацију која се никако није смела догодити. Одступање од тврдње типа failure подразумевано зауставља симулацију.

68 assert Пример: assert curr_char >= '0' and curr_char <= '9' report "Input number " & input_string & " contains a non-digit" severity note;

69 report report_statement ⇐ ⟦ report_label: ⟧ report expression ⟦ severity expression ⟧; Исто тумачење као и assert исказ за који важи да је тврдња тј. услов увек нетачан. Представља краћи облик assert исказа који се најчешће користи за испис порука у току симулације.


Download ppt "Комбинационе мреже Ефикасно HDL моделовање Дељење оператора"

Similar presentations


Ads by Google