Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #=================================================
- # File : PrimeTime - Timing Verification of ARM GPU Asynchronous Bridge
- # Date : 12-October-2015
- # Author : Ramnath Swamy
- # Company : ARM Ltd
- #=================================================
- proc rbx_report_gpu_aync_timing { \
- destination_pld_regs_inpin_list \
- destination_ptr_regs_inpin_list \
- Pclkb \
- {M "2"} \
- {R "2"} \
- {N ""} \
- {Pclka ""} \
- } {
- # Parameters definition
- # N = FIFO Depth
- # M = Total number of Synchronizer stages
- # R = Number of Pointer-margin stages
- # Pclka = Sending domain Clock period
- # Pclkb = Receiving domain Clock period
- global sh_product_version
- set ptr_strobe_derate 1
- #---------------------------------------------
- # Check Pre-requisites
- #---------------------------------------------
- if {$M < 2} {
- puts "\nError: rbx_report_gpu_aync_timing: M cannot be less than 2. Synchronizers must have atleast 2 stages\n"
- return -code 0
- }
- if {$R > $M} {
- puts "\nError: rbx_report_gpu_aync_timing: Total synchronizer stages of M=$M offers a maximum guaranteed pointer-margin of $M cycle(s)'"
- puts " So \'R\' cannot be greater than $M\n"
- return -code 0
- }
- if {$R < 0} {
- puts "\nError: rbx_report_gpu_aync_timing: R cannot be less than 0\n"
- return -code 0
- }
- if {$R == 0} {
- puts "\nWarning: rbx_report_gpu_aync_timing: R is set to be 0. Hence no pointer-margin is used.\n"
- }
- #---------------------------------------------
- # Measurement
- #---------------------------------------------
- # Get Payload Paths
- set pld_paths [get_timing_paths -max_paths 10000 -to [get_pins $destination_pld_regs_inpin_list] -slack_lesser_than inf]
- # Get Pointer Paths
- set ptr_paths [get_timing_paths -max_paths 10000 -to [get_pins $destination_ptr_regs_inpin_list] -slack_lesser_than inf]
- # Get Tpld and Tptr
- set max_Tpld [lindex [lsort -decreasing -real [get_attribute $pld_paths arrival]] 0]
- set min_Tptr [lindex [lsort -increasing -real [get_attribute $ptr_paths arrival]] 0]
- set max_Tptr [lindex [lsort -decreasing -real [get_attribute $ptr_paths arrival]] 0]
- #---------------------------------------------
- # Slack Calculation
- #---------------------------------------------
- # SignOff Condition-1:
- #--------------------
- # Caluclate slack1
- #.................
- if {$R == $M} {
- set relaxation ""
- set slack1 [expr ($min_Tptr*$ptr_strobe_derate)-$max_Tpld]
- } elseif {$R < $M} {
- set relaxation " - ((M - R) x Pclkb)"
- set slack1 [expr ($min_Tptr*$ptr_strobe_derate)-($max_Tpld-(($M - $R) * $Pclkb))]
- }
- if {$slack1 < 0} {set slack1_stat "(VIOLATED)"} else {set slack1_stat "(MET)"}
- # SignOff Condition-2:
- #--------------------
- # Caluclate slack2
- #.................
- set ptr_skew [expr $max_Tptr - ($min_Tptr*$ptr_strobe_derate)]
- set slack2 [expr $Pclkb - $ptr_skew]
- if {$slack2 < 0} {set slack2_stat "(VIOLATED)"} else {set slack2_stat "(MET)"}
- # SignOff Condition-3:
- #--------------------
- # Caluclate slack3
- #.................
- if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
- set upperbound [expr ( ($N * $Pclka) - ($M+1) *($Pclka + $Pclkb) )/2]
- if {$upperbound <= 0} {
- set upperbound $Pclka
- puts "\nWarning: (rbx_report_gpu_aync_timing) upperbound is set to one sending clock period $Pclka\n"
- set upperbound_stat "(reset to 1 clock perriod)"
- } else {
- set upperbound_stat ""
- }
- set slack3 [expr $upperbound - ($max_Tptr/$ptr_strobe_derate)]
- if {$slack3 < 0} {set slack3_stat "(VIOLATED)"} else {set slack3_stat "(MET)"}
- } else {
- set upperbound "-"
- set slack3 "Untested"
- set slack3_stat ""
- }
- # Reporting
- if {$M == ""} {set M_value "_"} else {set M_value $M}
- if {$R == ""} {set R_value "_"} else {set R_value $R}
- if {$Pclka == ""} {set Pclka_value "_"} else {set Pclka_value $Pclka}
- if {$N == ""} {set N_value "_"} else {set N_value $N}
- if {$Pclkb == ""} {set Pclkb_value "_"} else {set Pclkb_value $Pclkb}
- puts ""
- puts "***********************************************************************"
- puts " rbx_report_gpu_aync_timing"
- puts ""
- puts " Design - [get_attribute [get_design] full_name]"
- puts " Version - $sh_product_version"
- puts " Date - [date]"
- puts "-----------------------------------------------------------------------"
- puts " Input parameters Value Description"
- puts ""
- puts " SignOff Condition-1:"
- puts [format "%-3s %-19s %-15s %-42s" " " "M" "$M_value" "Total Synchronizer stages"]
- puts [format "%-3s %-19s %-15s %-42s" " " "R" "$R_value" "Pointer-margin stages"]
- puts [format "%-3s %-19s %-15s %-42s" " " "Pclkb" "$Pclkb_value" "Receiving Clock period"]
- puts ""
- puts " SignOff Condition-2:"
- puts [format "%-3s %-19s %-15s %-42s" " " "Pclkb" "$Pclkb_value" "Receiving Clock period"]
- puts ""
- puts " SignOff Condition-3:"
- puts [format "%-3s %-19s %-15s %-42s" " " "N" "$N_value" "Total number of slots(fifo depth)"]
- puts [format "%-3s %-19s %-15s %-42s" " " "Pclka" "$Pclka_value" "Sending Clock period"]
- puts ""
- puts "Form More Information Refer White-Paper \"Timing Verification of GPU ASYNC Bridge IP\" from ARM"
- puts " ------------------------------------------"
- puts "***********************************************************************"
- puts "\n"
- puts "SignOff Condition-1(Mandatory): Tptr >= Tpld $relaxation"
- puts "-----------------------------------------------------------------------"
- puts "Min Tptr = $min_Tptr"
- puts "Max Tpld = $max_Tpld"
- puts "Slack = $slack1 $slack1_stat"
- puts "-----------------------------------------------------------------------"
- puts "\n"
- puts "SignOff Condition-2(Mandatory): max(Tptr_0: Tptr_Y) - min(Tptr_0: Tptr_Y) < Pclkb"
- puts "-----------------------------------------------------------------------"
- puts "max(Tptr_0: Tptr_Y) = $max_Tptr"
- puts "min(Tptr_0: Tptr_Y) = $min_Tptr"
- puts "Slack = $slack2 $slack2_stat"
- puts "-----------------------------------------------------------------------"
- puts "\n"
- puts "SignOff Condition-3(Recommended): Tptr < Upperbound = ((N x Pclka) - (M+1)(Pclka + Pclkb)) / 2"
- puts "-----------------------------------------------------------------------"
- if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
- puts "Upperbound = $upperbound $upperbound_stat"
- puts "Max Tptr = $max_Tptr"
- puts "Slack = $slack3 $slack3_stat"
- puts "-----------------------------------------------------------------------"
- } else {
- puts "Not Tested"
- }
- puts "\n1\n"
- }
- # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement