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].
Tabela 1. Przykład zachowania get_registers
Nazwa podmiotu wyświetlania dla | wartości nazwy węzłazwracana jest nazwa węzła filtra. | |
---|---|---|
NA | ram:my_ram|ctrl:ctrl_1|addr[0] | ram:my_ram|ctrl:ctrl_1|addr[0] |
NA | my_ram|ctrl_1|addr[0] | ram:my_ram|ctrl:ctrl_1|addr[0] |
WYŁ. | ram:my_ram|ctrl:ctrl_1|addr[0] | my_ram|ctrl_1|addr[0] |
WYŁ. | my_ram|ctrl_1|addr[0] | my_ram|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.
Tabela 2. Przykład zachowania get_pins
Nazwa podmiotu wyświetlania dla | wartości nazwy węzłazwracana jest nazwa węzła filtra. | |
---|---|---|
NA | ram:my_ram|ctrl:ctrl_1|addr[0]|clk | Brak1 |
NA | my_ram|ctrl_1|addr[0]|klk | my_ram|ctrl_1|addr[0]|klk |
WYŁ. | ram:my_ram|ctrl:ctrl_1|addr[0]|clk | Brak1 |
WYŁ. | my_ram|ctrl_1|addr[0]|klk | my_ram|ctrl_1|addr[0]|klk |
Uwaga:
- 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 }