[PERC] 学习笔记

//Usage:   
PERC LOAD <tvf_function_name> INIT <init_proc_name> SELECT <rule_proc_name>

//Example:
PERC LOAD esd INIT esd_init SELECT rule_1

加载名为esd的TVF函数块(会在后面定义);运行前先调用esd_init函数做初始化;选择rule_1作为本次执行的规则函数。

 

//Usage:
TVF FUNCTION <func_name> [/* <TCL_LANGUAGE_BODY> */]

//Example:
TVF FUNCTION esd [/*
package require CalibreLVS_PERC

proc esd_init {<params>} {<body>}
proc rule_1 {<params>} {<body>}
*/]

PERC使用TVF FUNCTION的形式内嵌Tcl code,其中/* */仅为视觉标记,在TVF FUNCTION内部以Tcl语法为准,注释使用#.

 

proc esd_init {} {
     perc::define_net_type "Power"   {vdd?}
     perc::define_net_type "Ground"  {gnd?}
     perc::define_net_type "Pad" {lvsTopPorts}

# Create net path through resistors less than 200 ohm.
     perc::create_net_path -type {R} -property "r < 200" 
}

perc::define_net_type定义Power网络类型,匹配名称满足vdd?的网络;?匹配单个字符,例如vdd,vdda,vdd1等等,之后可以在布尔表达式中引用Power.

Ground网络类型同Power; 定义Pad网络类型时,lvsTopPorts是Calibre关键字,代表LVS/PERC识别到的顶层端口,通常就是芯片的PAD/IO网络。

perc::create_net_path句中,-type {R} 限定路径中元素类型为R(电阻器);-property "r<200" 基于前面的PERC PROPERTY R r,将电阻属性r作为电阻值,筛选出r<200欧的电阻,用于构建可达路径。总的来说,这一句预定义了一类受限路径:只能通过满足r<200的电阻相连的网络。后续检查中,PERC会在判断“是否存在路径”时应用这个约束。

 

proc rule_1 {} {

# Identify all MOS devices in design, Check if the gate pin has path to input
# Pad net and Report the MOS devices without a proper ESD protection with
# suitable comment.
     perc::check_device -type {MN MP} -pinPathType { {g} {Pad && !Power && !Ground} } -comment "MOS gate connected to Pad with less than 200 ohm esd protection"

}

扫描所有的mos器件,检查gate pin是否能经由esd_init中定义的低阻路径(r<200)连接到PAD(且不是Power/Ground)。如果存在这种直达路径,则提示ESD可能保护不足。

perc::check_device语句:

-type {MN MP}:选择器件类型为MN / MP,分别代表NMOS和PMOS;

-pinPathType { {g} {Pad && !Power && !Ground} }:包含两部分,第一部分{g}是指定选择的pin,g为选择MOS的gate pin;第二部分是布尔表达式,目标网络需要属于Pad类型且不是Power或Ground;

-comment:对命中的器件输出该说明。

 

总结:对每个NMOS/PMOS的gate,引入受限路径搜索,如果能连到不是Power/Ground的Pad的网络,则输出警告。

 

2. RC Clamp Detection

LVS POWER NAME vdd?
LVS GROUND NAME vss?

在LVS层面识别电源网络,名称匹配vdd?,该识别结果可被lvsPower关键字引用;名称匹配vss?的识别结果可被lvsGround关键字引用。

 

perc::define_net_type "Power" {lvsPower}
perc::define_net_type "Ground" {lvsGround}
perc::define_net_type "Pad" {lvsTopPorts}

在esd_init中定义Power,Ground,Pad网络类型,对应LVS识别出的Power/Ground/Pad

 

proc rule_1 {} {
   perc::check_net -netType {Pad && Power && !Ground} -condition cond_1 -comment "ESD protection for Supply Pads."          
}
proc cond_1 {net} {
  set result [perc::exists -net $net -type {RcClamp} -instanceOnly]
  if {$result == 0} {
    # report violating nets without RCClamp
    perc::report_base_result -title "Missing RC Clamp"
    return 1
  }
  return 0
}

