add_clocks 0 clk1 clk2 reset 
     
 
     
      add_scan_groups grp1 scan1.testproc 
     
 
     
      add_scan_chains c0 grp1 scan_in1 scan_out1 
     
 
     
      add_input_constraints D -c0 
     
 
     
      set_gate_report drc_pattern state_stability 
     
 
     
      set_system_mode analysis 
     
 
     
      report_gates A B C D E
     
 
      
     此操作的结果是:
 
     •在test_setup中显式强制引脚A到E。
 
     •引脚A、B、C和E强制加载卸载。
 
     •引脚D受到约束(但在load_unload中不强制),是捕获期间唯一具有显式值的引脚。
 
     ff00中说明了一个典型的初始化问题。图B-2显示了test_setup过程中似乎初始化此触发器的相关电路和语句。
 
     
 
     在这种情况下,您可能希望在初始化后输出始终为1,因为test_setup过程的第三个周期强制输入a和脉冲clk1为1。为了进行比较,以下是报告的state_stability数据以及为load_unload和shift报告的数据。特别注意Q输出: 
 
      
 
      从状态稳定性显示中可以看到,在test_setup之后,Q的输出设置为1。在load_unload的第一个应用程序中,它仍然是1,但在第一个shift中它变为X。将其与显示的“drc_pattern load_unload”和“drc_pattern shift”进行比较。
 
     通过对ff00执行类似于ff10的操作,可以更好地实现稳定的初始化值,其中D输入连接到受约束的D引脚:
 
     
 
      另一个有趣的观察结果是ff32。该触发器位于4位移位寄存器的末尾,在测试设置期间,所有触发器都被重置,如图B-3所示。
 
     
 
      注意,在这种情况下,对于load_unload和shift的第一个应用程序,Q是稳定的,但是在最后一次shift(~之后)之后的稳定状态是X。(将此输出与示例9-将稳定性检查设置为Off和All_shift进行比较。)
 
     
 
      非扫描触发器ff20由不是移位时钟的clk2计时。如图B-4所示,该触发器也在test_setup期间初始化。
 
     
 
      Q输出在捕获过程中受到干扰,而不是在移位过程中,因为移位过程中未执行此元素:
 
     
 
      请注意,ff32和ff20的load_unload和shift数据几乎相同(除了时钟数据),但state_stability数据使您可以看到它们以非常不同的方式变得不稳定。
 
     
      Example 2 — Multiple Cycles in Load_unload Prior 
      to Shift 
     
 
     
      本示例与基本示例之间的主要区别在于,在load_unload过程中,applyshift语句之前有多个循环(本示例中的新语句以粗体突出显示)。
     
 
     
      procedure load_unload = 
     
 
      
      
       scan_group grp1 ; 
      
 
      
       timeplate gen_tp1 ; 
      
 
      
       // First cycle, one PI event (force) 
      
 
      
       cycle = 
      
 
      
       force clk1 0 ; 
      
 
      
       force clk2 0 ; 
      
 
      
       force reset 0 ; 
      
 
      
       force scan_en 1 ; 
      
 
      
       force B 1; 
      
 
      
       force C 1; 
      
 
      
       force E 1; 
      
 
      
       end ; 
      
 
      
       // Second cycle, three PI events 
      
 
      
       (force, pulse on, pulse off) 
      
 
      
       cycle = 
      
 
      
       force E 0; 
      
 
      
       pulse clk2; 
      
 
      
       end ; 
      
 
      
       // Third cycle, two PI events 
      
 
      
       (pulse on, pulse off) 
      
 
      
       cycle = 
      
 
      
       pulse clk2; 
      
 
      
       end ; 
      
 
      
       apply shift 3; 
      
 
      
       end; 
      
 
      
       作为结果,在第二组状态稳定性数据中显示多个事件。注意现在有三个循环。以下gate报告摘录显示了六位数据,与事件总数相对应。第一个比特来自第一个周期(一个事件),接下来的三个比特来自第二个周期(三个事件)。最后两个比特来自具有两个事件的第三个周期。
      
 
       
       
        // /E primary_input 
       
 
       
        // (ts)( ld )(shift)(cap)(stbl) 
       
 
       
        // E O ( 0)(
        100000
        )(000~0)(XXX)( X) 
       
 
       
        // /A primary_input 
       
 
       
        // (ts)( ld )(shift)(cap)(stbl) 
       
 
       
        // A O ( 1)(
        XXXXXX
        )(XXX~X)(XXX)( X) 
       
 
       
        // /clk2 primary_input 
       
 
       
        // (ts)( ld )(shift)(cap)(stbl) 
       
 
       
        // clk2 O ( 0)(
        001010
        )(000~0)(0X0)( 0) 
       
 
       
        // /ff20 dff 
       
 
       
        // (ts)( ld )(shift)(cap)(stbl) 
       
 
       
        // CLK I ( 0)(
        001010
        )(000~0)(0X0)( 0) 
       
 
       
        // D I ( 1)(
        XXXXXX
        )(XXX~X)(XXX)( X) 
       
 
       
        // Q O ( 0)(
        00XXXX
        )(XXX~X)(XXX)( X) 
       
 
       
        // QB O ( 1)(
        11XXXX
        )(XXX~X)(XXX)( X) 
       
 
       
        请注意,对于load_unload模拟,A是如何转到X的。这是因为它没有在load_unload过程中显式强制(或使用add_input_constrats命令约束)。
       
 
        
        
         Example 3 — Drc_pattern Reporting for Pulse 
         Generators 
        
 
        
         如果电路包含具有用户定义定时的脉冲发生器(PG),该工具将对PG的输出变化执行额外的模拟步骤。当上升沿事件发生在其输入端时,PG在一定延迟后输出1,工具将其模拟为附加事件。 
         在另一个延迟之后,PG的输出信号返回到0,这也被模拟为一个单独的事件。两个输出事件都添加到输入事件后面的一对括号([])内的报告中。假设前面示例的非扫描触发器ff20由PG计时,如图B-5所示。下图摘录显示了PG事件如何出现在gate报告中。
 
         
 
         
          // /clk2 primary_input 
         
 
         
          // (ts)( ld )(shift)( cap )(stbl) 
         
 
         
          // clk2 O ( 0)(00
          1
          [11]0
          1
          [11]0)(000~0)(0X[X]0)( 0) /pg1/clk 
         
 
          
         
          // /pg1 pulse_gen 
         
 
         
          // (ts)( ld )(shift)( cap )(stbl) 
         
 
         
          // clk I ( 0)(00
          1
          [11]0
          1
          [11]0)(000~0)(0X[X]0)( 0) /clk2 
         
 
         
          // out O ( 0)(000[
          10
          ]00[
          10
          ]0)(000~0)(00[X]0)( 0) /ff20/CLK 
         
 
          
         
          // /ff20 dff 
         
 
         
          // (ts)( ld )(shift)( cap )(stbl) 
         
 
         
          // CLK I ( 0)(000[10]00[10]0)(000~0)(00[X]0)( 0) /pg1/out 
         
 
         
          // D I ( 1)(XXX[XX]XX[XX]X)(XXX~X)(XX[X]X)( X) /A 
         
 
         
          // Q O ( 0)(000[XX]XX[XX]X)(XXX~X)(XX[X]X)( X) 
         
 
         
          // QB O ( 1)(111[XX]XX[XX]X)(XXX~X)(XX[X]X)( X) 
         
 
         
          clk2上的上升沿事件启动pg1的两个输出脉冲(以粗体突出显示)。请注意,脉冲不会与引起它们的输入变化同时显示。这是与输入变化同时出现的输出变化的典型显示的例外,如ff20所示。还请注意,ff20的CLK输入处的活动时钟边沿比clk2的活动边沿晚一个事件,并且由于括号的原因,被视为PG信号。
         
 
          
          
           Example 4 — Single Post Shift 
          
 
          
           此示例在load_unload过程中有多个循环。新增的是single post shift
          
 
           
           
            procedure load_unload = 
           
 
           
            scan_group grp1 ; 
           
 
           
            timeplate gen_tp1 ; 
           
 
           
            // First cycle, one PI event (force) 
           
 
           
            cycle = 
           
 
           
            force clk1 0 ; 
           
 
           
            force clk2 0 ; 
           
 
           
            force reset 0 ; 
           
 
           
            force scan_en 1 ; 
           
 
           
            force B 1; 
           
 
           
            force C 1; 
           
 
           
            end ; 
           
 
           
            // Second cycle, three PI events (force, pulse on, pulse off) 
           
 
           
            cycle = 
           
 
           
            force E 0; 
           
 
           
            pulse clk2; 
           
 
           
            end; 
           
 
           
            apply shift 2; 
           
 
           
            apply shift 1; 
           
 
           
            end; 
           
 
           
            在这种情况下,状态稳定性数据在主移位和捕获周期之间有一个附加组(以粗体显示)。这对应于后移的第一次应用:
           
 
            
            
             // /ff32 dffr 
            
 
            
             // (ts)( ld )(shift)
             (shift)
             (cap)(stbl) 
            
 
            
             // R I ( 0)(0000)(000~0)
             ( 000)
             (0X0)( 0) /reset 
            
 
            
             // CLK I ( 0)(0000)(010~0)
             (010 )
             (0X0)( 0) /clk1 
            
 
            
             // D I ( 0)(0000)(000~X)
             ( XXX)
             (XXX)( X) /ff31b/Q 
            
 
            
             // Q O ( 0)(0000)(000~X)
             ( XXX)
             (XXX)( X) 
            
 
            
             // QB O ( 1)(1111)(111~X)
             ( XXX)
             (XXX)( X) 
            
 
            
             你可以看到ff32在第一次应用shift时非常稳定。如果在这种情况下使用set_stability_check All_shift命令,则输出略有不同:
            
 
             
             
              set_stability_check all_shift 
             
 
             
              set_system_mode setup 
             
 
             
              set_system_mode analysis 
             
 
             
              report_gates ff32
             
 
              
              
               // /ff32 dffr 
              
 
              
               // (ts)( ld )(shift)
               (shift)
               (cap)(stbl) 
              
 
              
               // R I ( 0)(0000)(000~0)
               ( 000)
               (0X0)( 0) /reset 
              
 
              
               // CLK I ( 0)(0000)(010~0)
               (010 )
               (0X0)( 0) /clk1 
              
 
              
               // D I ( 0)(0000)(000~1)
               ( 1XX)
               (XXX)( X) /ff31b/Q 
              
 
              
               // Q O ( 0)(0000)(000~0)
               ( 011)
               (1XX)( X) 
              
 
              
               // QB O ( 1)(1111)(111~1)
               ( 100)
               (0XX)( X) 
              
 
              
               请注意,ff32在整个主移位应用程序中现在是0,但在后移位期间设置为1。这是由于在test_setup中将A设置为1,并且该脉冲计时通过。