[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进行判断。

浙公网安备 33010602011771号