เมื่อคุณปิดเวลาในการออกแบบ มักจะเป็นประโยชน์มากที่จะทราบว่าตรรกะอยู่ในเส้นทางที่ล้มเหลวในระดับใด ตัววิเคราะห์เวลาจะแสดงจํานวนระดับของตรรกะเมื่อคุณรายงานการกําหนดเวลาสําหรับพาธ แต่ไม่มีรายงานเริ่มต้นที่แสดงจํานวนระดับของตรรกะสําหรับชุดพาธ ตัวอย่างการออกแบบนี้กําหนดขั้นตอนแบบกําหนดเองที่คุณสามารถใช้เพื่อสร้างรายงานที่แสดงจํานวนระดับของตรรกะสําหรับชุดพาธ
ขั้นตอนแบบกําหนดเองจะรองรับคํากรามเดียวกันกับคําสั่ง report_timing คุณควรใช้ตัวเลือกเดียวกันกับขั้นตอนที่กําหนดเองที่คุณต้องการใช้กับคําสั่ง report_timing ขั้นตอนแบบกําหนดเองยังรองรับตัวเลือกเพิ่มเติมสามตัวเลือก: -greater_than <value>, -less_than <value> และไฟล์ <report > คุณสามารถใช้ตัวเลือก -greater_than และ -less_than เพื่อจํากัดการรายงานไปยังพาธที่มีตรรกะมากกว่าหรือน้อยกว่าระดับที่ระบุ คุณสามารถใช้ตัวเลือก -file ในการเขียนรายงานไปยังไฟล์ได้
ขั้นตอนแบบกําหนดเองจะแสดงจํานวนระดับของตรรกะสําหรับเส้นทางด้วยช่องเสียบเวลาที่แย่ที่สุด โดยไม่จําเป็นต้องแสดงเส้นทางในการออกแบบด้วยตรรกะที่มีจํานวนลอจิกมากที่สุด เส้นทางที่มีเวลาสแล็กที่แย่ที่สุดไม่ใช่เส้นทางที่มีจํานวนตรรกะในระดับมากที่สุดเสมอไป แม้ว่ามักจะเป็นจริงก็ตาม
การดําเนินการตามขั้นตอน
ขั้นตอนแบบกําหนดเองใช้ขั้นตอนต่อไปนี้
- ดูรายการพาธที่ตรงกับเกณฑ์การรายงาน
- รับจํานวนระดับของลอจิกสําหรับแต่ละพาธ
- แสดงจํานวนระดับของข้อมูลลอจิกและพาธในแผนภูมิ
ขั้นตอนที่ 1: ดูรายการเส้นทาง
ขั้นตอนกําหนดเองใช้คําสั่ง get_timing_paths ซึ่งสนับสนุนการอธิบายเช่นเดียวกับคําสั่ง report_timing คุณสามารถใช้ตัวเลือกใดๆ สําหรับreport_timingเพื่อควบคุมการวิเคราะห์เวลา ตัวอย่างเช่น คุณสามารถจํากัดรายงานจํานวนระดับของตรรกะไปยังพาธที่ลงท้ายด้วยชื่อรีจิสเตอร์บางชื่อ โค้ด Tcl ต่อไปนี้แสดงคํานิยามของขั้นตอน และส่งคําอธิบายทั้งหมดไปยังคําสั่ง get_timing_paths
proc report_levels_of_logic { args } { # Pass ทั้งหมดตรงไปยังget_timing_paths หาก { {eval get_timing_paths $args } paths_col] } { post_message -type error $paths_col return } }
ขั้นตอนที่ 2: รับจํานวนระดับของลอจิกสําหรับแต่ละพาธ
ใช้ลูปเพื่อวนซ้ํากับชุดพาธในตัวแปร paths_col และแยกจํานวนระดับของตรรกะในแต่ละพาธ บันทึกข้อมูลเกี่ยวกับพาธในโครงสร้างข้อมูลเมทริกซ์ Tcl ที่จะใช้ในการพิมพ์ผลลัพธ์ ข้อมูลที่บันทึกคือจํานวนระดับของตรรกะ สแล็กของพาธ และชื่อโหนดต้นทางและปลายทาง
foreach_in_collection path_obj $paths_col { # มี ตรรกะอยู่ในเส้นทาง กี่ระดับ ตั้งค่า levels_of_logic [get_path_info -num_logic_levels $path_obj] # เพิ่มข้อมูลพาธไปยังเมทริกซ์ $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]] ] }
ขั้นตอนที่ 3: แสดงข้อมูลพาธในแผนภูมิ
และท้ายที่สุด ให้แสดงข้อมูลพาธทั้งหมดที่เก็บไว้ในตัวแปรเมทริกซ์ ตัวอย่างนี้ใช้แพคเกจรายงาน Tcl เพื่อจัดรูปแบบเมทริกซ์เพื่อพิมพ์ออกมา โค้ดต่อไปนี้จะเพิ่มแถวหัวเรื่องให้กับเมทริกซ์ กําหนดลักษณะการแสดงผลของรายงาน ตั้งค่าช่องว่างภายในเซลล์ และแสดงรายงาน
# ใส่แถวส่วนหัว $logic_levels_matrix insert row 0 \ [list "ระดับของลอจิก" "Slack" "จาก" "ถึง"] # เราต้องมีการกําหนดสไตล์ในการพิมพ์ตารางผลลัพธ์ { ::report::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { ชุดข้อมูล [split "[string repeat " " [columns]];"] ชุดด้านบน [split "[string repeat "+ - " [columns]+"] ชุดด้านล่าง [top get] ชุด topcapsep [top get] topdata [data get] topcapsep เปิดใช้งาน topcapsep เปิดใช้งาน tcaption $cap_rows } # สร้างรายงาน ตั้งค่าคอลัมน์ให้มีช่องว่าง 1 ช่อง และ พิมพ์เมทริกซ์ตามรูปแบบที่ระบุ { r destroy } ::report:report:report r 4 style basicrpt สําหรับ { set col 0 } { $col < [r columns]} { incr col } { r pad $colทั้งสอง " } post_message "ระดับลอจิก\n[r printmatrix $logic_levels_matrix]"
ขั้นตอนแบบกําหนดเอง
รหัสสําหรับขั้นตอนแบบกําหนดเองที่แสดงไว้ด้านล่างมีตัวเลือกในการเขียนรายงานไปยังไฟล์ และจํากัดพาธที่รายงาน เว้นแต่จํานวนระดับของตรรกะจะมีค่ามากกว่าหรือน้อยกว่าค่าที่ระบุโดยผู้ใช้
นี่เป็นตัวอย่างบางส่วนของวิธีที่คุณสามารถใช้ขั้นตอนแบบกําหนดเอง
- 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
หากต้องการใช้ขั้นตอนแบบกําหนดเอง ให้บันทึกรหัส Tcl ด้านล่างในไฟล์ที่มีชื่อว่า report_levels_of_logic.tcl แล้วใช้แหล่งคําสั่ง report_levels_of_logic.tcl ที่พรอมท์ Tclr ตัววิเคราะห์เวลา การจัดหาไฟล์เป็นตัวกําหนดขั้นตอนแบบกําหนดเอง จากนั้นคุณสามารถใช้คําสั่งที่กําหนดไว้ใหม่report_levels_of_logicจนกว่าคุณจะออกจากตัววิเคราะห์เวลา
แพคเกจจําเป็นต้องมีแพคเกจ cmdline จําเป็นต้องมี struct::matrix package ต้องใช้report_levels_of_logicรายงาน proc { args } { ตั้งค่าตัวเลือก { { "less_than.arg" "" "ขีดจํากัดไปยังพาธที่มีหมายเลขน้อยกว่านี้" { "greater_than.arg" "" "" จํากัดเฉพาะพาธที่มีจํานวนมากกว่านี้" } { "file.arg" "" "ชื่อไฟล์เอาต์พุต" } } ชุดอาร์เรย์เลือก [:cmdline::getKnownOptions $options] # ตรวจสอบให้แน่ใจว่ามีการเรียกขั้นตอนด้วยบางประการ หาก { [string equal "" $opts(less_than)] & [string equal "" $opts(greater_than)] } { post_message -type warning "คุณต้องระบุค่าตัวเลข\ สําหรับ -less_than หรือ -greater_than" การ ส่งคืน } # ตรวจสอบให้แน่ใจว่ามีการเรียกขั้นตอนด้วยค่าตัวเลข อยู่หาก { ![ string is double $opts(less_than)] } { post_message -type คําเตือน "คุณต้องระบุค่าตัวเลข\ สําหรับการส่งคืน -less_than" } หาก { ![ string is double $opts(greater_than)] } { post_message -type warning "คุณต้องระบุค่าตัวเลข\ สําหรับการส่งคืน -greater_than" } # สร้างเมทริกซ์เพื่อเก็บข้อมูลเกี่ยวกับพาธที่ล้มเหลว ที่ตั้งค่าlogic_levels_matrix [::struct:: matrix] $logic_levels_matrix เพิ่มคอลัมน์ 4 # ส่งสิ่งที่ไม่ทราบทั้งหมดไปยังget_timing_pathsหาก { {eval get_timing_paths $args } paths_col] } { post_message -type error $paths_col return } # ดูรายการพาธเวลา รับข้อมูล # เกี่ยวกับระดับของตรรกะ foreach_in_collection path_obj $paths_col { # สมมติฐานว่าพาธจะได้รับการรายงาน เว้นแต่ว่าจํานวนระดับของ # ลอจิกอยู่นอกขอบเขต ที่ระบุ ตั้งค่าinclude_path 1 # มีตรรกะอยู่ในเส้นทาง กี่ระดับ ตั้งค่าlevels_of_logic [get_path_info -num_logic_levels $path_obj] # หากเราระบุขอบเขตที่ต่ํากว่า เราจะไม่รายงานพาธหาก ระดับ # ของตรรกะมีค่ามากกว่าหรือเท่ากับขอบเขตล่าง ถ้า { ! [string เท่ากับ "" $opts(less_than)] } { ถ้า { $levels_of_logic >= $opts(less_than) } { ตั้งค่า include_path 0 } } # หากเราระบุขีดจํากัดบน เราไม่รายงานพาธหาก ระดับ # ของตรรกะน้อยกว่าหรือเท่ากับขีดจํากัดบนถ้า { ! [string เท่ากับ "" $opts(greater_than)] } { ถ้า { $levels_of_logic <= $opts(greater_than) } { set include_path 0 } } # หากพาธมีระดับของตรรกะที่อยู่ภายในขอบเขตของเรา # รายงานอยู่ ถ้า { $include_path } { $logic_levels_matrix เพิ่มแถว [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]] } # เสร็จสิ้นการผ่านเส้นทางทั้งหมดจาก get_timing_paths # หากมีแถวใดๆ ในเมทริกซ์ พาธที่ตรงกับเกณฑ์ # เราต้องพิมพ์ตารางพร้อมข้อมูล นั้น หาก { 0 == [$logic_levels_matrix rows] } { # ไม่มีพาธตรงตามเกณฑ์ # พิมพ์ข้อความด่วน post_message "ไม่มีพาธที่ตรงกับเกณฑ์ในการรายงานระดับลอจิก" # หากมีข้อผิดพลาดในการเปิดไฟล์ ให้พิมพ์ข้อความว่า # ดังกล่าว หรือบอกว่าไม่มีพาธที่ตรงตามเกณฑ์ หาก { ! [string เท่ากับ "" $opts(ไฟล์)] } { หาก { [เข้าถึง { open $opts(file) w } fh] } { post_message -type error "จดหมายข่าว: $fh" } อื่นๆ { ใส่$fh "ไม่มีพาธที่ตรงกับเกณฑ์ในการรายงานระดับของลอจิก" ที่ละเอียด { close $fh $fh } } } } อื่น { # ใส่ในแถวส่วนหัว $logic_levels_matrix แทรกแถว 0 \ [รายการ "ระดับของลอจิก" "Slack" "จาก" "ถึง"] # เราต้องมีสไตล์ที่กําหนดให้พิมพ์ตารางผลลัพธ์ ที่ให้มา { :: report:rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { ชุดข้อมูล [split "[string repeat " " [columns];"] ชุด top set [split "[string repeat "+ - " [columns]+"] ชุดด้านล่าง [top get] ชุด topcapsep [top get] topdata [data get] topcapsep เปิดใช้งาน topcapsep เปิดใช้งานด้านล่างเปิดใช้งาน tcaption $cap_rows } # สร้างรายงาน, ตั้งค่าคอลัมน์ให้มีที่ว่าง 1 ช่องใน padding และ # พิมพ์เมทริกซ์ด้วยรูปแบบที่ระบุ { rทําลาย } ::report:report:r 4 style basicrpt สําหรับ { set col 0 } { $col < [r columns]} { incr col } { r pad $colทั้งสอง " " } post_message "ระดับลอจิก\n[r printmatrix $logic_levels_matrix]" # บันทึกรายงานไปยังไฟล์หากมีการระบุชื่อไฟล์ ถ้า { ! [string เท่ากับ "" $opts(ไฟล์)] } { หาก { [open $opts(file) w } fh] } { post_message -type error "Print't open file: $fh" } อื่นๆ { ใส่$fh "ระดับลอจิก" r printmatrix2channel $logic_levels_matrix $fh เข้าถึง { close $fh } } } }