Ketika Anda menutup waktu pada desain, sering berguna untuk mengetahui berapa banyak tingkat logika yang berada di jalur yang gagal. Penganalisis Waktu menampilkan jumlah tingkat logika saat Anda melaporkan waktu untuk jalur, tetapi tidak ada laporan bawaan yang mencantumkan jumlah tingkat logika untuk serangkaian jalur. Contoh desain ini menentukan prosedur kustom yang dapat Anda gunakan untuk membuat laporan yang menunjukkan jumlah tingkat logika untuk serangkaian jalur.
Prosedur kustom mendukung argumen yang sama seperti perintah report_timing. Anda harus menggunakan opsi yang sama dengan prosedur kustom yang Anda lakukan dengan perintah report_timing. Prosedur kustom juga mendukung tiga opsi tambahan: -greater_than <value>, -less_than <value>, dan -file <report file>. Anda dapat menggunakan opsi -greater_than dan -less_than untuk membatasi pelaporan ke jalur dengan tingkat logika yang lebih besar atau kurang dari yang ditentukan. Anda dapat menggunakan opsi -file untuk menulis laporan ke berkas.
Prosedur kustom menampilkan jumlah tingkat logika untuk jalur dengan kenduran waktu terburuk. Ini tidak serta merta menampilkan jalur dalam desain dengan jumlah tingkat logika terbesar. Jalur dengan kendur waktu terburuk tidak selalu merupakan jalur dengan jumlah tingkat logika terbesar, meskipun itu sering terjadi.
Operasi Prosedur
Prosedur kustom menggunakan langkah-langkah berikut.
- Dapatkan daftar jalur yang memenuhi kriteria pelaporan
- Dapatkan jumlah tingkat logika untuk setiap jalur
- Tampilkan jumlah tingkat informasi logika dan jalur dalam bagan
Langkah 1: Dapatkan Daftar Jalur
Prosedur kustom menggunakan perintah get_timing_paths, yang mendukung argumen yang sama dengan perintah report_timing. Anda dapat menggunakan opsi apa pun untuk report_timing mengontrol analisis waktu. Misalnya, Anda dapat membatasi laporan jumlah tingkat logika ke jalur yang berakhiran nama register tertentu. Kode Tcl berikut menunjukkan definisi prosedur, dan meneruskan semua argumen ke perintah get_timing_paths.
proc report_levels_of_logic { args } { # Pass all arguments straight to get_timing_paths if { [catch { eval get_timing_paths $args } paths_col] } { post_message -type error $paths_col return } }
Langkah 2: Dapatkan Jumlah Tingkat Logika untuk Setiap Jalur
Gunakan loop untuk iterasi pada pengumpulan jalur dalam variabel paths_col dan ekstrak jumlah tingkat logika di setiap jalur. Simpan informasi tentang jalur dalam struktur data matriks Tcl yang akan digunakan untuk mencetak hasil. Informasi yang disimpan adalah jumlah tingkat logika, kelambatan jalur, serta nama sumber dan node tujuan.
foreach_in_collection path_obj $paths_col { # Berapa banyak tingkat logika yang ada di jalurnya? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Tambahkan informasi jalur ke matriks. $logic_levels_matrix tambahkan baris [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]] ] }
Langkah 3: Tampilkan Informasi Jalur dalam Bagan
Terakhir, tampilkan semua informasi jalur yang disimpan dalam variabel matriks. Contoh ini menggunakan paket laporan Tcl untuk memformat matriks untuk mencetaknya. Kode berikut menambahkan baris judul ke matriks, menentukan gaya visual laporan, mengatur padding sel, dan menampilkan laporan.
# Masukkan baris header $logic_levels_matrix insert row 0 \ [list "Levels of logic" "Slack" "From" "To"] # Kita perlu gaya yang didefinisikan untuk mencetak tabel hasil penangkapan { ::report::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { data set [split "[string repeat " " [columns]];"] set atas [split "[string repeat "+ - " [columns]]+"] set bawah [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Buat laporan, atur kolom untuk memiliki satu spasi padding, dan # cetak matriks dengan format tangkapan tertentu { r destroy } ::report::report r 4 style basicrpt untuk { set col 0 } { $col < [r columns]} { incr col } { r pad $col " " } post_message "Tingkat logic\n[r printmatrix $logic_levels_matrix]"
Prosedur Kustom
Kode untuk prosedur kustom yang tercantum di bawah ini mencakup opsi untuk menulis laporan ke file, dan untuk membatasi jalur yang dilaporkan kecuali jumlah tingkat logika lebih besar atau kurang dari nilai yang ditentukan pengguna.
Ini adalah beberapa contoh bagaimana Anda dapat menggunakan prosedur kustom.
- 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
Untuk menggunakan prosedur kustom, simpan kode Tcl di bawah ini dalam file yang bernama report_levels_of_logic.tcl. Kemudian gunakan sumber perintah report_levels_of_logic.tcl di prompt Timing Analyzer Tcl. Pengadaan file menentukan prosedur kustom. Anda kemudian dapat menggunakan perintah yang baru ditentukan report_levels_of_logic hingga Anda keluar dari Penganalisis Waktu.
paket memerlukan paket cmdline memerlukan struct::matrix package require report proc report_levels_of_logic { args } { set options { {"less_than.arg" "" "Limit to paths with less than this number" } { "greater_than.arg" "" "Limit to paths with greater than this number" } { "file.arg" "" "Output file name" } } } array set opts [:cmdline::getKnownOptions args $options] # Pastikan bahwa prosedur dipanggil dengan beberapa argumen jika { [string equal "" $opts(less_than)] && [string equal "" $opts(greater_than)] } { post_message -type warning "Anda harus menentukan nilai numerik\ untuk return -less_than atau -greater_than" } # Pastikan bahwa prosedur disebut dengan nilai argumen numerik jika { ![ string adalah double $opts(less_than)] } { post_message -type warning "Anda harus menentukan nilai numerik\ untuk -less_than" return } jika { ![ string adalah double $opts(greater_than)] } { post_message -type warning "Anda harus menentukan nilai numerik\ untuk return -greater_than" } # Membuat matriks untuk menyimpan informasi tentang jalur gagal yang diatur logic_levels_matrix [::struct::matrix] $logic_levels_matrix add columns 4 # Pass all unknown arguments straight to get_timing_paths if { [catch { eval get_timing_paths $args } paths_col] } { post_message -type error $paths_col return } # Tembus daftar jalur waktu, dapatkan informasi # tentang tingkat logika foreach_in_collection path_obj $paths_col { # Asumsikan jalur akan dilaporkan, kecuali jumlah tingkat logika # berada di luar batas yang ditentukan. set include_path 1 # Berapa banyak tingkat logika yang ada di jalurnya? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Jika kami menentukan batas yang lebih rendah, kami tidak melaporkan jalur jika tingkat # logika lebih besar atau sama dengan batas bawah jika {! [string sama dengan "" $opts(less_than)] } { if { $levels_of_logic >= $opts(less_than) } { set include_path 0 } } # Jika kami menentukan batas atas, kami tidak melaporkan jalur jika tingkat # logika kurang dari atau sama dengan batas atas jika { ! [string sama dengan "" $opts(greater_than)] } { if { $levels_of_logic <= $opts(greater_than) } { set include_path 0 } } # Jika jalur memiliki tingkat logika yang masuk dalam batas kita, # laporkan di atasnya jika { $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]] ] } } } # Selesai melewati semua jalur dari get_timing_paths # Jika ada baris dalam matriks, jalur cocok dengan kriteria. # Kita harus mencetak tabel dengan informasi tersebut. jika { 0 == [$logic_levels_matrix rows] } { # Tidak ada jalur yang memenuhi kriteria # Cetak pesan singkat post_message "Tidak ada jalur yang memenuhi kriteria untuk melaporkan tingkat logika" # Jika ada kesalahan saat membuka file, cetak pesan yang mengatakan # itu. Jika tidak, katakanlah tidak ada jalur yang memenuhi kriteria jika {! [string sama dengan "" $opts(berkas)] } { if { [catch { open $opts(file) w } fh] } { post_message -type error "Tidak dapat membuka file: $fh" } else { menempatkan $fh "Tidak ada jalur yang memenuhi kriteria untuk melaporkan tingkat logika" penangkapan { close $fh } } } } else { # Masukkan ke baris header $logic_levels_matrix insert row 0 \ [list "Levels of logic" "Slack" "From" "To"] # Kita perlu gaya yang didefinisikan untuk mencetak tabel hasil penangkapan { :: report::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { data set [split "[string repeat " " [columns]];"] set atas [split "[string repeat "+ - " [columns]]+"] set bawah [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Buat laporan, atur kolom untuk memiliki satu spasi padding, dan # cetak matriks dengan format tangkapan tertentu { r destroy } ::report::report r 4 style basicrpt untuk { set col 0 } { $col < [r columns]} { incr col } { r pad $col " " } post_message "Tingkat logika\n[r printmatrix $logic_levels_matrix]" # Simpan laporan ke file jika nama file ditentukan jika { ! [string sama dengan "" $opts(berkas)] } { if { [catch { open $opts(file) w } fh] } { post_message -type error "Tidak bisa membuka file: $fh" } else { menempatkan $fh "Tingkat logika" r printmatrix2channel $logic_levels_matrix $fh penangkapan { close $fh } } } } }