-condition cond_1:指定一个Tcl conditional callback process 用于对check_net命中的每一个supply pad做进一步判定。cond_1返回1说明违反规则fail,返回0说明pass

perc::exists -net $net -type {RcClamp} -instanceOnly:

-net $net:限制搜索区域在当前net的连接域中

-type {RcClamp}: 目标对象类型筛选为 名称/类型为RcClamp的instance或者device. -type跟的通常是cell的名字

 

4. Input Pin Connection: only MOS gates, diodes and diode-connected MOS are allowed.

proc esd_init {} {
  perc::define_net_type "I_Pad" {X Y Z}
  perc::define_net_type_by_device "SrcDrn" -type {MN MP} -pin {S D} -cell }

perc::define_net_type_by_device:基于device-pin的关系定义一个网络类型集合:名称为SrcDrn,从NMOS/PMOS管出发,取这些期间的S/D pin所连接的所有网络。-cell代表以cell级别归类?不确定。

后续在rule中的pinNetType过滤中可以引用该集合,表示“该MOS的Gate所在网络如果属于SrcDrn”之类的关系判断。

 

proc rule_1 {} {
  # identify input ports in design
  perc::check_net -netType {I_Pad} -condition cond_1 -comment "Input net connected to improper devices" }

proc cond_1 {net} {
  # check input pins are connected to MOS gates
  # 统计在该net上相连的MOS的gate pin的数量
  set MOS_gate_count [perc::count -net $net -type {MN NP} -pinAtNet {G}]

  # check input pins are connected to diodes or diode-connected MOS
  # 统计在该net上相连的D (diode) device数量
  set diode_count [perc::count -net $net -type {D}]
  # 统计源/漏连接在该net上,同时Gate连接到SrcDrn的MOS数量
  set MOS_count [perc::count -net $net -type {MN MP} -pintAtNet {S D} -pinNetType {{G} {SrcDrn}}]
  # 统计当前net上所有连接对象的数量
  set All_count [perc::count -net $net]
  # 统计不合法的连接数量(总连接数量-合法连接数量)
  set banned_count [expr { $All_count - $MOS_gate_count $diode_count - $MOS_count} ]
  if {$banned_count > 0} {
    perc::report_base_result -value "$banned_count banned devices"
    return 1
  }
  return 0
}

-pinAtNet {G} 表示只计算device 的G pin恰好连在该Net上的情况。

 

 5. ESD test case 05:pattern recognization

//pattern.sp
.subckt protect in vss a R0 in a 200 M0 a vss vss vss nch_esd .ends .subckt top X0 1 2 3 protect .ends

test case中提供的pattern.sp, 声明了名为protect的module, 端口为in, vss, a.

在后续的rule_1和cond_1中绑定了这里的端口名:

set patItr1 [perc::get_one_pattern -patternType "protect" -patternNode [list a $net] ]

-patternNode [list a $net] 指定pattern中的a节点和待检查的$net为同一个节点, 以此检查连接关系.

 

 

LVS RECOGNIZE GATES simple

启用简单门识别策略,使Calibre能够从电路拓扑中识别逻辑门(如lvsGate对象),供后续PERC调用。

 

LVS INJECT LOGIC no

关闭逻辑注入,某些流程会向拓扑注入抽象逻辑元件帮助识别,这里明确不使用。

 

proc rule_1 {} {
# Identify all input gates connected to I/O Pads.
     perc::check_net -netType {!Power && !Ground} -pathType {Pad} -condition cond_1 -comment "Pad with incorrect ESD protection"
}

找到“非电源非地”且和Pad类型的Net相连的Net,对命中的每条Net调用cond_1进行判断。

posted @ 2025-11-12 11:59  JENSEN_SHOE  阅读(434)  评论(0)    收藏  举报