集创赛(8)---optimus training

1、启动optimus

floorplan.tcl:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
###############################################################
# Innovus Floorplan Script for 55nm (ICS55 Process)
# Code Extracted from Images
###############################################################

# =============================================================
# 1. Stage Init: 备料环节
# =============================================================
# 读取物理库 (LEF)。这里加载了标准单元库和天线效应库
# 注意:这里的路径 ../../../Common/... 是比赛环境的相对路径,你需要根据你服务器的实际位置修改
read_lef { ../../../Common/ics55_LLSC_H9CR_0917/lef/N551P6M_fix_NDR.lef \
../../../Common/ics55_LLSC_H9CR_0917/lef/ics55_LLSC_H9CR_ant.lef }

# 读取前端综合出来的门级网表
read_verilog ../FromSYN/mapped.v

# 读取多模式多端角配置 (MMMC)。这里面定义了 TT/SS/FF 三个角的时序约束
read_mmmc_file ./mmmc_newsdc.tcl

# =============================================================
# 2. Stage Floorplan: 圈地环节
# =============================================================
# 下面这行被注释掉了,它是按利用率(utilization)自动算面积,比赛通常要求定死面积,所以用下面那行
# initialize_floorplan -site core9 -utilization 0.7 -core_to_die_offset { 3 3 3 3 }

# 强制划定芯片的物理边界 (Boundary) 和 IO 预留区 (Offset)
# -boundary {x1 y1 x2 y2}: 左下角(5.4, 5.4),右上角(94.6, 93.6)
# -core_to_die_offset: 上下左右留给 IO 环的宽度
initialize_floorplan -site core9 -boundary {5.4 5.4 94.6 93.6} -core_to_die_offset {5.4 5.4 5.4 6.4}

# 刷新界面,让你看到刚才画的框
gui_show

# =============================================================
# 3. IO Placement: 摆放引脚
# =============================================================
# 让工具自动把引脚(Pin)撒在芯片边缘
place_io_pins

# 加载自定义的 IO 约束脚本(通常用来微调引脚的顺序和具体坐标)
source ./update_io_pin.tcl

# =============================================================
# 4. Physical Only Cells: 加固防线
# =============================================================
# --- 添加 End Cap (边缘终结者) ---
# 保护 N 阱/P 阱边缘不破裂
set_options add_end_cap.bottom_edge ENDCAP2H9R
set_options add_end_cap.top_edge ENDCAP2H9R
set_options add_end_cap.left_edge ENDCAP2H9R
set_options add_end_cap.right_edge ENDCAP2H9R
add_end_cap -prefix end_cap_

# --- 添加 Well Tap (防闩锁避雷针) ---
# 每隔 20 微米插一根,防止 Latch-up 烧毁芯片
set_options add_well_tap.cell_interval 20
set_options add_well_tap.cell FILLTAP4H9R
add_well_tap -prefix well_tap_

# =============================================================
# 5. Power Plan: 通电联网
# =============================================================
# source route_pg.tcl <-- 这行被注释了
# 执行画电源网 (Power Grid) 的脚本,给 VDD/VSS 供电
source route_pg_vss_v1p2_v3p3.tcl

# =============================================================
# 6. Output Data: 存档
# =============================================================
# 导出当前的物理网表
write_verilog ./fp/fp.v.gz
# 导出 DEF (Design Exchange Format) 物理版图文件
write_def -wire_via ./fp/fp.def.gz
# 保存 Innovus 自己的数据库 (最重要!下次可以直接 restore_design 恢复现场)
write_db -force ./fp/fp_db

电源网络:

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
48
49
50
###############################################################
# 电源网络规划 (Power Plan) 脚本
###############################################################

# =============================================================
# 1. 认祖归宗:定义全局电源和地
# =============================================================
# 告诉工具,这颗芯片的 1.2V 电源网叫 V1P2,地网叫 VSS
set_power_net V1P2
set_ground_net VSS

# 逻辑映射:把标准单元内部的 VDD 引脚连到物理网 V1P2 上,VSS 连到 VSS 上
connect_pg_net -pins VDD -pg_net V1P2 -type pg_pin
connect_pg_net -pins VSS -pg_net VSS -type pg_pin

# =============================================================
# 2. 建一环路:打供电环 (Power Ring)
# =============================================================
# 就像城市的“一环路”,用粗金属把整个核心区包起来
set_options create_ring.layers {MET4 MET5} ;# 使用第4层和第5层金属
set_options create_ring.spacing 0.4 ;# 环与环的间距 0.4um
set_options create_ring.ring_type core_ring
set_options create_ring.width 0.4 ;# 金属线宽度 0.4um
set_options create_ring.offset 0.5 ;# 距离核心区的偏移量
create_ring -nets {V1P2 VSS} ;# 正式生成这一红一蓝两圈环线

# =============================================================
# 3. 建高架桥:打供电条纹 (Power Stripes)
# =============================================================
# 光有环不够,芯片中间的细胞会饿死,必须打贯穿内部的“高架桥”
set_options create_stripe.end_extend_to die_boundary

# -layer T4M2 (大概率是 PDK 里的顶层厚金属 Thick Metal 2)
# -width 10 (极宽!10um 的大马路,专门用来跑大电流)
# 给 V1P2 和 VSS 各自打一条贯穿芯片的巨型金属条,并自动生成过孔 (-generate_via true)
create_stripe -layer T4M2 -width 10 -start 89.395 -nets V1P2 -generate_via true -sets_number 1
create_stripe -layer T4M2 -width 10 -start 0.395 -nets VSS -generate_via true -sets_number 1

# =============================================================
# 4. 接通入户:特殊布线 (Special Route / SRoute)
# =============================================================
# 环和高架桥都建好了,现在要把每一户人家(标准单元)的电线接上去
set_options route_special.core_pin_target core_ring
route_special -nets {V1P2 VSS}

# =============================================================
# 5. 施工验收
# =============================================================
# 检查所有的电源过孔 (Via) 有没有打漏,防止有死角没通电
check_pg_vias

也可以双击引脚,点开查看具体的引脚属性

update_to_pins.tcl脚本

1
update_io_pin -pin a\[6\] -location {97.97 65.6} -layer MET3
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# ==========================================
# 阶段一:初始化与环境加载 (Stage Init)
# ==========================================
# 以下两行被注释掉了,原本是用来读取物理库(LEF)的。
# 军师坦诚:因为我们马上要直接读取完整的数据库(DB),里面已经包含了LEF,所以这里不需要重复读,免得工具报错冲突。
#read_lef ./lef/N551P6M_fix_NDR.lef
#read_lef ./lef/ics55_LLSC_H9CR_ant.lef

# 核心动作:读取Floorplan阶段保存的数据库
# (通俗解释:一键读档!恢复之前的设计状态、物理引擎和MMMC多角约束)
read_db fp_db


# ==========================================
# 阶段二:布局前置设置 (Stage Place - Options)
# ==========================================
# 设置最高布线层为金属4层 (MET4)。(被注释掉了,可能在Init阶段已经设过了)
#set_options route.top_routing_layer MET4

# 设置多线程数量为 8
# (通俗解释:火力全开!让服务器用8个核心并行计算,加速跑图)
set_options global.infra.max_thread_count 8

# 设置布局的努力级别为 high
# (通俗解释:告诉工具——给我往死里优化,尽量榨干时序和面积,别怕花时间)
set_options place.effort high


# ==========================================
# 阶段三:核心布局动作 (Placement Execution)
# ==========================================
# 1. 全局布局 (Global Placement):把标准单元撒进核心区,以线长最短为目标,允许单元互相重叠 (Overlap)。
place -global

# 2. 刷新图形界面:在GUI里更新画面,让你亲眼看到上面那步“乱撒豆子”的车祸现场。
gui_show

# 3. 合法化 (Legalization):收拾残局,把重叠的单元推开,强制它们像俄罗斯方块一样卡进标准的供电行 (Row) 里。
place -legalize

# 4. 早期试布线 (Early Route):虚空连线。真实的金属线还没长出来,先用快速算法预估一下走线,用来提前评估时序 (Timing) 达不达标。
early_route

# 5. 详细布局 (Detailed Placement):在合法化的基础上,做极其微小的位置调换(比如两个相邻的门换个位置),最后冲刺压榨一下时序和拥塞。
place -detail


# ==========================================
# 阶段四:体检与质量抽查 (Check & Report)
# ==========================================
# 检查布局合法性:强制工具自我审查,确认是不是真的没有重叠了,并且都乖乖待在网格上。有错这里会报红。
check_place

# 报告局部密度:生成拥塞地图 (Density Map),告诉你哪里挤成一锅粥了,预防后面真实的布线阶段发生“交通瘫痪”。
report_density

# 提取寄生参数 (RC Extraction):根据现在的摆放位置,精确计算出导线的电阻 (R) 和电容 (C)。
extract_rc

# 报告结果质量 (Quality of Results, QoR):极其关键!生成最终体检单,包含芯片面积、功耗以及决定你生死存亡的时序裕量 (Slack)。
report_qor


# ==========================================
# 阶段五:疯狂存档 (Data Export)
# ==========================================
# 导出当前状态下的逻辑网表 (门级Verilog代码),并压缩为.gz格式节省硬盘空间。
write_verilog ./place/place.v.gz

# 导出物理坐标文件 (DEF):里面记录了每个门电路具体放在了X/Y坐标系的哪个位置。"-wire_via"表示连同通孔和初步走线信息一起导出。
write_def -wire_via ./place/place.def.gz

# 导出工具专用的二进制数据库:也就是覆盖保存游戏存档。"-force" 表示不管同名文件存不存在,直接强制覆盖。下次打开软件就能从这里接着干。
write_db -force ./place_db
ESC 关闭 | 导航 | Enter 打开
输入关键词开始搜索