Kiedy zamykasz timingi na projekcie, często warto wiedzieć, ile jest poziomów logiki w nieudanych ścieżkach. Analizator timingów wyświetla liczbę poziomów logiki podczas zgłaszania timingów ścieżki, ale nie ma domyślnego raportu zawierającego listę poziomów logiki dla zestawu ścieżek. W tym przykładzie projektu zdefiniowano niestandardową procedurę, której można użyć do tworzenia raportów pokazujących liczbę poziomów logiki dla zestawów ścieżek.
Procedura niestandardowa obsługuje ten sam proces, co polecenie report_timing. Należy skorzystać z tych samych opcji z niestandardową procedurą, którą należy zastosować za pomocą polecenia report_timing. Procedura niestandardowa obsługuje również trzy dodatkowe opcje: -greater_than <value>, -less_than <value> oraz -file <fiks>. Opcje -greater_than i -less_than można ograniczyć raportowanie do ścieżek o wartości większej lub mniejszej niż określone poziomy logiki. Możesz użyć opcji -file, by zapisać raport w pliku.
Niestandardowa procedura wyświetla liczby poziomów logiki dla ścieżek z najgorszym czasem zasuwu. Niekoniecznie wyświetla ścieżki w projekcie z największą liczbą poziomów logiki. Ścieżki z najgorszym czasem zacięcia nie zawsze są ścieżkami o największej liczbie poziomów logiki, choć często jest to prawdą.
Operacja procedury
Procedura niestandardowa wykorzystuje następujące kroki.
- Uzyskaj listę ścieżek spełniających kryteria raportowania
- Uzyskaj liczbę poziomów logiki dla każdej ścieżki
- Wyświetl liczbę poziomów logiki i informacji o ścieżce na wykresie
Krok 1: Uzyskaj listę ścieżek
Procedura niestandardowa wykorzystuje polecenie get_timing_paths, które obsługuje ten sam argument, co polecenie report_timing. Możesz skorzystać z dowolnych opcji dla report_timing, aby kontrolować analizę timingów. Na przykład można ograniczyć raport dotyczący liczby poziomów logiki do ścieżek, które kończy się określoną nazwą rejestru. Poniższy kod Tcl ukazuje definicję procedury i przekazuje wszystkie kody jakości do polecenia get_timing_paths.
proc report_levels_of_logic { args } { # Przełęcz wszystkie błędy z przepuszczeniem prosto do get_timing_paths jeśli { [catch { eval get_timing_paths $args } paths_col] } { post_message błąd typu $paths_col return } }
Krok 2: uzyskaj liczbę poziomów logiki dla każdej ścieżki
Użyj pętli do iteracji nad kolekcją ścieżki w zmiennej paths_col i wyodrębnij liczbę poziomów logiki w każdej ścieżce. Zapisz informacje o ścieżce w strukturze danych macierzy Tcl, która będzie wykorzystywana do drukowania wyników. Informacje, które zostały zapisane, to liczba poziomów logiki, zastój ścieżki oraz nazwy węzłów źródłowych i docelowych.
foreach_in_collection path_obj $paths_col { # Ile jest poziomów logiki na ścieżce? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Dodaj informacje o ścieżce do macierzy. $logic_levels_matrix add row [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] ] }
Krok 3: Wyświetl informacje o ścieżce w wykresie
Nareszcie wyświetl wszystkie informacje o ścieżce przechowywane w zmiennej macierzy. W tym przykładzie użyto pakietu raportu Tcl do sformatowania macierzy, aby ją wydrukować. Poniższy kod dodaje wiersz nagłówka do macierzy, definiuje styl wizualny raportu, ustawia wysyp komórek i wyświetla raport.
# Wprowadź wiersz nagłówka $logic_levels_matrix insert row 0 \ [lista "Poziomy logiki" "Slack" "Z" "Do"] # Potrzebny nam styl zdefiniowany do wydruku tabeli wyników catch { ::report::rmstyle basicrpt }:report::d efstyle basicrpt {{cap_rows 1}} { zestaw danych [split "[ciąg powtórz " " [kolumny];"] top set [split "[string repeat "+ - " [columns]]+"] bottom set [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Stwórz raport, ustaw kolumny na jedną przestrzeń do wysypania i # wydrukuj macierz z określonym formatem catch { r destroy } ::report:report r 4 style basicrpt dla { set col 0 } { $col < [r columns]} { incr col } { r pad $col both " " } post_message "Poziomy logiki\n[r printmatrix $logic_levels_matrix]"
Procedura niestandardowa
Kod podanej poniżej procedury niestandardowej zawiera opcje zapisu raportu do pliku i ograniczenia zgłoszonych ścieżek, chyba że liczba poziomów logiki jest większa lub mniejsza niż określone przez użytkownika wartości.
Oto niektóre przykłady na to, jak można skorzystać z niestandardowej procedury.
- report_levels_of_logic -setup -greater_than 10 -to [get_registers data*] -npaths 1000
- report_levels_of_logic -hold -from_clock core_50 -npaths 50 -file levels.txt
Aby skorzystać z niestandardowej procedury, zapisz poniższy kod Tcl w pliku o nazwie report_levels_of_logic.tcl. Następnie użyj źródła poleceń report_levels_of_logic.tcl w wierszu polecenia Timing Analyzer Tcl. Wyekskrywanie pliku oznacza procedurę niestandardową. Następnie można użyć nowo zdefiniowanego report_levels_of_logic poleceń, dopóki nie zakończysz analizatora timingów.
pakiet wymaga pakietu cmdline, który wymaga pakietustrukturct::matrix; pakiet wymaga raportu report_levels_of_logic { args } { opcje zestawu { { "less_than.arg" "" "Limit ścieżek z mniejszym niż ten numer" } { "greater_than.arg" "" "Limit ścieżek z większą niż ten numer" } { "file.arg" "" "Output file name" } } zestaw macierzy opts [::cmdline::getKnownOptions args $options] # Upewnij się, że procedura jest wywoływana z jakąś opcją umożniania. if { [string equal "" $opts(less_than)] && [string equal "" $opts(greater_than)] } { post_message -type warning "Wymień wartość numeryczną\ dla -less_than lub -greater_than" return } # Upewnij się, że procedura jest wywoływana z wartościami argumentów numerycznych, jeśli { ![ ciąg to double $opts(less_than)] } { post_message -ostrzeżenie typu "Musisz podać wartość numeryczną\ dla -less_than" return } if { ![ ciąg to double $opts(greater_than)] } { post_message -ostrzeżenie typu "Musisz wyznaczyć wartość numeryczną\ dla zwrotu -greater_than" } # Stwórz macierz w celu przechowywania informacji o nieudanych ścieżkach ustawionych logic_levels_matrix [::program:matrix] $logic_levels_matrix dodaj kolumny 4 # Przełęcz wszystkie niewiadome błędy bezpośrednio do get_timing_paths jeśli { [catch { eval get_timing_paths $args } paths_col] } { post_message -błąd typu $paths_col return } # Przejdź przez listę ścieżek timingów, uzyskujących informacje # na temat poziomów logiki foreach_in_collection path_obj $paths_col { # Załóżmy, że ścieżka zostanie zgłoszona, chyba że liczba poziomów logiki # jest poza określonymi granicami. ustawiona include_path 1 # Ile jest poziomów logiki na ścieżce? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Jeśli określiliśmy niższy limit, nie zgłaszamy ścieżki, jeśli poziomy logiki # są większe niż lub równe dolnej granicy, jeśli { ! [string equal "" $opts(less_than)] } { jeśli { $levels_of_logic >= $opts(less_than) } { ustawiona include_path 0 } } # Jeśli określiliśmy górną granicę, nie zgłaszamy ścieżki, jeśli # poziomy logiki są mniejsze niż lub równe górnej granicy, jeśli { ! [string equal "" $opts(greater_than)] } { jeśli { $levels_of_logic <= $opts(greater_than) } { ustawiona include_path 0 } } Jeśli ścieżka ma poziomy logiki, które mieszczą się w naszych granicach, #report on it if { $include_path } { $logic_levels_matrix add row [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] } } # Ukończono przechodzenie przez wszystkie ścieżki z get_timing_paths # Jeśli w zestawie są jakieś wiersze, ścieżki dopasowują się do kryteriów. # Musimy wydrukować tabelę z danymi. if { 0 == [$logic_levels_matrix rows] } { # Brak ścieżek spełnia kryteria # Wydrukuj szybki komunikat post_message "Brak ścieżek spełnia kryteria dotyczące zgłaszania poziomów logiki" # Jeśli pojawi się błąd otwierający plik, wydrukuj komunikat o tym. W przeciwnym razie można stwierdzić, że nie istnieją ścieżki spełniające kryteria, jeśli { ! [string equal "" $opts(plik)] } { jeśli { [catch { open $opts(file) w } fh] } { post_message -błąd typu "Nie otwieraj pliku: $fh" } inaczej { stawia $fh "Brak ścieżek spełnia kryteria do zgłaszania poziomów logiki" catch { close $fh } } } } jeszcze { # W wierszu nagłówka $logic_levels_matrix insert row 0 \ [lista "Poziomy logiki" "Slack" "Z" "Do"] # Potrzebny nam styl zdefiniowany do drukowania tabeli wyników typu catch { :: report::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { zestaw danych [split "[string repeat " " [kolumny]];"] top set [split "[string repeat "+ - " [columns]]+"] bottom set [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Stwórz raport, ustaw kolumny na jedną przestrzeń do wysypania i # wydrukuj macierz z określonym formatem catch { r destroy } ::report:report r 4 style basicrpt dla { set col 0 } { $col < [r columns]} { incr col } { r pad $col both " " } post_message "Levels of logic\n[r printmatrix $logic_levels_matrix]" # Zapisz raport w pliku, jeśli nazwa pliku jest określona, jeśli { ! [string equal "" $opts(plik)] } { jeśli { [catch { open $opts(file) w } fh] } { post_message -błąd typu "Nie otwieraj pliku, nie otwieraj pliku: $fh" } jeszcze { stawia $fh "Poziomy logiki" r printmatrix2channel $logic_levels_matrix $fh połowu { zamknij $fh } } }