Advertisement
ramswa02

PrimeTime - Verification of ARM GPU Async Bridge

Oct 13th, 2015
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TCL 7.00 KB | None | 0 0
  1. #=================================================
  2. # File      : PrimeTime - Timing Verification of ARM GPU Asynchronous Bridge
  3. # Date      : 12-October-2015
  4. # Author    : Ramnath Swamy
  5. # Company   : ARM Ltd
  6. #=================================================
  7.  
  8.  
  9. proc rbx_report_gpu_aync_timing { \
  10.                                 destination_pld_regs_inpin_list \
  11.                                 destination_ptr_regs_inpin_list \
  12.                                 Pclkb \
  13.                                 {M      "2"} \
  14.                                 {R      "2"} \
  15.                                 {N      ""} \
  16.                                 {Pclka      ""} \
  17.                              } {
  18.  
  19.   # Parameters definition
  20.   # N       = FIFO Depth
  21.   # M       = Total number of Synchronizer stages
  22.   # R       = Number of Pointer-margin stages
  23.   # Pclka   = Sending domain Clock period
  24.   # Pclkb   = Receiving domain Clock period
  25.  
  26.   global        sh_product_version
  27.  
  28.   set ptr_strobe_derate     1
  29.  
  30.   #---------------------------------------------
  31.   # Check Pre-requisites
  32.   #---------------------------------------------
  33.  
  34.   if {$M < 2} {
  35.     puts "\nError: rbx_report_gpu_aync_timing: M cannot be less than 2. Synchronizers must have atleast 2 stages\n"
  36.     return -code 0
  37.   }
  38.  
  39.   if {$R > $M} {
  40.     puts "\nError: rbx_report_gpu_aync_timing: Total synchronizer stages of M=$M offers a maximum guaranteed pointer-margin of $M cycle(s)'"
  41.     puts "         So \'R\' cannot be greater than $M\n"
  42.     return -code 0
  43.   }
  44.  
  45.   if {$R < 0} {
  46.     puts "\nError: rbx_report_gpu_aync_timing: R cannot be less than 0\n"
  47.     return -code 0
  48.   }
  49.  
  50.   if {$R == 0} {
  51.     puts "\nWarning: rbx_report_gpu_aync_timing: R is set to be 0. Hence no pointer-margin is used.\n"
  52.   }
  53.  
  54.  
  55.   #---------------------------------------------
  56.   # Measurement
  57.   #---------------------------------------------
  58.   # Get Payload Paths
  59.   set pld_paths [get_timing_paths  -max_paths 10000 -to  [get_pins $destination_pld_regs_inpin_list] -slack_lesser_than inf]
  60.  
  61.   # Get Pointer Paths
  62.   set ptr_paths [get_timing_paths  -max_paths 10000 -to  [get_pins $destination_ptr_regs_inpin_list] -slack_lesser_than inf]
  63.  
  64.   # Get Tpld and Tptr
  65.   set max_Tpld  [lindex [lsort -decreasing -real [get_attribute $pld_paths arrival]] 0]
  66.   set min_Tptr  [lindex [lsort -increasing -real [get_attribute $ptr_paths arrival]] 0]
  67.   set max_Tptr  [lindex [lsort -decreasing -real [get_attribute $ptr_paths arrival]] 0]
  68.  
  69.   #---------------------------------------------
  70.   # Slack Calculation
  71.   #---------------------------------------------
  72.   # SignOff Condition-1:
  73.   #--------------------
  74.  
  75.   # Caluclate slack1
  76.   #.................
  77.   if {$R == $M} {
  78.     set relaxation      ""
  79.     set slack1          [expr ($min_Tptr*$ptr_strobe_derate)-$max_Tpld]
  80.   } elseif {$R < $M} {
  81.     set relaxation      " - ((M - R) x Pclkb)"
  82.     set slack1          [expr ($min_Tptr*$ptr_strobe_derate)-($max_Tpld-(($M - $R) * $Pclkb))]
  83.   }
  84.  
  85.   if {$slack1 < 0}      {set slack1_stat "(VIOLATED)"} else {set slack1_stat "(MET)"}
  86.  
  87.   # SignOff Condition-2:
  88.   #--------------------
  89.  
  90.   # Caluclate slack2
  91.   #.................
  92.   set ptr_skew          [expr $max_Tptr - ($min_Tptr*$ptr_strobe_derate)]
  93.   set slack2            [expr $Pclkb - $ptr_skew]
  94.  
  95.   if {$slack2 < 0}      {set slack2_stat "(VIOLATED)"} else {set slack2_stat "(MET)"}
  96.  
  97.   # SignOff Condition-3:
  98.   #--------------------
  99.  
  100.   # Caluclate slack3
  101.   #.................
  102.   if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
  103.  
  104.     set upperbound [expr ( ($N * $Pclka) - ($M+1) *($Pclka + $Pclkb) )/2]
  105.  
  106.     if {$upperbound <= 0} {
  107.       set upperbound $Pclka
  108.       puts "\nWarning: (rbx_report_gpu_aync_timing) upperbound is set to one sending clock period $Pclka\n"
  109.       set upperbound_stat "(reset to 1 clock perriod)"
  110.     } else {
  111.       set upperbound_stat ""
  112.     }
  113.  
  114.     set slack3   [expr $upperbound - ($max_Tptr/$ptr_strobe_derate)]
  115.  
  116.     if {$slack3 < 0} {set slack3_stat "(VIOLATED)"} else {set slack3_stat "(MET)"}
  117.   } else {
  118.     set upperbound  "-"
  119.     set slack3      "Untested"
  120.     set slack3_stat ""
  121.  
  122.   }
  123.  
  124.  
  125.   # Reporting
  126.   if {$M == ""}         {set M_value  "_"}  else {set M_value   $M}
  127.   if {$R == ""}         {set R_value  "_"}  else {set R_value   $R}
  128.   if {$Pclka == ""}     {set Pclka_value "_"}   else {set Pclka_value   $Pclka}
  129.   if {$N == ""}         {set N_value  "_"}  else {set N_value   $N}
  130.   if {$Pclkb == ""}     {set Pclkb_value "_"}   else {set Pclkb_value   $Pclkb}
  131.   puts ""
  132.   puts "***********************************************************************"
  133.   puts " rbx_report_gpu_aync_timing"
  134.   puts ""
  135.   puts "    Design              - [get_attribute [get_design] full_name]"
  136.   puts "    Version             - $sh_product_version"
  137.   puts "    Date                - [date]"
  138.   puts "-----------------------------------------------------------------------"
  139.   puts " Input parameters   Value       Description"
  140.   puts ""
  141.   puts " SignOff Condition-1:"
  142.   puts [format "%-3s %-19s %-15s %-42s" " " "M" "$M_value" "Total Synchronizer stages"]
  143.   puts [format "%-3s %-19s %-15s %-42s" " " "R" "$R_value" "Pointer-margin stages"]
  144.   puts [format "%-3s %-19s %-15s %-42s" " " "Pclkb" "$Pclkb_value" "Receiving Clock period"]
  145.   puts ""
  146.   puts " SignOff Condition-2:"
  147.   puts [format "%-3s %-19s %-15s %-42s" " " "Pclkb" "$Pclkb_value" "Receiving Clock period"]
  148.   puts ""
  149.   puts " SignOff Condition-3:"
  150.   puts [format "%-3s %-19s %-15s %-42s" " " "N" "$N_value" "Total number of slots(fifo depth)"]
  151.   puts [format "%-3s %-19s %-15s %-42s" " " "Pclka" "$Pclka_value" "Sending Clock period"]
  152.   puts ""
  153.   puts "Form More Information Refer White-Paper \"Timing Verification of GPU ASYNC Bridge IP\" from ARM"
  154.   puts "                                         ------------------------------------------"
  155.   puts "***********************************************************************"
  156.   puts "\n"
  157.   puts "SignOff Condition-1(Mandatory): Tptr >= Tpld $relaxation"
  158.   puts "-----------------------------------------------------------------------"
  159.   puts "Min Tptr        = $min_Tptr"
  160.   puts "Max Tpld        = $max_Tpld"
  161.   puts "Slack           = $slack1 $slack1_stat"
  162.   puts "-----------------------------------------------------------------------"
  163.   puts "\n"
  164.   puts "SignOff Condition-2(Mandatory): max(Tptr_0: Tptr_Y) - min(Tptr_0: Tptr_Y) < Pclkb"
  165.   puts "-----------------------------------------------------------------------"
  166.   puts "max(Tptr_0: Tptr_Y) = $max_Tptr"
  167.   puts "min(Tptr_0: Tptr_Y) = $min_Tptr"
  168.   puts "Slack           = $slack2 $slack2_stat"
  169.   puts "-----------------------------------------------------------------------"
  170.   puts "\n"
  171.   puts "SignOff Condition-3(Recommended): Tptr < Upperbound = ((N x Pclka) - (M+1)(Pclka + Pclkb)) / 2"
  172.   puts "-----------------------------------------------------------------------"
  173.   if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
  174.   puts "Upperbound      = $upperbound $upperbound_stat"
  175.   puts "Max Tptr        = $max_Tptr"
  176.   puts "Slack           = $slack3 $slack3_stat"
  177.   puts "-----------------------------------------------------------------------"
  178.   } else {
  179.   puts "Not Tested"
  180.   }
  181.  
  182.   puts "\n1\n"
  183.  
  184. }
  185.  
  186. # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement