( ESNUG 432 Item 7 ) -------------------------------------------- [08/25/04]


From: Colin Macdonald <c.macdonald=user domain=freescale spot calm>
Subject: Using PrimeTime-SI, PhysOpt, and Astro to Address Crosstalk Delay

Hi John,

My colleague Anis Jarrar and I have developed a "signal integrity aware"
timing closure methodology that's been used successfully on a number of
0.13u SoCs here at Freescale Semiconductor.  Although this methodology
addresses both crosstalk delay and crosstalk noise, we'd like to describe
in some detail our approach to crosstalk delay  -- which we have found to
present the greater challenge.

We used PrimeTime-SI to automatically analyze failing data paths in detail
to generate a list of tailored fixes:

  1) cell upsizing for setup violations
  2) delay cell insertion for hold fixes
  3) wire repels for setup and hold violations

The cell upsizes and insertions that were written out from PrimeTime-SI
were implemented via Design Compiler.  Astro constraints files, generated
by PrimeTime-SI, were used to implement wire-repels both automatically and,
in the very last stages, manually.
 
Crosstalk can only be fully addressed during or after detailed route, which
is late in the design flow and typically a crunch period.  Chip-level
netlists and parasitic files are large and time consuming to get in and
out.  Until synthesis and physical design tools become fully SI aware, the
disconnect between SI measurement and fixing means that fixes may either
not work, not work fully or may cause other problems.


Preventing Crosstalk Delay In Layout:

Astro-Xtalk provides crosstalk and noise analysis.  While its timing window
and other delay calculations were not quite as accurate as PrimeTime-SI, we
still employed Astro-Xtalk to reduce the initial size of our crosstalk
problem.  However, in order to meet our aggressive timing goals, we also
used PhysOpt for placement.

We had specific polices for the design of clock and asynchronous networks.
Additionally, we established new floorplan guidelines for our designers. 
 
  1. Clock Networks.

     We've found that double/triple spacing clock network tracks and routing
     clocks on reserved metal layers is very effective in eliminating
     crosstalk on clock networks.   Clock networks (and other high fan-out
     nets) have many levels of logic.  Each receiver in a clock tree network
     can incur a small crosstalk delta that by itself is negligible.
     However, when these delays are summed from clock source to destination
     the total delta can be more than large enough to cause a significant
     violation. 

     The PT "timing_remove_clock_reconvergence_pessimism" allows your timing
     contributions from common portions of the clock tree to be eliminated.
     This variable can usually be set to true, especially for min delay
     timing, when the launch and capture clocks are coincident. 

     When a timing violation is caused by many small crosstalk components
     (such as on a clock tree) then fixing the violation can be difficult.
     Even if the fix is successful, your design may be significantly
     perturbed.  So, for clock networks in particular, prevention is better
     than fixing.
 
  2. Non-Clock Networks.

     Double/triple spacing, shielding and the utilization of reserved metal
     layers work well for clocks and other high fanout nets, but these
     approaches can frequently be too costly for other types of structures,
     such as reset networks.  An alternative approach for these networks,
     (particularly asynchronous reset networks where crosstalk noise
     glitches can cause register contents to change) is to eliminate the
     use of low drive cells.  Our methodology uses higher drive strength
     cells in the reset network.  This raises the threshold for would-be
     aggressors and thereby reduces the vulnerability and number of
     victim nets.
 
  3. Floor Planning. 

     We spent more engineering time in floorplanning, specifically in the
     area of congestion reduction, because crosstalk occurs when aggressor
     and victim nets are in close proximity.  One benefit of this was that
     Astro had less SI violations to fix and was able to fix those
     more easily. 
 
     Our experience has been that while "standardized" power grids may
     require less engineering time to develop, the fact that they are over-
     designed reduces routing resources for the SoC.  This can lead to
     more SI problems later in the flow.  So, we established an approach of
     spending more time during floorplanning to create power grids that do
     not overly reduce routing resources.
 

Preventing Crosstalk Delay In Synthesis:

There are measures that can be taken during the physical synthesis of your
netlist and the generation of clock or reset trees.
 
  1. Setting the max_transition time DRC in Design Compiler to 1 nsec or
     less for 0.13 um designs.  The max_transition value can be reduced
     further for PhysOpt, say 750 psec, when net characteristics are better
     known.  Setting a max_transition value lower than the library default
     helps reduces the number of potential victims.
 
  2. Guardbanding for setup and hold times.  During non-SI aware synthesis,
     you can't predict how an individual timing path will be affected by
     crosstalk.  However, we do know that paths with less slack are easier
     to turn into violations, so we guard band non-SI setup and hold timing
     to reduce the number of crosstalk induced violations.  While guard
     banding like this can lead to an increase in gate count, the benefits
     were a reduced number of cross-talk induced timing violations.

  3. Clock tree synthesis for high fanout networks.  We try to use only high
     drive strength buffers, particularly for networks that are isolated;
     for example reset trees.  Larger drivers makes the receivers less
     susceptible to victimization and should also reduce the number of
     driver-receiver segments.  Fewer segments means less opportunity for
     SI effects and mean fewer contributions to a summed crosstalk delta.


Two Scripts For Verifying Prevention Measures:

Since prevention may not work as planned and something may go wrong in the
design process, it's good to be able to check the results of prevention
measures.  To check the results of our preventive methods, we developed
two PrimeTime-SI procedures that write the crosstalk contributions to
delay on the clock tree network to a file. 
 
In addition to the min/max rise and min/max fall contributions, our
procedures also write out the differences between min and max
contributions.  The output file can be sorted according the data in any
of the columns allowing problems to be easily identified.
 
These procedures, Check_Net_For_Xtalk and Check_Clock_Network_For_Xtalk,
are shown below. 

Note: One recently found limitation of these two scripts is that the clocks
should be defined on cell pins and not hierarchical boundaries.
 
A. CHECK_NET_FOR_XTALK - Reports Crosstalk Contribution On A Supplied Net

  # CHECK_NET_FOR_XTALK 
  # Colin MacDonald/Anis Jarrar, Freescale Semiconductor, July 2004
  # Summary: Reports Crosstalk Contribution On A Supplied Net to
  # a Supplied File Handle
  # This routine is called by check_clock_network_for_xtalk
  # Note: type check_net_for_xtalk  -help for information 
  # EXAMPLE USAGE:
  # set ofid  [open Report_Test.rpt "w" ]; # Open/create report File
  # set oiid  [open Info_Test.rpt "w" ];   # Open/create info File
  # check_net_for_xtalk  "[get_net DUT0/clkfast_core__L5_N0]" \
  # -Report_FID $ofid -Info_FID $oiid;     # First net supplied
  # check_net_for_xtalk  [get_net DUT0/clkfast_core__L4_N0] \
  # -Report_FID $ofid -Info_FID $oiid;     # Second net supplied
  # close $ofid;                           # Close output file
  # close $oiid;                           # Close information file


  proc check_net_for_xtalk { args } {
   parse_proc_arguments -args $args p_args
   if {[info exists p_args(-Report_FID)]} {
    set rep_fid $p_args(-Report_FID)
   }
   if {[info exists p_args(-Info_FID)]} {
    set inf_fid $p_args(-Info_FID)
   }
   if {[info exists p_args(one_net)]} {
    set i_net $p_args(one_net)
   }
   set process true
   set wir_nam [get_attribute $i_net full_name]
   set out_pnz [filter_collection [get_pins -of_objects $i_net ] \
    "direction == out" ]
   set siz_out [sizeof_collection $out_pnz ]
   if {$siz_out != 1 } {
    set process false
    puts $inf_fid \
    "INFO: Ignoring net $wir_nam drivers = $siz_out"
   }
   if { $process } {
    set out_nam [get_attribute $out_pnz full_name ]
    set inp_pnz [filter_collection [all_fanout -from \
     $out_nam -flat -pin_levels 1 ] "object_class == pin" ]
    set inp_pnz [remove_from_collection $inp_pnz $out_pnz ]
    set siz_inp [sizeof_collection $inp_pnz ]
    if {$siz_inp == 0 } {
     set process false
     puts $inf_fid "INFO: Ignoring net $wir_nam no receivers "
    }
    if { $process } {
     foreach_in_collection i_inp $inp_pnz {
      set inp_nam [get_attribute $i_inp full_name]
      set inp_lpn [get_attribute $i_inp lib_pin_name ]
      set tac [get_timing_arc -from $out_nam -to $inp_nam ]
      set siz_tac [sizeof_collection $tac]
      set dlt_mnf [get_attribute $tac annotated_delay_delta_min_fall]
      set dlt_mxf [get_attribute $tac annotated_delay_delta_max_rise]
      set dlt_mxr [get_attribute $tac annotated_delay_delta_max_rise]
      set dlt_mnr [get_attribute $tac annotated_delay_delta_min_rise]
      set dif_ris [expr abs ([expr $dlt_mxr - $dlt_mnr ])]
      set dif_fal [expr abs ([expr $dlt_mxf - $dlt_mnf ])]
      set dif_wst $dif_fal
      if { $dif_ris > $dif_fal } { set dif_wst $dif_ris }
      if {($dif_ris != 0) || ($dif_fal != 0) } {
       set xtalk_string  "XTALK: $wir_nam $out_nam $inp_nam"  
       puts $rep_fid [format "%s %1.7f %1.7f %1.7f %1.7f %1.7f" \
        $xtalk_string $dlt_mxr $dlt_mnr $dlt_mxf $dlt_mnf $dif_wst ]
      }
     }
    }
   }
  }

  define_proc_attributes check_net_for_xtalk -info "

  Description:

  Analyzes a supplied net for crosstalk contributions.  Finds a driver 
  pin connected to the net and all receivers of the driver pin. 
  Determines crosstalk contributions on all driver-receiver timing 
  arcs.  Outputs results to a writable file specified by report file 
  id argument (-Report_FID) and processing info to writable file 
  specified by info file id argument (-Info_FID).  Note that the report 
  file can be sorted by any column & the nets with largest crosstalk 
  problems can be easily identified.

  Report File Format:

  XTALK: net_name driver_pin receiver_pin                (cont..)
  (...cont) xtalk_max_rise xtalk_min_rise                (cont..)
  (...cont) xtalk_max_fall xtalk_min_fall                (cont..)
  (...cont){ bigger of |xtalk_max_rise - xtalk_min_rise| (cont..)
  (...cont) and |xtalk_max_fall - xtalk_min_fall| }

  Command Line Usage:

  check_net_for_xtalk -define_args { \
    {-Report_FID "Report File ID, file must be open and writable" \
        "rep_fid" string required} \
    {-Info_FID "Info File ID, file must be open and writable" \
       "inf_fid" string required} \
    {one_net "Net for xtalk analysis" "one_net" list required}}

  "


B. CHECK_CLOCK_NETWORK_FOR_XTALK - Reports Crosstalk on Clock Tree Network

  # PROCEDURE CHECK_CLOCK_NETWORK_FOR_XTALK
  # Colin MacDonald/Anis Jarrar, Freescale Semiconductor, July 2004
  # Summary: Reports Crosstalk on Clock Tree Networks
  # This routine opens a report file for results and a information
  # file for run time issues.
  # The script also creates a collection of nets that are supplied to
  # the procedure check_net_for_xtalk
  # Note: type  check_clock_network_for_xtalk -help for information 
  # EXAMPLE USAGE:
  # check_clock_network_for_xtalk -Version test -STA_Mode Functional \
  # -PVT_Case Best -Output_Dir .

  proc check_clock_network_for_xtalk { args } {
   parse_proc_arguments -args $args p_args
   set net_vrs "VRS_xxx"
   if {[info exists p_args(-Version)]} {
    set net_vrs $p_args(-Version)
   }
   set sta_mod "MOD_xxx"
   if {[info exists p_args(-STA_Mode)]} {
    set sta_mod $p_args(-STA_Mode)
   }
   set pvt_cse "PVT_xxx"
   if {[info exists p_args(-PVT_Case)]} {
    set pvt_cse $p_args(-PVT_Case)
   }
   set rep_dir "."
   if {[info exists p_args(-Output_Dir)]} {
    set rep_dir $p_args(-Output_Dir)
   }
   set ofidl [open \
    ${rep_dir}/clk_xtalk_${net_vrs}_${sta_mod}_${pvt_cse}.rpt w+]
   set oiidl [open \
    ${rep_dir}/clk_xtalk_${net_vrs}_${sta_mod}_${pvt_cse}.inf w+]
   set clk_trz [get_nets -of_object [ all_fanout -clock_tree -flat ]]
   set inc 0
   echo -n "INFO: Analyzing Clock Tree Network For XTALK Delta  "
   foreach_in_collection i_net $clk_trz {
    set inc [expr $inc + 1]
    check_net_for_xtalk  $i_net -Report_FID $ofidl -Info_FID $oiidl
    if { $inc == 25 }  { echo -n "\b\b||" }
    if { $inc == 50 }  { echo -n "\b\b//" }
    if { $inc == 75 }  { echo -n "\b\b--" }
    if { $inc == 100 } { echo -n "\b\b\\\\" ; set inc 0 ; }
   }
   echo "\b\b "
   close $ofidl
   close $oiidl
  }

  define_proc_attributes check_clock_network_for_xtalk -info "

  Description:

  Analyzes all clock networks for crosstalk contributions.
  Outputs results to report file and runtime information to info file.
  Command line optional args are used to name & place output files.
  Report File = \
  {Output_Dir}/clk_xtalk_{Version}_{STA_Mode}_{PVT_Case}.rpt 
  Info File = \
  {Output_Dir}/clk_xtalk_{Version}_{STA_Mode}_{PVT_Case}.inf 

  If an argument is not given, it's default value is used for the file.
  For example, if no arguments are supplied the report file will be
  ./clk_xtalk_VRS_xxx_MOD_xxx_PVT_xxx.rpt. 

  Report File Format:

  XTALK: net_name driver_pin receiver_pin                (cont..)
  (...cont) xtalk_max_rise xtalk_min_rise                (cont..)
  (...cont) xtalk_max_fall xtalk_min_fall                (cont..)
  (...cont){ bigger of |xtalk_max_rise - xtalk_min_rise| (cont..)
  (...cont) and |xtalk_max_fall - xtalk_min_fall| }

  Command Line Usage:

  check_clock_network_for_xtalk" \
   -define_args { \
   {-Version "Netlist version, default VRS_xxx " \
   "net_ver" string optional} \
   {-STA_Mode "STA timing mode e.g. FUNC or SCAN, default MOD_xxx" \
   "sta_mod" string optional} \
   {-PVT_Case \
   "Process, voltage, temeperature identified, default PVT_xxx" \
   "pvt_cse" string optional} \
   {-Output_Dir \
   "Writable directory for output files, default is current dir" \
   "rep_dir" string optional}}

   "


Repairing Crosstalk Delay:

Despite our best efforts at prevention, we will get crosstalk delay induced
violations and so we need to fix them.

  1. Crosstalk Repair Flow

     We iterate on a non-SI flow until there is suitably close to zero
     negative slack, and then perform STA using PrimeTime with SI enabled.
     If we have negative slack, we generate fixes.  In fact, we generate
     two types of fix files.  An Astro Scheme script, generated by
     create_astro_xtalk_constraints (for net repelling) and a write_script
     format file containing cell insertions and upsizes. 
 
     The Astro Scheme script output is used to either automatically
     generate net repels or, in the final stages of timing closure, to
     direct manual net movement.  The output from Astro is ultimately a
     new parasitic file that is used to check the effect of the fixes. 

     The write_script output includes design changes that we estimate would
     minimize crosstalk induced delays.  This includes cell upsize change
     (increased drive strength) determined from the max delay analysis and
     delay cell insertions determined from the min delay analysis.  The
     write_script file can either be read back into PrimeTime-SI to check
     the suggested fixes will eliminate the crosstalk induced delay or used
     by Design Compiler to generate a new fixed netlist.  The wire repel
     and netlist update loops are used as often as required to get zero
     negative slack.  A user defined variable in the PrimeTime-SI scripts
     is used to control the ratio of fixes generated by each method.

     While netlist changes are possible, we place more emphasis on netlist
     updates.  As our tolerance for netlist changes drops towards tape out,
     we place more emphasis on net repels.  Once netlist changes are
     prohibited we must exclusively rely on net repels.  In fact, for those
     of us who like to live on the edge, it's possible to start shipping
     lower mask layers, such as poly or active, while wire fixing is being
     carried out on the metal layers!

  2. PrimeTime-SI for Analysis

     To reduce the size of our crosstalk problem when running PrimeTime-SI,
     we execute PrimeTime in two steps.  The first step is with the SI
     option disabled, and our design is checked for all timing violations.
     Because SI is disabled, the computer processing time is quick (with SI
     enabled, static timing analysis, STA, is significantly slower).  After
     the chip or block close to 100% timing error free, we perform
     PrimeTime-SI timing analysis.
 
       - Performance Issues.   Enabling SI in PrimeTime can increase runtime
         and memory usage significantly.  Fortunately, we found effective
         steps to monitor and manage this.  First, we increase visibility
         of a session's memory footprint and CPU usage by inserting "mem"
         and "cpu" commands at strategic points throughout their scripts.
         Second, we obtain detailed progress on report generation and timing
         updates by setting variables timing_update_status_level and
         timing_report_status_level to high.  Memory footprints can grow by
         up to 2x, so large designs may require a 64-bit version of
         PrimeTime-SI.  Timing updates take much longer than with SI
         disabled and should be minimized at all costs.  Prior to release
         2002.09, two timing updates were required to make clock networks
         be reselected.  We minimize the impact of two updates by locating
         the first update before parasitic data are loaded or SI is enabled.
         Since run time is significantly longer, we identify key STA modes
         to concentrate on from an SI perspective.  When the number of
         violations seen in these primary modes is sufficiently reduced,
         we can run STA modes for final analysis and fixing.
 
       - Until recently PrimeTime-SI filter variables have been tricky to
         determine and, if set too high, can mask out SI effects.
         Thankfully, on 2004.06, the defaults have been set so that
         hopefully this should not be an issue.  PT-SI's configuration
         variables allow the designer to optimize the trade-off between
         accuracy and performance.  Three configuration variables are
         particularly important to accuracy and performance.  To avoid being
         too pessimistic, we set timing_remove_clock_reconvergence_pessimism
         to true.  Unfortunately, doing this adversely affects tool
         performance, so, if your preventative measures have more-or-less
         eliminated crosstalk on the clock tree network, one could set this
         to false and reap the benefits in terms of performance.  Secondly,
         we set si_xtalk_reset_critical_path to false (now the default) to
         improve accuracy.  Thirdly, we believe that the PT-SI variable
         si_xtalk_exit_on_max_iteration_count can be set as low as 2 to
         avoid increasing already long timing updates.  However, it may be
         useful, as negative slack is reduced, and the number of PrimeTime
         sessions required drops, to increase accuracy by increasing
         this variable.

  3.  Generating Fixes

      Crosstalk can be "fixed" by moving the victim net away from major
      aggressors, by increasing the drive strength of the victim net driver,
      by the insertion of a buffer in the victim net, or by reducing the
      strength of aggressor net drivers.  We utilize all but the last option
      as we felt that could adversely impact non-SI timing.  We
      automatically analyze all timing violations individually and fixes
      are generated based on characteristics of the failing path and the
      value of user defined variables. 

      Our max delay violations are fixed by cell upsizing or wire repelling.
      Min delay violations are fixed by cell insertions or wire repelling.
      Theoretically, wire repelling alone can fix all crosstalk induced
      violations but this approach can be more iterative than desirable,
      especially with timing paths through highly congested areas.
 
        - PrimeTime-SI Flow.  We use two nested loops to process a
          collection of violating paths.  The outer loop processes failing
          paths, the inner loop processes timing "points".  Points are the
          key to analyzing timing paths with respect to cross talk.  Points
          are a PrimeTime collection and an attribute of timing paths.  By
          querying points, we can determine crosstalk contributions
          "x_delta" at each section of a path.  Using points, we partition
          failing timing paths into driver net-receiver segments and
          determine the crosstalk on each segment.  Crosstalk depends on
          the signal transition which can also be discovered from reading
          properties from the timing path point.  If the crosstalk on the
          segment is found to be less than a user supplied variable
          (delta_min), the crosstalk contribution is deemed to be negligible
          and the next segment is processed.  If the crosstalk delta exceeds
          delta_min, then an upsize fix is determined for max delay
          violations.

          After analyzing each timing path, we compare the ratio of the
          total crosstalk contributions along the path divided by the abs
          (slack) against a second user-supplied variable (ratio_min) to
          determine the ease of obtaining a complete wire fix.  Paths with
          ratios exceeding ratio_min are considered to be good wire fix
          candidates and are added to a collection of paths for Astro
          fixing.  Paths with ratios below this threshold are fixed by cell
          upsizing (max delay) or buffer insertion (min delay).  Both
          upsizes and buffer insertions are not carried out in real time,
          but are written to a write_script file that Design Compiler can
          use to generate a new netlist or PrimeTime-SI can use to verify
          the fixes actually worked.  When all paths have been analyzed a
          complete collection of paths for fixing by Astro has been
          generated.  A Synopsys-provided script generates a wire repeal
          script the last stage in the process is to remove redundant lines
          from the scheme and write_script files.  Nets with crosstalk
          delays can generate multiple failing timing paths and therefore
          multiple entries in fix files. 


        - Cell Insertion.  We used Delay cell insertion to fix min delay
          violations.  But cell insertion must be applied with discretion,
          or the design changes will result in further design iterations.
          In order to reduce this risk, we chose delay cell for its
          relatively small size and large delay. 
 
          On failed timing paths, we found the total negative slack and
          divided by a guard-banded estimate of the delay cell's delay
          value.  We rounded up this result to find is the number of delay
          cells to be added at the path endpoint to remove the violation.
          Once the cell insertions are determined, they are then written
          to a write_script.  Design Compiler or PrimeTime then processes
          the write_script to generate a new netlist or check the timing
          associated with the fixes. 
 

        - Route Based Fixing.  Not all crosstalk induced timing violations
          are fixed on the first iteration of the Astro wire-repelling
          methodology, and we can frequently recover some but not all of
          the crosstalk deltas.  Sometimes the reduction is insufficient to
          fix a violation.  To improve the first time success rate of wire
          fixing, we use a variable (ratio_min) to determine which violating
          paths are to be included in a collection that will be fixed by net
          repelling.  This collection is passed to a customized version of
          Synopsys' create_astro_xtalk_constraints procedure (in 2004.06
          this is a built-in command).  This procedure is set for crosstalk
          delay (not noise), net_isolation, five worst nets and five worst
          aggressors.  The output from the procedure is a net-isolation
          constraints file that's read in by Astro.

 
        - Cell Upsizing.  We used upsized driver cells to fix max delay
          violations on victim nets.  One benefit of upsizing versus cell
          insertion is that upsizes aren't likely to disturb routing and
          keep the original parasitic file accurate.  Routing changes make
          the original parasitic file inaccurate, and can also propagate an
          entirely new set of timing violations.  By avoiding significant
          routing changes, we can use original parasitic file with
          confidence, and also feel confident of accuracy of the
          verification of the upsize fixes.  Upsizing the driving cell of
          a victim net increases the chances that this victim net could
          be a significant aggressor.  To fix victim nets without creating
          new violations, we tailor the degree of cell upsizing by
          selecting the new driver strength based on the size of the
          crosstalk delta. 
 
          The "get_alternative_lib_cells" command finds alternate driver
          cells and Tcl code is used to extract all valid strength values
          from the cell names.  These strengths are put into an array,
          sorted and a pointer set to the current drive strength.  The
          crosstalk delta found on the victim net is measured against
          four user supplied threshold values.  Depending upon which
          threshold is met, the driver strength is increased by one, two,
          three or four increments or to the maximum value, which ever is
          closer.  Cell upsizing is not always possible for a number of
          reasons; the target cell may already be at the maximum strength
          or the driving cell (such as ROM, RAM or pad) has a fixed driving
          strength.  So far, net repelling has been the sole option for
          fixing these cases, but it should be relatively straightforward
          and desirable to enhance the methodology to include an option for
          fixing these by buffer cell insertion.

          Here is the procedure that we used:

    # FIX_MAX_BY_UPSIZING 
    # Colin MacDonald/Anis Jarrar, Freescale Semiconductor, July 2004
    # Summary: Automatically Determines & Writes Cell Upsizes to a file
    # Example of Usage:
    # set ups_fid  [open Upsize_Test.rpt "w" ]
    # fix_max_by_upsizing -Upsize_FID $ups_fid -Target_Cell DUT0/RAM1h \
    # -Xtalk_Qnty 0.5 -Incr_by1 0.1 -Incr_by2 0.2 -Incr_by3 0.5 \
    # -Incr_by4 0.7 
    # close $ups_fid

    proc fix_max_by_upsizing { args } {
     parse_proc_arguments -args $args p_args
     if {[info exists p_args(-Upsize_FID)]} {
      set ups_fid $p_args(-Upsize_FID)
     }
     if {[info exists p_args(-Target_Cell)]} {
      set tgt_cel $p_args(-Target_Cell)
     }
     set pth_slk "---"
     if {[info exists p_args(-Path_Slack)]} {
      set pth_slk $p_args(-Path_Slack)
     }
     if {[info exists p_args(-Xtalk_Qnty)]} {
      set xtk_ctr $p_args(-Xtalk_Qnty)
     }
     if {[info exists p_args(-Incr_by1)]} {
      set inc_1vl $p_args(-Incr_by1)
     }
     if {[info exists p_args(-Incr_by2)]} {
      set inc_2vl $p_args(-Incr_by2)
     }
     if {[info exists p_args(-Incr_by3)]} {
      set inc_3vl $p_args(-Incr_by3)
     }
     if {[info exists p_args(-Incr_by4)]} {
      set inc_4vl $p_args(-Incr_by4)
     }
     set max_siz_unf false
     set tgt_nam [get_attribute [get_cells $tgt_cel ] ref_name]
     set tgt_lib_cel [get_lib_cells -of_objects [get_cells $tgt_cel]]
     set tgt_brk [string last _ $tgt_nam ]
     set tgt_bp1 [expr $tgt_brk + 1]
     set tgt_str [string range $tgt_nam $tgt_bp1 end]
     set tgt_beg [string range $tgt_nam 0 $tgt_brk ]
     if { $tgt_str == "1p5" } { set tgt_str 1.5 }
     set uns_str_lst [list $tgt_str]
     set tgt_lib \
      [get_attribute [get_libs -of_objects $tgt_lib_cel] full_name ]
     set alt_clz \
      [get_alternative_lib_cells $tgt_cel -libraries $tgt_lib ]
     set alt_clz [filter_collection $alt_clz "base_name =~ ${tgt_beg}* "]
     if { [sizeof_collection $alt_clz] > 0 } {
      foreach_in_collection ic $alt_clz {
       set bas_nam [get_attribute $ic base_name ]
       set cel_brk [string last _ $bas_nam ]
       set cel_beg [string range $bas_nam 0 $cel_brk ]
       if { $cel_beg == $tgt_beg } {
        set cel_bp1 [expr [string last _ $bas_nam ] + 1 ]
        set cel_str [string range $bas_nam $cel_bp1 end ]
        set cel_beg [string range $bas_nam 0 $cel_brk ]
        # Dont allow 1p5 cells, too little improvement
        if { $cel_str != "1p5" } {
         set uns_str_lst [lappend uns_str_lst $cel_str ]
        }
       }
      }
      set srt_str_lst [lsort -real -increasing $uns_str_lst ]
      set srt_str_len [llength $srt_str_lst ]
      set tgt_ndx [lsearch $srt_str_lst $tgt_str ]
      set ndx_dlt 0
      if { $xtk_ctr > $inc_1vl } { set ndx_dlt 1}
      if { $xtk_ctr > $inc_2vl } { set ndx_dlt 2}
      if { $xtk_ctr > $inc_3vl } { set ndx_dlt 3}
      if { $xtk_ctr > $inc_4vl } { set ndx_dlt 4}
      set new_tgt_ndx [expr $tgt_ndx + $ndx_dlt]
      if { $new_tgt_ndx >= $srt_str_len } {
       set new_tgt_ndx [expr $srt_str_len - 1 ]
      }
      if { ($new_tgt_ndx == $tgt_ndx) && ($xtk_ctr > $inc_1vl) } {
       set max_siz_unf true
      }
      set new_tgt_str [lindex $srt_str_lst $new_tgt_ndx ]
      if { $new_tgt_ndx != $tgt_ndx } {
       set tgt_string "${tgt_lib}/${tgt_beg}${new_tgt_str}"
       puts $ups_fid "size_cell $tgt_cel $tgt_string $pth_slk $xtk_ctr"
      }
     }
     return $max_siz_unf
    }

    define_proc_attributes fix_max_by_upsizing -info "

    Description:

    Generates a cell upsize for a driver depending on the xtalk delta 
    on the receiver and the user supplied thresholds for upsizing. Each 
    threshold needs to be exceeded for the upsizing to be attempted. 
    Outputs write_script format command to Upsize_FID. Extra info in 
    other columns can be filtered out. This procedure relies on all 
    library cells to be named in the format base_cell_strength e.g. 
    buf_2, buf_4 etc. This procedure returns a boolean max_siz_unf set 
    to true if the cell cannot be upsized. Cells cannot be upsized if 
    already at maximum strength or no stronger versions exist e.g. 
    RAMs, ROMs, pads 

    Report File Format:

    size_cell cell_instance cell_lib/upsized_cell path_slack xtalk_qnty
    Both path_slack and xtalk_qnty (cross-talk delta delay) are the values
    supplied as arguments. If optional argument -Path_Slack is not 
    provided, the default is used

    Command Line Usage:

    fix_max_by_upsizing " \
     -define_args { \
     {-Upsize_FID "File handle variable for file holding upszie fixes " \
     "ups_fid"  string optional} \
     {-Target_Cell "Full cell instantiation to be upsized" \
      "tgt_cel" string } \
     {-Path_Slack "Slack in path containing cell, for reporting only" \
      "pth_slk" string optional} \
     {-Xtalk_Qnty "Crosstalk delta contribution to net driven by cell" \
      "xtk_ctr" string } \
     {-Incr_by1 "Crosstalk delay required cause upsize by one" \
      "inc_1vl" string } \
     {-Incr_by2 "Crosstalk delay required to cause upsize by two" \
      "inc_2vl" string } \
     {-Incr_by3 "Crosstalk delay required to cause upsize by three" \
      "inc_3vl" string } \
     {-Incr_by4 "Crosstalk delay required to cause upsize by four" \
      "inc_4vl" string }}

    "                                            


