Ćwiczenie nr 5. Automatyczna synteza layout’ów układów cyfrowych z wykorzystaniem programu Cell Ensemble

Wprowadzenie

Przedmiotem tego ćwiczenia jest synteza topografii masek (layout'u) prostego układu cyfrowego, opisanego w postaci schematu logicznego w programie Composer. Synteza schemat -> topografia masek jest często potocznie zwana Place&Route.

W niniejszym ćwiczeniu do syntezy zostanie zastosowany syntetyzator Cell Ensemble wchodzący w skład pakietu Cadence IC Package oraz technologia Alcatel CMOS 0,7 mm, z czego wynikają następujące ograniczenia:

Jednakże wybrana technologia ma jedną podstawową zaletę – po zakończeniu syntezy można zobaczyć kompletny layout układu. Zazwyczaj, celki standardowe (elementy) wykorzystywane do syntezy są dostępne jedynie w postaci "czarnej skrzynki" o rzeczywistych wymiarach i z doprowadzeniami, natomiast ich layout'y nie są znane. Technologia Alcatel 0,7 stanowi tu wyjątek.

Rezultat syntezy, do którego będziemy dążyć jest pokazany na rys. 1.

rys. 1

Floorplan

Pierwszym etapem syntezy jest tzw. floorplan, czyli wstępne rozplanowanie rozmieszczenia rdzenia i doprowadzeń wejścia-wyjścia (padów) na powierzchni krzemu. W skład rdzenia wchodzą wszystkie celki standardowe realizujące funkcje logiczne układu, takie jak bramki czy przerzutniki.

W przypadku rozważanego układu, całkowita powierzchnia, którą będzie on zajmował, będzie wyznaczona nie przez rozmiar rdzenia, ale przez pady, ponieważ układ ten ma stosunkowo dużą liczbę padów relatywnie do liczby elementów rdzenia.

I/O Placement

Terminem tym określamy rozmieszczenie padów, które generalnie można podzielić na 3 grupy:

Pady zasilające mogą być zwielokrotnione (w przypadku naszego układu są zdwojone), jeżeli rdzeń jest duży, albo jest duże zapotrzebowanie na prąd buforów wyjściowych. W wielu dzisiejszych układach (np. w dużych mikroprocesorach) stosuje się osobne zasilanie dla rdzenia i padów (tzw. układy dwunapięciowe). Chodzi o to, aby rdzeń zasilać jak najniższym napięciem, aby zminimalizować pobór mocy i wydzielanie ciepła, ale jednocześnie zasilać pady wyjściowe wyższym napięciem, aby móc z nich uzyskać większy prąd wyjściowy, co z kolei zwiększa maksymalną częstotliwość układu jako całości.

Masa i zasilanie wszystkich padów układu powinna być połączona i tworzyć ciągłe magistrale. Jeżeli pady nie przylegają do siebie, to aby zapewnić ciągłość magistral, między pady należy wstawić specjalne celki zwane IO fillers. Aby z kolei zapewnić ciągłość tych magistrali w narożnikach układu, wstawia się tam tzw. celki narożne (corner cells), widoczne na rys 1.

W programie Cell Ensemble można rozmieścić pady automatycznie. Wówczas syntetyzator stara się tak rozmieścić pady, aby całkowita powierzchnia przez nie zajmowana była jak najmniejsza (chyba że to rdzeń wyznacza wielkość układu). Może jednak powstać taki problem, że pady są nie w takiej kolejności jakbyśmy chcieli i np. pady zasilające są przemieszane z padami wyjściowymi. Dlatego istnieje możliwość zdefiniowania, które końcówki i w jakiej kolejności mają się znaleźć na których bokach. Wówczas syntetyzator będzie starał się w miarę możliwości zrealizować takie rozmieszczenie, lub przynajmniej będzie do niego dążył. Plik, w którym definiuje się te wytyczne nosi nazwę IO frame file i składa się z linii wykorzystujących następujący wzorzec:

nazwa_padu bok pozycja

na przykład

|INB0 left 0

|INB7 left 7

Umowną kolejność padów na poszczególnych bokach objaśnia rys. 2

rys. 2

Placement

Terminem tym określa się rozmieszczenie celek w rdzeniu. Zazwyczaj zachodzi ono automatycznie, a projektant jedynie kontroluje parametry tego procesu.

W przypadku większości układów cyfrowych, wszystkie celki należące do rdzenia mają taką samą wysokość i są układane w rzędach, pomiędzy którymi powstają kanały, którymi będą prowadzone połączenia między celkami (rys. 1). Wyjątek stanowią tzw. bloki, czyli stosunkowo duże fragmenty (moduły) syntezowane wcześniej i przy rozmieszczaniu traktowane już jako nierozerwalne całości. Bloki rozmieszcza się w pierwszej kolejności, a dopiero potem rozmieszcza się pojedyncze celki standardowe. Czasem o rozmieszczeniu bloków decyduje projektant, a nie program.

W procesie rozmieszczania celek w rdzeniu, zazwyczaj wstawia się między nie dodatkowe celki zwane feedthroughs albo spacers, które mają za zadanie wyrównać długości wszystkich rzędów (jak justowanie druku) oraz ułatwić zamianę celek miejscami w procesie iteracyjnego placementu.

Placement jest wykonywany w dwóch fazach:

  1. Wstępne rozmieszczenie celek (initial placement albo constructive placement). W najprostszym przypadku może to być rozmieszczenie losowe, ale w większości przypadku jest ono wstępnie optymalizowane pod kątem minimalizacji długości połączeń, np. metodą krystalizacji
  2. Iteracyjna optymalizacja rozmieszczenia początkowego (iterative placement improvement). W tej fazie rozmieszczenie celek optymalizuje się raczej pod kątem minimalizacji liczby przecięć (kolizji) połączeń i równomiernego rozkładu ich zagęszczenia, a nie długości połączeń.

W większości przypadków placement nie kończy się na rozmieszczeniu bloków oraz celek występujących na schemacie logicznym. Zazwyczaj trzeba wstawić dodatkowe celki zwane glue cells , takie jak:

Routing

Terminem tym określa się prowadzenie połączeń elektrycznych w kanałach pomiędzy celkami. Jako że poprowadzenie wszystkich połączeń naraz byłoby zbyt skomplikowane dla routera, proces ten rozdziela się na dwie fazy:

  1. Globalny (swobodny) routing (global routing albo loose routing), w którym router określa, przez które kanały i w jakiej kolejności będą przechodziły poszczególne połączenia, ale dokładny przebieg połączenia w tych kanałach nie jest jeszcze znany na tym etapie
  2. Szczegółowy (końcowy) routing (detail routing albo final routing), w którym router ustala dokładny przebieg poszczególnych połączeń przez kanały wybrane w poprzedniej fazie.

Często przed rozpoczęciem routingu globalnego, planuje się przebieg połączeń zasilających i zegarowych, ponieważ mogą mieć one krytyczny wpływ na działanie układu. W szczególności tworzy się specjalne drabinki połączeń dla zasilania i masy wewnątrz rdzenia i poza nim (power ladders albo power stripes). Dzięki temu każda celka, bez względu na to w którym miejscu rdzenia się znajduje, jest poprawnie zasilana (tzn. napięcia VDD i VSS mieszczą się w granicach tolerancji), ponieważ mimo przepływu dużego prądu zasilającego nie ma znaczących spadków napięć. Drabinki te są doskonale widoczne na rys. 1. Podobnie, czasem prowadzi się specjalne połączenia także dla sieci dystrybucji zegara (clock trunk).

Jeżeli jednak nie planujemy wstępnie przebiegu połączeń zasilających i zegarowych, to trzeba przynajmniej nadać im wysoki priorytet, aby router rozpoczął routing globalny od poprowadzenia tych połączeń co może znacznie skrócić ich długość. Najwyższy priorytet powinny mieć połączenia zasilające, następnie zegarowe, a dopiero potem pozostałe.

W czasie routingu szczegółowego może okazać się, że w wyniku przekroczenia dopuszczalnej gęstości połączeń w pewnych kanałach, nie da się poprowadzić wszystkich połączeń. Wówczas Cell Ensemble poszerza te kanały kosztem całkowitej powierzchni zajmowanej przez rdzeń. W przypadku układu z rys. 1 istnieje duży zapas, ponieważ i tak minimalna powierzchnia zajmowana przez ten układ jest limitowana przez pady, a nie przez rozmiary rdzenia. Z drugiej strony, opcjonalnie router może zwężać kanały, w których jest mniej połączeń niż się mieści, co zmniejszy rozmiary rdzenia, ale w przypadku naszego układu i tak to nic by nie dało, ponieważ padów nie da się już bardziej ścisnąć.

Laboratorium nr 1. Wstępne planowanie rozmieszczenia (Floorplan)

  1. Przejść do podkatalogu digital w swoim katalogu domowym i uruchomić Design Framework II poleceniem UNIX’a: startcds &
  2. Przejść do programu Library Manager, odszukać bibliotekę Digital, a w niej celkę CHIP i otworzyć widok schematic. Powinno się wtedy otworzyć okno programu Composer ze schematem logicznym układu, który ma być poddany syntezie
  3. Z menu programu Composer wybrać polecenie Tools -> Floorplan/Schematics. Powinno pojawić się dodatkowe polecenie menu: Floorplan
  4. Uruchomić program Hierarchy Browser
    1. Z menu wybrać polecenie Floorplan -> Hierarchy Browser... Pojawi się wtedy formularz pokazany na rys. 3
    2. rys. 3

    3. Wypełnić formularz w sposób pokazany na rysunku i kliknąć OK. Na ekranie powinno pojawić się okno programu Hierarchy Browser

  5. Ustawić przyszłe środowisko programu Cell Ensemble
    1. Z menu programu Hierarchy Browser wybrać polecenie Utilities -> Environment...
    2. Wypełnić formularz tak jak pokazano na rys. 4 i kliknąć przycisk Change Default Global Signal Names
    3. Wypełnić formularz tak jak pokazano na rys. 5 i kliknąć OK aby powrócić do formularza z rys. 3
    4. Kliknąć OK aby zakończyć ustawianie środowiska

    rys. 4

    rys. 5

  6. Zapoznać się z hierarchiczną strukturą układu
    1. Zaznaczyć celkę CHIP widoczną w oknie programu Hierarchy Browser
    2. W menu wybrać polecenie Window -> Utilities -> Expand Selected aby obejrzeć listę celek bezpośrednio wchodzących w skład celki CHIP
    3. W podobny sposób obejrzeć zawartość wyświetlonych celek, aż całe drzewo hierarchii układu stanie się widoczne

  7. Zaznaczyć samą celkę CHIP i z menu wybrać polecenie Generate Physical Hierarchy
  8. Opuścić program Hierarchy Browser poleceniem Window -> Close
  9. Przejść do programu Library Manager i korzystając z polecenia Edit -> Copy... skopiować widok autoLayout celki CHIP do widoku layout
  10. Otworzyć widok layout celki CHIP. Na ekranie pojawi się okno programu Virtuoso
  11. Z menu okna Virtuoso wybrać polecenie Tools -> Floorplan/P&R -> Cell Ensemble. Powinny pojawić się dodatkowe polecenia menu: Floorplan, Analyze, Place, Route oraz “pływające” okno OSW (Object Selection Window)
  12. Zainicjalizować floorplan
    1. Z menu wybrać polecenie Floorplan -> Reinitialize...
    2. Wypełnić formularz w sposób pokazany na rys. 6 i kliknąć OK

    rys. 6

  13. Zapisać bieżący widok poleceniem Design -> Save (F2)

Laboratorium nr 2. Rozmieszczenie padów wejścia-wyjścia (I/O Placement)

  1. Otworzyć widok layout celki CHIP o ile nie jest otwarty
  2. Wstępnie rozmieścić automatycznie pady na krzemie
    1. Z menu wybrać polecenie Floorplan -> I/O Place...
    2. Wypełnić formularz w sposób pokazany na rys. 7 i kliknąć OK

    rys. 7

  3. Tymczasowo rozsunąć pady tak, aby uzyskać dostatecznie duże odstępy między nimi
    1. Z menu wybrać polecenie Place -> IO Commands -> Justify...
    2. Wypełnić formularz w sposób pokazany na rys. 8 i kliknąć OK

    rys. 8

  4. Wczytać docelowe rozmieszczenie padów z pliku I/O frame file
    1. Z menu wybrać polecenie Place -> IO Commands -> Read Initial File...
    2. W formularzu wpisać nazwę pliku: CHIP.iof (rys. 9) i kliknąć OK

    rys. 9

  5. Docelowo rozmieścić pady najciaśniej, jak to tylko możliwe
    1. Z menu wybrać polecenie Place -> IO Commands -> Justify...
    2. W polu IO to IO Spacing wpisać wartość 0 i kliknąć OK

  6. Wstawić celki narożne
    1. Z menu wybrać polecenie Place -> IO Commands -> Add Corners...
    2. W formularzu (rys. 11) kliknąć przycisk Browse
    3. W bibliotece MTC22300 odszukać celkę CORNER_400, zaznaczyć widok abstract (rys. 10)
    4. rys. 10

    5. Kliknąć Close aby powrócić do poprzedniego formularza, który powinien wyglądać mniej więcej tak, jak pokazano na rys. 11
    6. rys. 11

    7. Kliknąć OK aby wstawić wybrane celki narożne

  7. Zapisać bieżący layout wywołując z menu polecenie Design -> Save (F2)
  8. Zapisać kopię widoku jako widok IOplaced
    1. Z menu wybrać polecenie Design -> Save As...
    2. Wypełnić formularz w sposób pokazany na rys. 12 i kliknąć OK

rys. 12

Po wykonaniu tej części ćwiczenia, bieżący widok powinien przypominać layout z rys. 13

rys. 13

Laboratorium nr 3. Rozmieszczenie celek standardowych (Placement)

  1. Otworzyć widok layout celki CHIP o ile nie jest otwarty
  2. Ustawić wymiary przyszłego rdzenia i liczbę przyszłych rzędów
    1. W oknie OSW zaznaczyć pole Region, odznaczając jednocześnie wszystkie inne pola
    2. Zaznaczyć region o nazwie default (czyli jedyny istniejący region)
    3. Z menu wybrać polecenie Edit -> Properties... (q)
    4. Wypełnić formularz tak jak pokazano na rys. 14 i kliknąć OK

    rys. 14

  3. Automatycznie rozmieścić celki standardowe
    1. Z menu wybrać polecenie Place -> Automatic...
    2. W oknie formularza (rys. 16) kliknąć przycisk Browse
    3. W bibliotece MTC23000 odszukać celkę CSPACER, zaznaczyć widok abstract (rys. 15) i kliknąć Close aby powrócić do poprzedniego formularza
    4. rys. 15

    5. Wypełnić resztę formularza tak jak pokazano na rys. 16 i kliknąć OK. Obserwować postęp placement’u w oknie głównym icfb

    rys. 16

  4. Wstawić w rzędy celek standardowych pomocnicze celki zasilające (power cells)
    1. Z menu wybrać polecenie Place -> Power Cell -> Add Auto...
    2. W polu wyboru formularza (rys. 18) wybrać wariant Use Pre-Defined Power Cells
    3. Kliknąć przycisk Browse
    4. W bibliotece MTC23000 odszukać celkę CFEED, zaznaczyć widok abstract (rys. 17) i kliknąć Close aby powrócić do poprzedniego formularza
    5. rys. 17

    6. Wypełnić resztę formularza tak jak pokazano na rys. 18 i kliknąć przycisk Pre-Define Power Cells
    7. rys. 18

    8. W formularzu (rys. 19) kliknąć przycisk Power Cell Browse
    9. W bibliotece MTC23000 odszukać celkę CBAR_FEED, zaznaczyć widok abstract (rys. 19) i kliknąć Close aby powrócić do poprzedniego formularza
    10. rys. 19

    11. W formularzu z rys. 19 kliknąć przycisk Left Cap Cell Browse
    12. W bibliotece MTC23000 odszukać celkę CENDROW, zaznaczyć widok abstract (rys. 20) i kliknąć Close aby powrócić do poprzedniego formularza
    13. rys. 20

    14. Kliknąć przycisk Right Cap Cell Browse i powtórzyć kroki opisane w punkcie i. Wówczas formularz powinien wyglądać tak jak pokazuje rys. 21
    15. rys. 21

    16. Kliknąć OK aby powrócić do formularza z rys. 18
    17. Kliknąć OK i obserwować postęp placement’u w oknie głównym icfb

  5. Zapisać bieżący widok
  6. Zapisać kopię bieżącego widoku jako widok placed

Po wykonaniu tej części ćwiczenia, bieżący widok powinien przypominać layout z rys. 22

rys. 22

Laboratorium nr 4. Automatyczne prowadzenie połączeń (Routing)

  1. Otworzyć widok layout celki CHIP o ile nie jest otwarty
  2. Zmienić domyślne parametry ścieżek zasilających i zegarowych
    1. Z menu wybrać polecenie Route -> Modify Net -> Modify Net Properties... Pojawi się wtedy formularz pokazany na rys. 23
    2. rys. 23

    3. W polu Net Names wpisać węzeł VDD! (rys. 23)
    4. Zaznaczyć opcję Edit Net Width i w polu obok po prawej stronie wpisać wartość 9
    5. Kliknąć Apply aby zmienić parametry ścieżek związanych z węzłem VDD!
    6. Powtórzyć kroki b-d dla węzła VSS!
    7. Odznaczyć opcję Edit Net Width
    8. W polu Net Names wpisać węzły: |CLK |net57 (rys. 24)
    9. rys. 24

    10. Zaznaczyć opcję Edit Net Priority i w polu obok po prawej stronie wpisać wartość 105
    11. Zaznaczyć opcję Edit Net Type i w polu wyboru obok wybrać wariant clock
    12. Kliknąć OK aby zapamiętać zmiany i zamknąć formularz

  3. Utworzyć kanały, którymi będą biegły połączenia
    1. Z menu wybrać polecenie Route -> Channels -> Create...
    2. Wypełnić formularz tak jak pokazano na rys. 25 i kliknąć OK aby utworzyć kanały

    rys. 25

  4. Utworzyć drabinkę zasilającą wewnątrz rdzenia
    1. Z menu wybrać polecenie Route -> Special Net Route -> Route Power Ladders...
    2. Wypełnić formularz w sposób pokazany na rys. 26 i kliknąć OK
    3. rys. 26

    4. Sprawdzić rezultat wykonanej operacji w oknie głównym icfb

  5. Utworzyć drabinkę zasilającą doprowadzającą zasilanie z padów do rdzenia
    1. Z menu wybrać polecenie Route -> Special Net Route -> Route Rail... Na ekranie pojawi się formularz pokazany na rys. 27
    2. rys. 27

    3. Wypełnić formularz tak jak pokazano na rysunku i nie zamykając formularza przejść z powrotem do okna Virtuoso
    4. Kolejno kliknąć lewym przyciskiem myszy w kanały oznaczone na rys. 28 jako H1, H2, V1 i V2 aby w tych kanałach utworzyć połączenia zasilające
    5. rys. 28

    6. Jeżeli omyłkowo zostały utworzone połączenia w kanałach, w których nie miało ich być, to w formularzu z rys. 27 należy zmienić Routing Mode na Delete i kliknąć w te kanały
    7. Po połączeniu wszystkich czterech kanałów powrócić do formularza i kliknąć przycisk Connectivity Checker. Przy braku błędów powinien on wyświetlić komunikat mówiący, że wszystkie zakończenia węzła VDD! są połączone (rys. 29)
    8. rys. 29

    9. W analogiczny sposób powtórzyć kroki b-e dla węzła VSS!
    10. Kliknąć Cancel aby zamknąć formularz z rys. 27 i powrócić do okna Virtuoso

  6. Routing globalny
    1. Z menu wybrać polecenie Route -> Global Route -> Automatic... Na ekranie pojawi się wtedy formularz pokazany na rys. 30
    2. rys. 30

    3. W polu wyboru Method wybrać wariant both (czyli auto+optimize)
    4. W polu Options kliknąć przycisk Automatic
    5. Wypełnić formularz zgodnie ze wzorem pokazanym na rys. 31 i kliknąć OK
    6. rys. 31

    7. W polu Options kliknąć przycisk Optimizer
    8. Wypełnić formularz zgodnie ze wzorem pokazanym na rys. 32 i kliknąć OK
    9. rys. 32

    10. W formularzu z rys. 30 kliknąć OK aby rozpocząć routing globalny i obserwować jego przebieg w oknie głównym icfb

  7. Routing szczegółowy
    1. Z menu wybrać polecenie Route -> Detail Route -> Automatic... Na ekranie pojawi się formularz pokazany na rys. 33
    2. rys. 33

    3. Wypełnić formularz zgodnie ze wzorem pokazanym na rysunku
    4. W polu Options kliknąć przycisk Compact
    5. Wypełnić formularz zgodnie ze wzorem pokazanym na rys. 34 i kliknąć OK
    6. rys. 34

    7. W formularzu z rys. 33 kliknąć OK aby rozpocząć routing szczegółowy i obserwować jego przebieg w oknie głównym icfb

  8. Przemieścić zawartość wszystkich kanałów na pierwszy plan (tzw. eksplozja kanałów)
    1. Z menu wybrać polecenie Route -> Detail Route -> Explode Channels...
    2. Obserwować wynik operacji w oknie icfb

  9. Sprawdzić layout pod kątem występowania zwarć oraz nie zakończonych połączeń
    1. Z menu wybrać polecenie Route -> Check...
    2. W formularzu (rys. 34) zaznaczyć obydwie opcje i kliknąć OK
    3. Obserwować wyniki testów. W razie wykrycia błędów zwrócić się do prowadzącego zajęcia

  10. Zapisać bieżący widok
  11. Zapisać kopię bieżącego widoku jako widok routed
  12. Usunąć niepotrzebne już celki odpowiadające kanałom
    1. Przejść do programu Library Manager i w bibliotece Digital zaznaczyć celkę CHIP_ChannelsH2 tak, aby żaden z jej widoków nie był zaznaczony
    2. Z menu programu Library Manager wybrać polecenie Edit -> Delete. Na ekranie pojawi się formularz pokazany na rys. 35
    3. rys. 35

    4. W polu filtra sekcji Don't Delete wpisać wzór CHIP_* i kliknąć przycisk Select. Powinny się zaznaczyć wszystkie celki zaczynające się od CHIP_Channels, odpowiadające kanałom
    5. Kliknąć przycisk ze strzałką skierowaną w lewo (<----) aby przeznaczyć zaznaczone celki do usunięcia. Powinny się one pojawić na liście Delete
    6. Kliknąć OK aby skasować zaznaczone celki. Powinno wyświetlić się okno z prośbą o potwierdzenie usunięcia 30 celek, których nazwy rozpoczynają się od CHIP_Channels.
    7. Upewnić się, że na liście celek nie ma celki CHIP i kliknąć OK aby zatwierdzić kasowanie

Po wykonaniu tej części ćwiczenia, bieżący widok powinien przypominać layout z rys. 36

rys. 36

Laboratorium nr 5. Utworzenie layout'u końcowego

  1. Korzystając z programu Library Manager otworzyć widok routed celki CHIP
  2. Zastąpić widoki abstract celek standardowych widokami layout tak, aby były widoczne ich layout'y, a nie tylko wymiary i układ końcówek
    1. Z menu okna Virtuoso wybrać polecenie Floorplan -> Replace View...
    2. Wypełnić formularz tak jak pokazano na rys. 36 i kliknąć OK

    rys. 36

  3. Zwiększyć liczbę wyświetlanych poziomów hierarchii layout'u tak, aby layout'y wszystkich celek standardowych (w tym padów) były poprawnie wyświetlane
    1. Z menu wybrać polecenie Design -> Options -> Display... (e)
    2. W polu Display Levels formularza ustawić From 0 To 4
    3. Kliknąć przycisk Apply, a następnie Save To (przy zaznaczonym wariancie Cellview) aby zapamiętać nowe parametry wyświetlania w bieżącym widoku
    4. Kliknąć OK aby powrócić do okna Virtuoso

  4. Zapisać bieżący layout

Po zakończeniu tego ćwiczenia powinno się otrzymać layout pokazany na rys. 1