Poziomy logiczne raportu

author-image

Według

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.

  1. Uzyskaj listę ścieżek spełniających kryteria raportowania
  2. Uzyskaj liczbę poziomów logiki dla każdej ścieżki
  3. 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 } }
    }

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.