Instancja analizatora timingów i element w skryptach

author-image

Według

Pisząc niestandardowe skrypty do Analizatora timingów, powinieneś zdawać sobie sprawę z tego, jak różne funkcje Tcl API obsługują i zwracają nazwy jednostek i instancji w nazwach węzłów. Istnieje ustawienie w oprogramowaniu Quartus® II o nazwie Nazwa podmiotu wyświetl dla nazwy węzła, które kontroluje, czy nazwy węzłów są wyświetlane z nazwami podmiotów, czy też nie.
Funkcja Tcl API get_registers zawsze może akceptować nazwy, które obejmują podmioty dla filtra, niezależnie od ustawienia nazwy podmiotu Wyświetlania dla nazwy węzła. Funkcja get_registers zawsze zwraca nazwy zgodnie z ustawieniem Nazwa podmiotu Wyświetlania dla nazwy węzła.
W tabeli 1 pokazano przykłady nazwy węzła zwracanej przez filtr get_registers < polecenia>gdzie projekt zawiera rejestr o nazwie ram:my_ram|ctrl:ctrl_1|addr[0].

Funkcje Tcl API get_pins i get_cells działają inaczej niż get_registers. Funkcje get_pins i get_cells akceptują i zwracają jedynie nazwy zawierające nazwy instancji. Nie akceptują ani nie zwracają nazw podmiotów, niezależnie od wartości nazwy podmiotu Display dla nazwy węzła.
W tabeli 2 pokazano przykłady nazwy węzła zwracanej przez filtr get_pins <>,w którym projekt zawiera rejestr o nazwie ram:my_ram|ctrl:ctrl_1|addr[0] z kodem zegara o nazwie clk. Funkcja get_cells działa tak samo, mimo że akceptuje i zwraca nazwy komórek.

Uwaga:

  1. Funkcja get_pins generuje ostrzeżenie wskazujące, że nie można dopasować określonego filtra do pinów.

Gdy znasz różnicę w sposobie get_registers, get_pinsi get_cells obsługi i zwracania nazw węzłów, które obejmują podmioty, możesz uniknąć problemów z rozwiązywaniem problemów, które mogą wystąpić po połączeniu funkcji. W poniższym przykładzie pokazano kod, który działa, gdy nazwa podmiotu wyświetlania nazwy węzła jest wyłączona, ale nie działa, gdy jest włączona.

foreach_in_collection reg_id [get_registers foo*] { ustawić
    reg_name [get_node_info -name $reg_id]
    # ...
    set pin_id [get_pins ${reg_name}|clk] # Jeśli reg_name
    zawiera encje, połączenie get_pins zawsze nie powiedzie się
}

Kiedy nazwa podmiotu Wyświetlania dla nazwy węzła jest wyłączona, zmienna reg_name nie zawiera nazw jednostek, więc połączenie get_pins zakończy się pomyślnie. Kiedy nazwa podmiotu Wyświetlania dla nazwy węzła jest włączona, zmienna reg_name zawiera nazwy jednostek, więc połączenie get_pins nie powiedzie się.

Rozwiązania

Najłatwiejszym sposobem na uniknięcie potencjalnych problemów jest wyłączenie nazwy podmiotu Wyświetlania dla nazwy węzła i używanie tylko nazw instancji w odniesieniu do węzłów. Dzięki temu rozwiązaniu nazwy zwracane przez get_registers są nazwami wyłącznie instancji i działają z get_pins i get_cells.

Jeśli nie wyłączasz nazwy podmiotu Wyświetlania dla nazwy węzłai przekazujesz nazwy zwracane przez get_registers do get_pins lub get_cells,musisz upewnić się, że usuniesz wszystkie nazwy podmiotów. Można użyć prostego wyrażenia regsub, aby usunąć większość nazw jednostek. Poniższe polecenie Tcl usuwa wszystkie nazwy jednostek z nazwy węzła, o ile nazwy jednostek zawierają tylko litery, cyfry i podkreślniki (znaki w klasie znaków \w).

regsub -all {\w*:} $reg_name {} reg_name

Wymieniony wzór wyrażeń regularnych nie obsługuje każdego prawidłowego znaku w identyfikatorach HDL. Nie obsługuje wygenerowanych nazw jednostek, które obejmują backslashes (\), znak dolara ($) w prostych identyfikatorach Verilog HDL, identyfikatory adwersarzy Verilog HDL lub rozszerzone identyfikatory w VHDL. Można konstruować bardziej zaawansowane wyrażenia regularne, aby obsłużyć nazwy podmiotów z tymi znakami, ale prostsze jest wyłączenie nazwy podmiotu Wyświetlania dla nazwy węzła.
W poniższym przykładzie pokazano, jak zintegrować wyrażenie regsub z nieobjętą pracą przykładem powyżej. W poniższym przykładzie wyrażenie regsub usuwa nazwy jednostek z nazwy rejestru (z zastrzeżeniem opisanych wykluczeń znaków), aby połączenie get_pins nie powiodło się. Przykład działa niezależnie od wartości nazwy podmiotu Wyświetlania dla nazwy węzła.

foreach_in_collection reg_id [get_registers foo*] {
    zestaw reg_name [get_node_info -name $reg_id]
    regsub -all {\w*:} $reg_name {} reg_name #
    reg_name nie zawiera już elementów
    # ...
    ustaw pin_id [get_pins ${reg_name}|clk]
    # reg_name nie zawiera już jednostek, więc get_pins się powiedzie
}

Materiały zawarte na tej stronie są tłumaczeniem z języka angielskiego, wykonanym częściowo przez człowieka, a częściowo automatycznie. Materiały te są udostępnione dla Twojej wygody i należy je traktować jedynie jako ogólne źródło informacji. Nie ma jednak gwarancji, że są one kompletne bądź poprawne. Jeśli istnieje jakakolwiek rozbieżność między wersją angielską tej strony a jej tłumaczeniem, wersja angielska jest wersją obowiązującą i ma rozstrzygające znaczenie. Wyświetl anglojęzyczną wersję tej strony.