在 TSMC N5/N3 等先进工艺节点下,模拟版图设计面临着从“自由作画”到“严格约束”的范式转变。由于多重曝光(Multi-Patterning, SADP/SAQP)技术的引入,底层金属(如 M0-M3)的物理位置必须严格对齐预定义的 Track Grid

本文总结了如何在 Virtuoso 中正确配置 Track Pattern,并使用 SKILL 脚本进行强制性的 Off-Track (Off-Grid) 检查。

1. 为什么 Off-Track 是致命错误?

在 28nm 或 40nm 工艺中,Off-Grid 可能只是导致制造偏差或轻微的 DRC 违例。但在 N5 工艺中:

  1. 物理制造限制:金属线是通过侧墙(Spacer)工艺形成的,其位置是物理固定的。Off-Track 的金属在物理上无法制造。
  2. Coloring(着色)失效:EDA 工具(如 Virtuoso 或 Calibre)根据轨道索引(Track Index)决定金属的 Mask 颜色(Mask A/B)。Off-Track 的金属无法被分配颜色,导致 “Uncolored”“Grid Error”,这是最严重的 DRC 错误之一。

2. 检查工具:wspCheckActive

Virtuoso 提供了内置函数 wspCheckActive 用于此类检查。

常见误区:为什么明明有 Off-Track 却报 Clean?

很多工程师运行检查后返回 t (Clean),但肉眼可见有金属歪了。根本原因通常是:当前 CellView 中没有“激活”任何 Track Pattern

wspCheckActive 的逻辑是:“检查对象是否符合当前 CellView 的轨道定义”。如果 CellView 里压根没有轨道(Track Pattern),工具就认为“没有规则需要遵守”,从而全部放行。

正确的检查姿势(SKILL 脚本)

为了避免“假阴性”,我们必须:

  1. 先检查环境:确认 CellView 是否有轨道定义。
  2. 强制检查:忽略宽度和线型,只查物理位置。

建议将以下代码保存为 check_off_track.il 并加载到 CIW 中使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
procedure( CheckOffTrack( @optional (layerName "M2") )
    let( (cv trackList badShapes)
        cv = geGetEditCellView()
        
        ; ---------------------------------------------------------
        ; 步骤 1: 防御性检查 —— 确认“有轨可循”
        ; ---------------------------------------------------------
        ; 查询当前 CellView 是否有对应层的 Track Pattern
        trackList = setof(x cv~>trackPatterns x~>layerName == layerName)
        
        if( !trackList then
            printf("\n>>> [ERROR] %s 层在当前 CellView 中没有定义 Track Pattern!\n" layerName)
            printf(">>> wspCheckActive 无法工作。正在尝试自动加载标准轨道...\n")
            
            ; 自动补救:创建默认轨道 (参数需根据工艺调整:cv, layer, direction, start, numTracks, pitch, width)
            ; 例如:M2 可能是垂直走线,Pitch 0.1
            dbCreateTrackPattern(cv layerName "vertical" 0.0 4000 0.1 0.05)
            printf(">>> 已自动为您创建了 %s 层的临时轨道。\n" layerName)
        )

        ; ---------------------------------------------------------
        ; 步骤 2: 执行强制检查
        ; ?checkWidth nil    -> 忽略宽度错误,只查中心线是否偏离 (Off-Grid)
        ; ?checkWireType nil -> 忽略类型,查所有金属 (包括 drawing, pin, dummy)
        ; ---------------------------------------------------------
        printf(">>> 正在检查 %s 层的所有金属位置...\n" layerName)
        badShapes = wspCheckActive( 
            cv 
            layerName 
            ?checkWidth nil 
            ?checkWireType nil 
            ?returnVioShapes t 
            ?markers t
        )

        ; ---------------------------------------------------------
        ; 步骤 3: 报告结果
        ; ---------------------------------------------------------
        if( listp(badShapes) && badShapes then
            geSelectFigs(badShapes)
            printf("\n>>> [FAIL] 发现 %d 个 Off-Track 金属!已自动选中。\n" length(badShapes))
            printf(">>> 请按 Q 查看属性或手动修整。\n")
        else
            printf("\n>>> [PASS] %s 层检查通过!所有金属都在轨道上 (On-Grid)。\n" layerName)
        )
    )
)

使用方法: 在 CIW 窗口输入 CheckOffTrack("M2") 即可。

3. 如何实现全项目复用(自动加载轨道)?

如果在每个 Cell 里都手动点一遍 Assistants -> Track Pattern 太慢了,可以通过 Tech FileTrigger 实现自动化。

方案 A:Tech File (推荐)

在项目的 tech.tf 文件中定义 layerRules。重新编译 Tech File 后,所有新建或打开的 Cell 都会自动继承。

1
2
3
4
5
6
7
8
9
layerRules(
    trackPattern(
        ( layer      "M2" )
        ( direction  "vertical" )
        ( pitch      0.1 )
        ( width      0.05 )
        ( start      0.0 )
    )
)

方案 B:User Trigger (无 TF 权限时)

如果没有权限改 PDK,可以写一个触发器,在打开 Layout 时自动注入轨道。

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure( AutoAddTracks(args)
    let( (cv)
        cv = args->view
        when(cv && cv->mode=="a" ; 仅针对编辑模式
            ; 这里调用你的创建轨道逻辑,例如 CheckOffTrack 里的补救代码
            printf("Auto-loading track patterns for %s...\n" cv->cellName)
             dbCreateTrackPattern(cv "M2" "vertical" 0.0 4000 0.1 0.05)
        )
    )
)

; 注册 OpenAccess 打开触发器
deRegUserTriggers("layout" nil nil 'AutoAddTracks)

4. 总结

在 N5/N3 工艺下,“On-Track” 是物理制造的前提。请务必:

  1. 确保环境中定义了正确的 Track Pattern (通过 TF 或 Script)。
  2. 使用 wspCheckActive 的强制模式 (?checkWidth nil) 定期检查。
  3. 养成在 Grid 上画图的习惯,依靠 Editor 的 Snapping 功能。

5. 参考资料 (References)

  1. Virtuoso Multi-Patterning Technology User Guide: “Interactive Coloring: Track-Based Coloring”
  2. Virtuoso Layout Suite SKILL Reference: “wspCheckActive”
  3. Advanced Node Design Guide: “Color Aware Design and Width Spacing Patterns RAK”
  4. Virtuoso Technology Data ASCII Files Reference: “Technology File Layer Attributes: trackPattern”
  5. Simon IC Layout Design Services