4. Design Compiler Cell Fixes
 
In order to modify the netlist so that all our crosstalk design changes are
incorporated, Design Compiler needs to source the design changes and
regenerate a new updated netlist.  Since it is not currently possible for
PrimeTime to output a modified netlist, we use two step approach.  First,
netlist modifications generated by the PrimeTime crosstalk fixing procedures
are written to a file in write_script format.  Second, this file is sourced
by Design Compiler and a proprietary, encrypted procedure from Synopsys is
run to generate the updated netlist.  The procedure results in the creation
of new nets to support the buffer insertions.  These will not be annotated
until new parasitics are generated.
 
5.  Automated Astro Net Repels

Because Astro and PrimeTime sometimes differ on how nets are referenced,
Astro may not be able to find net references in the net isolation file.  To
avoid this problem, we use an alternative format for the net isolation file.
Our net isolation file indirectly references nets based on the nets' driving
pins.  If our alternate format is used, the getNetOnInstPin.scm file should
be sourced by Astro.
 
To perform the net repelling fixes automatically we loaded the net isolation
file into Astro, enabled timing-driven spacing is and performed search and
repair.  Depending on the size of the design this took a number of hours to
run.  Once complete, we extracted the new parasitic data and fed it back
into PrimeTime-SI for checking.  When victim nets were in congested areas,
we looked at the signal's environment and implemented customized fixes that
might be difficult to do automatically.
 
Astro's slick net editing capabilities -- such as the automatic building of
via stacks -- made cutting tracks and moving segments to other very easy
for use to do.  One issue we found is that the net isolation file does not
contain additional information such as the total crosstalk delta on the
victim net or amount of contribution from each aggressor.  With that
information, we could decide how many of the victim nets to move and which
of the aggressors to really avoid.

    - Colin MacDonald
      Freescale Semiconductor                    Austin, TX


 Sign up for the DeepChip newsletter.
Email
 Read what EDA tool users really think.


Feedback About Wiretaps ESNUGs SIGN UP! Downloads Trip Reports Advertise

"Relax. This is a discussion. Anything said here is just one engineer's opinion. Email in your dissenting letter and it'll be published, too."
This Web Site Is Modified Every 2-3 Days
Copyright 1991-2024 John Cooley.  All Rights Reserved.
| Contact John Cooley | Webmaster | Legal | Feedback Form |

   !!!     "It's not a BUG,
  /o o\  /  it's a FEATURE!"
 (  >  )
  \ - / 
  _] [_     (jcooley 1991)