Advertisement
ramswa02

PrimeTime - Verification of ARM® CoreLink™ ADB-400

Jun 9th, 2015
763
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TCL 6.34 KB | None | 0 0
  1. #=================================================
  2. # File      : PrimeTime - Timing Verification of ARM CoreLink ADB-400, AMBA Domain Bridge IP
  3. # Date      : 09-June-2015
  4. # Author    : Ramnath Swamy
  5. # Company   : ARM Ltd
  6. #=================================================
  7.  
  8.  
  9. proc rm_report_adb400_timing { \
  10.                                 destination_pld_regs_inpin_list \
  11.                                 destination_ptr_regs_inpin_list \
  12.                                 {slot_regs_list ""} \
  13.                                 {M      "2"} \
  14.                                 {R      "2"} \
  15.                                 {Pclkb      ""} \
  16.                                 {N      ""} \
  17.                                 {Pclka      ""} \
  18.                              } {
  19.  
  20.   # Parameters definition
  21.   # N       = FIFO Depth
  22.   # M       = Total number of Synchronizer stages
  23.   # R       = Number of Pointer-margin stages
  24.   # Pclka   = Slave Clock period
  25.   # Pclkb   = Master Clock period
  26.  
  27.   global        sh_product_version
  28.  
  29.   set ptr_strobe_derate     1
  30.  
  31.   #---------------------------------------------
  32.   # Check Pre-requisites
  33.   #---------------------------------------------
  34.  
  35.   if {$M < 2} {
  36.     puts "\nError: rm_report_adb400_timing: M cannot be less than 2. Synchronizers must have atleast 2 stages\n"
  37.     return -code 0
  38.   }
  39.  
  40.   if {$R > $M} {
  41.     puts "\nError: rm_report_adb400_timing: Total synchronizer stages of M=$M offers a maximum guaranteed pointer-margin of $M cycle(s)'"
  42.     puts "         So \'R\' cannot be greater than $M\n"
  43.     return -code 0
  44.   }
  45.  
  46.   if {$R < 0} {
  47.     puts "\nError: rm_report_adb400_timing: R cannot be less than 0\n"
  48.     return -code 0
  49.   }
  50.  
  51.   if {$R == 0} {
  52.     puts "\nWarning: rm_report_adb400_timing: R is set to be 0. Hence no pointer-margin is used.\n"
  53.   }
  54.  
  55.  
  56.   #---------------------------------------------
  57.   # Measurement
  58.   #---------------------------------------------
  59.   # Get Payload Paths
  60.   if {$slot_regs_list == ""} {
  61.     set pld_paths [get_timing_paths  -max_paths 10000 -to  [get_pins $destination_pld_regs_inpin_list] -slack_lesser_than inf]
  62.   } else {
  63.     set pld_paths [get_timing_paths  -max_paths 10000 -to  [get_pins $destination_pld_regs_inpin_list] -slack_lesser_than inf -from [get_cells $slot_regs_list]]
  64.   }
  65.  
  66.   # Get Pointer Paths
  67.   set ptr_paths [get_timing_paths  -max_paths 10000 -to  [get_pins $destination_ptr_regs_inpin_list] -slack_lesser_than inf]
  68.  
  69.   # Get Tpld and Tptr
  70.   set max_Tpld  [lindex [lsort -decreasing -real [get_attribute $pld_paths arrival]] 0]
  71.   set min_Tptr  [lindex [lsort -increasing -real [get_attribute $ptr_paths arrival]] 0]
  72.   set max_Tptr  [lindex [lsort -decreasing -real [get_attribute $ptr_paths arrival]] 0]
  73.  
  74.   #---------------------------------------------
  75.   # Slack Calculation
  76.   #---------------------------------------------
  77.   # SignOff Condition-1:
  78.   #--------------------
  79.  
  80.   # Caluclate slack1
  81.   #.................
  82.   if {$R == $M} {
  83.     set relaxation      ""
  84.     set slack1          [expr ($min_Tptr*$ptr_strobe_derate)-$max_Tpld]
  85.   } elseif {$R < $M} {
  86.     if {$Pclkb == ""} {
  87.       puts "\nError: rm_report_adb400_timing: Pclkb needs to be specified if R is less than M\n"
  88.       return -code 0
  89.     }
  90.  
  91.     set relaxation      " - ((M - R) x Pclkb)"
  92.     set slack1          [expr ($min_Tptr*$ptr_strobe_derate)-($max_Tpld-(($M - $R) * $Pclkb))]
  93.   }
  94.  
  95.   if {$slack1 < 0}      {set slack1_stat "(VIOLATED)"} else {set slack1_stat "(MET)"}
  96.  
  97.   # SignOff Condition-2:
  98.   #--------------------
  99.  
  100.   # Caluclate slack1
  101.   #.................
  102.   if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
  103.  
  104.     set upperbound [expr ( ($N * $Pclka) - $M*($Pclka + $Pclkb) )/2]
  105.  
  106.     if {$upperbound <= 0} {
  107.       set upperbound $Pclka
  108.       puts "\nWarning: (rm_report_adb400_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 slack2   [expr $upperbound - ($max_Tptr/$ptr_strobe_derate)]
  115.  
  116.     if {$slack2 < 0} {set slack2_stat "(VIOLATED)"} else {set slack2_stat "(MET)"}
  117.   } else {
  118.     set upperbound  "-"
  119.     set slack2      "Untested"
  120.     set slack2_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 " rm_report_adb400_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" "Master Clock period"]
  145.   puts ""
  146.   puts " SignOff Condition-2:"
  147.   puts [format "%-3s %-19s %-15s %-42s" " " "N" "$N_value" "Total number of slots(fifo depth)"]
  148.   puts [format "%-3s %-19s %-15s %-42s" " " "Pclka" "$Pclka_value" "Slave Clock period"]
  149.   puts "***********************************************************************"
  150.   puts ""
  151.   puts "SignOff Condition-1(Mandatory): Tptr >= Tpld $relaxation"
  152.   puts "-----------------------------------------------------------------------"
  153.   puts "Min Tptr        = $min_Tptr"
  154.   puts "Max Tpld        = $max_Tpld"
  155.   puts "Slack           = $slack1 $slack1_stat"
  156.   puts "-----------------------------------------------------------------------"
  157.   puts ""
  158.   puts "SignOff Condition-2(Recommended): Tptr < Upperbound = ((N x Pclka) - M(Pclka + Pclkb)) / 2"
  159.   puts "-----------------------------------------------------------------------"
  160.   if {$N != "" && $M != "" && $Pclka != "" && $Pclkb != ""} {
  161.   puts "Upperbound      = $upperbound $upperbound_stat"
  162.   puts "Max Tptr        = $max_Tptr"
  163.   puts "Slack           = $slack2 $slack2_stat"
  164.   puts "-----------------------------------------------------------------------"
  165.   } else {
  166.   puts "Not Tested"
  167.   }
  168.  
  169.   puts "\n1\n"
  170.  
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement