理论
1.design_setup
2.floorplan
实践
一定记得切换回英文输入法
该脚本完成物理设计初始化阶段的核心工作:
- 建立工艺相关的设计库容器
- 加载综合后设计数据(DDC格式更完整,含物理信息)
- 解决模块实例化冲突
- 生成可迭代的基线版本(
init_0
)
source ../scripts/rm_setup/icc_setup.tcl
create_mw_lib \
-tech $TECH_FILE \
-bus_naming_style {[%d]} \
-mw_reference_library $MW_REFERENCE_LIB_DIRS \
$MW_DESIGN_LIBRARY
open_mw_lib $MW_DESIGN_LIBRARY
#read_verilog -top $DESIGN_NAME $ICC_IN_VERILOG_NETLIST_FILE
import_designs $ICC_IN_DDC_FILE -format ddc -top $DESIGN_NAME -cel $DESIGN_NAME
current_design $DESIGN_NAME
uniquify_fp_mw_cel
link
save_mw_cel -as init_0
icc.set_up文件
set DESIGN_NAME "oc8051_top"
set ICC_IN_VERILOG_NETLIST_FILE ""
set ICC_IN_DDC_FILE "../input_data/oc8051_top.mapped.scan.ddc"
set ICC_IN_SDC_FILE "../input_data/oc8051_func.sdc"
sh mkdir -p ../mw
sh mkdir -p ../rpts
sh mkdir -p ../input_data
sh mkdir -p ../output_data
#############################################################################
#standard cell library
## logical library
set stdcel_libs "
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth_cg.db
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth_cg_hvt.db
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth_cg_lvt.db
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth.db
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth_hvt.db
/disk2/course/library/stdcel/db/ss1p08v125c/saed90nm_max_hth_lvt.db
"
# memory
set memory_libs "
/disk2/course/library/mem/db/ss1p08v125c/SRAM8x1024_1rw_max_hth.db
/disk2/course/library/mem/db/ss1p08v125c/SRAM8x128_max_hth.db
"
set target_library "$stdcel_libs"
set link_library "* $target_library $memory_libs"
## physical library
set stdcel_mws "
/disk2/course/library/stdcel/milkyway/saed90nm_dv
/disk2/course/library/stdcel/milkyway/saed90nm_lvt_dv
/disk2/course/library/stdcel/milkyway/saed90nm_hvt_dv
"
set memory_mws "
/disk2/course/library/mem/milkyway/saed_sram_dv
"
set MW_REFERENCE_LIB_DIRS "$stdcel_mws $memory_mws"
#############################################################################
set MW_DESIGN_LIBRARY "../mw/${DESIGN_NAME}_LIB"
set TECH_FILE "/disk2/course/library/tech/icc/saed90nm_icc_1p9m.tf"
set TLUPLUS_MAP "/disk2/course/library/tech/icc/tluplus/tech2itf.map"
set TLUPLUS_CMAX "/disk2/course/library/tech/star_rc/saed32nm_1p9m_Cmax.tluplus"
set TLUPLUS_CMIN "/disk2/course/library/tech/star_rc/saed32nm_1p9m_Cmin.tluplus"
set enable_page_mode false
###############################
## Cellname variables
###############################
set ICC_FLOORPLAN_CEL "init_design_icc"
set ICC_PLACE_OPT_CEL "place_opt_icc"
set ICC_CLOCK_OPT_CTS_CEL "clock_opt_cts_icc"
set ICC_CLOCK_OPT_PSYN_CEL "clock_opt_psyn_icc"
set ICC_CLOCK_OPT_ROUTE_CEL "clock_opt_route_icc"
set ICC_ROUTE_CEL "route_icc"
set ICC_ROUTE_OPT_CEL "route_opt_icc"
set ICC_CHIP_FINISH_CEL "chip_finish_icc"
set ICC_SIGNOFF_OPT_CEL "signoff_opt_icc"
set ICC_METAL_FILL_CEL "metal_fill_icc"
## Avoiding too many messages
set_message_info -id PSYN-040 -limit 10 ;# Dont_touch for fixed cells
set_message_info -id PSYN-087 -limit 10 ;# Port inherits its location from pad pin
set_message_info -id LINT-8 -limit 10 ;# input port is unloaded
set_app_var check_error_list "$check_error_list LINK-5 PSYN-375"
suppress_message PSYN-025
界面操作
此时两个窗口会打开,一个叫做Main Window,一个叫做Layout Window, Layout Window主要显示的版图的信息。Main Window可以显示电路图和逻辑层次。两个窗口显示的是导入工具内存中的同一的design,比如你可以在两个任意窗口里敲命令都是可以的。
打开Layout Window,最大化窗口,你可以按小写的 f 键盘,将版图显示最合适的位置。
Layout Window
此时你会看见一个叫做route_opt_icc的已经绕线完毕的版图。这是倒L形的block-level design。这个视图下,你可以看见电源网络(横纵交替的VDD/VSS的电源线)以及RAM宏单元(IP)。标准单元你可能需要放大去看,任务二会教你怎么放大缩小。
注意:Layout Window和Main Window有些菜单会相同,有些菜单Main Window有,而Layout Window没有,有些菜单Layout Window有,而Main Window没有。个人觉得有点鸡肋...
任务二:浏览版图视图
1.现在你可以花几分钟的时间熟悉下版图窗口下的zoom(放大和缩小)pan(拖动)的按钮,当你尝试滑动鼠标滚轮放大和缩小时候,你可以观察左上角的Overview(类似游戏里的小地图)窗口里的黄色矩形也会跟着放大和缩小,你还可以点击pan按钮后,拖动这个黄色矩形,你就会发现黄色矩形对应的版图区域就会显示出来。
提示:当把鼠标的指针悬浮放在菜单栏的按钮上停止一段时间后,工具会弹出该按钮的功能简介。退出zoom或pan模式,并且选择Selection Tool(下图白色的箭头图标)或者按“Esc”按键,这时,工具会返回选择模式。
选择、放大、缩小、拖动的示例
2.当Layout Window(版图窗口)开启的时,你可以使用快捷键。例如:用小写的“f”键,或者“Ctrl + f”组合键将版图调节至全屏模式;再如:用“+”键将版图以2倍放大。
3.你可以通过两种方法获取快捷键的信息:1将鼠标指针放在菜单栏某个按钮上一段时间不动,工具会自动冒出来这个按钮的功能简介和快捷键。2你可以选择下拉菜单:Help→Report Hotkey Bindings,此时一个新的窗口会打开,这个窗口列出了快捷键的相关信息,关闭这个窗口的方法:Window→Close View或者用“Ctrl + w”组合键。
提示:快捷键可以在GUI界面开启时,通过以下命令定义:
icc_shell> gui_set_hotkey
4.有些人更习惯用“鼠标手势”进行拖动或者放大缩小,而不用快捷键或者菜单栏上的按钮,你可以使用一下命令使用“鼠标手势”:
现在你按住鼠标的滚轮键几秒,会弹出下面的鼠标手势菜单,根据手势菜单的方向移动鼠标并松开鼠标滑轮按键后,版图就会移动对应的位置。
鼠标手势
5.其实你可以通过键盘上的“↑、↓、←、→”键来拖动版图的显示。
任务三:控制目标和图层显示
View Settings面板里的Objects标签
你可以通过View Settings面板控制哪些目标可以visible(可见)或者selectable(选择),在接下来的步骤中,为了让你能清楚了解View Settings面板开关的含义,首先点击齿轮的图标(Show Options)按钮下拉菜单打开Auto apply这个开关,这样,不用再点击旁边的apply按钮,只要你改变了View Settings面板某个设置后,工具就能立即应用该设置。
1.假如在Vis栏(Visible),只勾选Object Type下的Cell显示。最快做法是右键点击Vis,然后在弹出的菜单栏里点击Hide All,然后勾选Cell对应的Vis开关。此时,你可以在版图里显示所有的标准单元和硬宏单元。
2.同样,现在打开Pin可见开关,此时input、output、power、ground的pin就会被显示。
3.打开Labels,单元的名字此时可见,接下来,按“Z”键,或者滑动鼠标滚轮,放大任何一个标准单元,点击Labels左边的“+”图标,再勾选扩展出的Pin的Vis开关,此时标准单元的pin的名字就会显示出来。
4.在选择模式中(按“Esc”键),按住鼠标的左键在有标准单元的地方随便画一个框,框中标准单元及标准单元的pin会高亮。取消选择的方法可以在版图任意空的地方单击鼠标左键。
5.设置pin不可被选择:找到Pin那一行,取消勾选对应的Sel栏,重复第4步,你会发现标准单元的pin没有被选择。
6.勾选Route的Vis开关,此时所有的绕线会显示,扩展Route左边的“+”按钮,然后继续扩展Net Type,取消勾选Power和Ground的Vis开关,此时版图的信号线和时钟线会被显示。
7.保存view setting,点击View Settings面板右下角的部分,点击Create preset…按钮,在弹出的窗口的“Select or type a preset name”中输入MyPreset,并点击OK,ICC会在~/.synopsys_icc_presets/Layout的路径创建一个名字叫做“MyPreset.tcl”的文件。这样,所有的设置都会在ICC启动的时候会自动导入。
8.点击View Settings面板左下角的Preset的框,选择下拉菜单里的“Default”此时工具的view settings就会恢复默认设置,此时你会再次看到电源地的绕线。较上层的金属M7和M8构成了横、纵的电源网络。
9.选择中间的“Layers”的标签,这个可以细节地调整绕线的层次结构
10.将版图放大至版图的中间的你可以看到绕线的位置,本次设计一共使用8层绕线金属,在下面的步骤开始前,请点击图中的“Hide”按钮,然后将右上角的“Level”的值设置1或者1以上。
11.依次打开NWELL到M8的开关,每次打开一个图层,观察版图绕线情况,你可以注意到:信号线M1~M6绕线是按照想要的方向进行,即:M1、M3和M5是水平的,M2、M4和M6是竖直的。
12.单独的目标,例如(Shape、Via、Terminal、Pin…等),可以点击对应图层的方块,这样开启或关闭这些单独的目标。
任务四:查询和选择目标
1.鼠标的指针必须是箭头的形状你才可以查询和选择目标,如果你的鼠标指针不是选择模式,点击菜单栏中的白色箭头的按钮或者按“Esc”键就可以进入选择模式。
2.将鼠标的箭头悬浮于版图的某个目标,注意不要单击,这个目标会被一个白色的虚线高亮,此时在左下角位置还会弹出一个信息提示的窗口,该窗口显示了被选择虚线高亮目标的关键信息。
3.现在鼠标左击并任意选择一个目标(例如一个标准单元),此时被选择的目标变成了白色的实线高亮框,如果你不选择该目标或者换一个目标,这个白色实线高亮框就会消失或者换成你选择的新目标,现在保持这个目标被选择的状态。
4.当一个目标被选择的状态时,你现在将鼠标的箭头悬浮另一个不同的目标,左下角位置仍会弹出一个信息提示的窗口,该窗口显示了虚线框目标的信息,即:悬浮另一个目标的信息,而不是步骤3鼠标选择的实线框的目标信息。
5.你可以按“q”键来获取完整的被选择的目标信息,或可以从菜单栏里依次点击:Select→Query Selection。那么有关这个被选择目标的详细信息的窗口将在Layout Window的最右侧显示。你可以点击右上角的“-”关闭该窗口。
6.你可以点击版图的空白处,或通过快捷键“Ctrl+d”组合键,或通过使用菜单栏依次点击:Select→Clear可以取消选择所有的目标。
7.可以通过按住鼠标左键并且拖动一个任意的方形区域,这个区域的目标会被选择并且高亮。
8.保持步骤7选择的目标,再添加额外的选择目标的方法:按住“Ctrl”键同时鼠标左键单击这个额外的目标。
9.在View Settings的面板里,进入Object的标签,并且关闭Route可见。
10.有时候被高亮的目标可能不容易观察,可以通过更改View Settings面板的左上角“太阳”的符号,将这个值设置50%,此时高亮的目标就容易识别出来,觉得这个功能还是蛮实用的。
11.从MainWindow或者LayoutWindow的菜单栏,选择File→Close Design把当前的设计关闭,如果“Close Design”的对话框弹出,此时单击Discard All,不保存而关闭当前的设计。
12.你目前还处于GUI模式,关闭GUI模式但是保持icc继续运行的话,你可以输入“stop_gui”,此时MainWindow的窗口会关闭,但是IC Complier shell仍在UNIX的终端运行。
脚本
#remove_sdc
remove_scenario -all
source ../scripts/usr_tcl/mmmc.tcl
set cur_scenario [current_scenario]
foreach scenario [all_active_scenarios] {
current_scenario $scenario
set ports_clock_root {}
foreach_in_collection a_clock [get_clocks -quiet] {
set src_ports [filter_collection [get_attribute $a_clock sources] @object_class==port]
set ports_clock_root [add_to_collection $ports_clock_root $src_ports]
}
group_path -name REGOUT -to [all_outputs]
group_path -name REGIN -from [remove_from_collection [all_inputs] $ports_clock_root]
group_path -name FEEDTHROUGH -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_outputs]
};
current_scenario $cur_scenario
set cur_scenario [current_scenario]
foreach scenario [all_active_scenarios] {
current_scenario $scenario
remove_propagated_clock [all_fanout -clock_tree -flat]
remove_propagated_clock *
};
current_scenario $cur_scenario
save_mw_cel -as init
-
场景初始化
remove_scenario -all
清除所有现有场景约束
source ../scripts/usr_tcl/mmmc.tcl
加载预定义的MMMC约束文件(通常包含工艺库、电压温度条件等基础设置) -
路径分组优化(关键路径优先级控制)
- 遍历所有激活场景(
all_active_scenarios
) ports_clock_root
收集所有时钟源端口(用于区分时钟信号与数据信号)- 分组策略:
REGOUT
:所有输出寄存器路径REGIN
:非时钟输入到寄存器的路径FEEDTHROUGH
:纯组合逻辑路径(输入到输出的直接路径)
- 遍历所有激活场景(
-
时钟树重置
remove_propagated_clock
两步操作:
① 清除时钟树网络上的传播时钟属性
② 全局移除所有传播时钟定义- 目的:避免旧时钟树信息干扰后续CTS阶段
-
设计保存
save_mw_cel -as init
保存当前优化状态为初始节点
source ../scripts/rm_icc_scripts/common_optimization_settings_icc.tcl
source ../scripts/rm_icc_scripts/common_placement_settings_icc.tcl
common_optimization_settings_icc.tcl
set_host_options -max_cores 1
set_delay_calculation_options -arnoldi_effort high
## General Optimization
set_app_var timing_enable_multiple_clocks_per_reg true
set_app_var case_analysis_with_logic_constants true
set_fix_multiple_port_nets -all -buffer_constants
set_auto_disable_drc_nets -constant false
#set_app_var timing_use_enhanced_capacitance_modeling true ;#PT default - libraries with capacitance ranges (also see Solvnet 021686)
set_max_area 0
## Set Area Critical Range
set_app_var physopt_area_critical_range 0.1
set_app_var physopt_power_critical_range 0.1
## Set dont use cells
## Examples, big drivers (EM issues), very weak drivers, delay cells,
## clock cells
source ../scripts/usr_tcl/set_dont_use.tcl
#set_dont_touch_placement [all_macro_cells]
## To reset power options to default to override what is stored in Milkyway database
# set_power_options -default
#set_power_options -clock_gating true
#set_power_options -leakage true -dynamic true
#set_power_options -low_power_placement true
- 资源与计算设置
set_host_options -max_cores 1
:设置主机使用的最大核心数为1。set_delay_calculation_options -arnoldi_effort high
:将延迟计算时的Arnoldi算法的计算力度设置为高。
- 通用优化设置
- 多个应用变量的设置,如
timing_enable_multiple_clocks_per_reg
、case_analysis_with_logic_constants
等,用于开启特定的时序和逻辑分析功能。 set_fix_multiple_port_nets -all -buffer_constants
:修复多端口网络,对常量进行缓冲处理。set_auto_disable_drc_nets -constant false
:设置自动禁用设计规则检查(DRC)网络时,常量网络不禁用。set_max_area 0
:设置最大面积为0。
- 多个应用变量的设置,如
- 临界范围设置
set_app_var physopt_area_critical_range 0.1
和set_app_var physopt_power_critical_range 0.1
:分别设置物理优化时面积和功耗的临界范围为0.1。
- 禁用单元设置
source ../scripts/usr_tcl/set_dont_use.tcl
:执行外部Tcl脚本,设置禁用的单元。
common_placement_settings_icc.tcl
- 布线层设置
set_ignored_layers -max_routing_layer M6
:设置最大的忽略布线层为M6,意味着在后续的布线操作中,M6及以上的布线层可能会被忽略。set_ignored_layers -min_routing_layer M1
:设置最小的忽略布线层为M1,即M1及以下的布线层可能会被忽略。
- PNET选项设置
remove_pnet_options
:移除之前设置的所有PNET选项。set_pnet_options -partial {{M6 M4}} -see_object {{all_types}}
:设置PNET选项,部分使用M6和M4层,并且可以看到所有类型的对象。
- 拥塞选项设置(注释部分)
# set_congestion_options -max_util 0.85
:注释掉的代码,若取消注释,将设置最大拥塞利用率为0.85。
- 应用变量设置
set_app_var enable_recovery_removal_arcs true
:启用恢复移除弧功能。set_app_var placer_enable_enhanced_router true
:启用布局器的增强路由器功能。set_app_var placer_congestion_effort medium
:设置布局器的拥塞处理力度为中等。set_app_var placer_show_zroutegr_output true
:设置布局器显示Z路由器的输出信息。
set_ignored_layers -max_routing_layer M6
set_ignored_layers -min_routing_layer M1
## Set PNET Options to control cel placement around P/G straps
remove_pnet_options
set_pnet_options -partial {M6 M4} -see_object {all_types}
## it is recommended to use the default of the tool
## in case it needs to change ( e.g. for low utlization designs), use the command below :
# set_congestion_options -max_util 0.85
set_app_var enable_recovery_removal_arcs true
set_app_var placer_enable_enhanced_router true
set_app_var placer_congestion_effort medium
set_app_var placer_show_zroutegr_output true
创建floorplan
第一次采用手动创建 floorplam/creat_floorplan(目前未知问题输入框无法输入,但是复制粘贴可)
之后用floorplan write写成脚本
层次化显示
在mainwindow中选中,可在view中看到
由于memory特别多,建议先让工具摆放一遍。使用命令如下:
Set fp stragety -macros on edge on
这步主要指定摆放的方式为将memory摆放在boundary四周。默认情况下,工具会将
memory摆放在中间区域。
Create fp_placement
执行createfp_placement后,此时memory和standard cell均已摆放好。但是我们只关心
memory的位置,所以你可以将标准单元standard cell remove掉。需要特别注意的是工具摆
放memory时不会考虑poly orientation,所以需要特别留意这点。关于polyorientation的
相关注意事项,可以参考之前推送的文章。
有了初始的memory位置后,我们可以利用Icc中plan group来进行data flow分析,从而精
细化摆放memory。
如果宏单元较多,可以让工具先摆放一遍。
Icc_shell>set_fp_placement_strategy \
-auto_grouping high \ #将Macro进行分组
-macros_on_edge on \ #将宏单元置于尽可能接近芯片的边缘
-sliver_size 10 \ #设置macro之间的间隔为10
-virtual_IPO on #打开虚拟IPO以模仿时序优化(并防止不必要的布局优化)
Icc_shell>set_fp_macro_options -legal_orientation {W E} [get_cells I_ORCA_TOP/I_PCI \_TOP/I_PCI_WRITE_FIFO/PCI_FIFO_RAM_*] #限制某些RAM的合法布局方向
然后使用命令
Icc_shell>create_fp_placement –timing_driven -no_hierarchy_gravity 进行自动放置
–timing_driven表示时序驱动 -no_hierarchy_gravity表示“无层次结构”(即无逻辑地粗略放置,“逻辑层次结构”不会影响此非层次结构或平面布局的放置)
此时宏单元和标准单元均已摆放好。但是在floorplan阶段,我们只关心宏单元的位置,标准单元的摆放在后续的place阶段完成,所有可以通过命令将标准单元移除。
Icc_shell>remove_placement -object_type standard_cell
在摆放好所有的macro后,将所有的macro锁定(设置为dont_touch属性),因为在布局阶段的命令会使其移动。并且在检查拥塞(congestion)的时候软件会报错。
所以,使用命令将macro都fix住。Icc_shell>set_dont_touch_placement [all_macro_cells]
左侧点击宏单元,选中的宏单元上出现叉号,同时属性栏中is_fixed为true,表示已被锁定。(q可查看完整属性)
pin摆放
先生成约束,floorplan/write pin_pad...
生成文件后,修改约束属性
随后摆放pins,再添加手工的操作
place_fp_pins -block_level
然后生成保存pin的脚本,wirte floor plan
添加tapcell,endcap
set_keepout_margin -all_macros -outer {5 5 5 5}
## Also support for Well proximity effect (WPE) end cap cells
add_end_cap -respect_keepout -respect_blockage -lib_cell SHFILL3_HVT
add_tap_cell_array -pattern stagger_every_other_row \
-fill_boundary_row true \
-respect_keepout \
-master_cell_name SHFILL3_HVT \
-distance 110
derive_pg_connection -power_net VDD -ground_net VSS -create_ports top
derive_pg_connection -power_net VDD -power_pin VDD -cells [get_flat_cells *] -reconnect
derive_pg_connection -ground_net VSS -ground_pin VSS -cells [get_flat_cells *] -reconnect
save_mw_cel -as prepg
set_keepout_margin -all_macros -outer {{5 5 5 5}}
- 为所有宏单元(macros)设置外部禁止区域(keepout)的边界。
{5 5 5 5}
通常表示上、下、左、右四个方向的禁止区域边界宽度均为5个单位。
- 为所有宏单元(macros)设置外部禁止区域(keepout)的边界。
add_end_cap -respect_keepout -respect_blockage -lib_cell SHFILL3_HVT
- 添加终端单元(end cap cells),这些单元用于芯片的边界。
-respect_keepout
和-respect_blockage
表示在放置这些单元时要考虑已设置的禁止区域和阻塞区域。SHFILL3_HVT
是库单元的名称,用于作为终端单元。
- 添加终端单元(end cap cells),这些单元用于芯片的边界。
add_tap_cell_array -pattern stagger_every_other_row \
- 添加阱接触单元(tap cells)阵列。
-pattern stagger_every_other_row
表示采用隔行交错的模式来放置阱接触单元。 -fill_boundary_row true
:填充边界行。-respect_keepout
:放置时考虑禁止区域。-master_cell_name SHFILL3_HVT
:使用SHFILL3_HVT
作为阱接触单元的主单元。-distance 110
:设置阱接触单元之间的距离为110个单位。为最小距离的四倍
- 添加阱接触单元(tap cells)阵列。
derive_pg_connection -power_net VDD -ground_net VSS -create_ports top
- 推导电源(VDD)和地(VSS)的连接关系,并在顶层(top)创建电源和地端口。
derive_pg_connection -power_net VDD -power_pin VDD -cells [get_flat_cells *] -reconnect
- 为所有扁平化的单元(
[get_flat_cells *]
)推导电源连接,将电源引脚(VDD)连接到电源网络(VDD),并重新连接。
- 为所有扁平化的单元(
derive_pg_connection -ground_net VSS -ground_pin VSS -cells [get_flat_cells *] -reconnect
- 为所有扁平化的单元推导地连接,将地引脚(VSS)连接到地网络(VSS),并重新连接。
加power ring
第一遍手动,之后用脚本
create_rectangular_rings -nets {VDD VSS} -around specified -cells {oc8051_rom1_u_sram0 oc8051_rom1_u_sram1 oc8051_rom1_u_sram2 oc8051_ram_top1_oc8051_ram1_u_ram_wrap_u_sram0 oc8051_ram_top1_oc8051_ram1_u_ram_wrap_u_sram1 oc8051_ram_top1_oc8051_ram1_u_ram_wrap_u_sram2 oc8051_ram_top1_oc8051_ram1_u_ram_wrap_u_sram3} -left_offset 1 -left_segment_layer M4 -left_segment_width 2 -right_offset 1 -right_segment_layer M4 -right_segment_width 2 -bottom_offset 1 -bottom_segment_layer M5 -bottom_segment_width 2 -top_offset 1 -top_segment_layer M5 -top_segment_width 2
加pg_strp
第一遍手动,之后用脚本
create_power_straps -direction vertical -start_at 10 -num_placement_strap 999 -increment_x_or_y 50 -nets {VDD VSS} -layer M4 -width 1 -pitch_within_group 25
save_mw_cel -as m4
set i 0
foreach_in_collection mem [all_macro_cells] {
set name [get_attri $mem full_name]
echo $name
set bbox [get_attri $mem bbox]
echo $bbox
set llx [lindex $bbox 0 0]
set lly [lindex $bbox 0 1]
set urx [lindex $bbox 1 0]
set ury [lindex $bbox 1 1]
set expand_v 0.6
set newllx [expr $llx - $expand_v]
set newlly [expr $lly - $expand_v]
set newurx [expr $urx + $expand_v]
set newury [expr $ury + $expand_v]
eval "create_route_guide -name route_guide_${i} -no_preroute_layers {M5} -coordinate {{$newllx $newlly} {$newurx $newury}} -no_snap"
incr i
}
create_power_straps -direction horizontal -start_at 10 -num_placement_strap 999 -increment_x_or_y 50 -nets {VDD VSS} -layer M5 -width 1 -pitch_within_group 25
remove_route_guide -all
create_power_straps -direction vertical -start_at 5 -num_placement_strap 999 -increment_x_or_y 50 -nets {VDD VSS} -layer M6 -width 4 -pitch_within_group 25
加M4,M5,M6,M6只和顶层连,线宽可以放大一点,结果如图
创建macro,STDCEL与电源的连接 preroute instance
首先设定连接金属层,再连接
set_preroute_drc_strategy -max_layer M6 -min_layer M4
preroute_instances -ignore_pads -ignore_cover_cells -select_net_by_type specified -nets {VDD VSS}
set_preroute_drc_strategy -max_layer M4 -min_layer M1
preroute_standard_cells -nets {VDD VSS} -connect horizontal -port_filter_mode off -cell_master_filter_mode off -cell_instance_filter_mode off -voltage_area_filter_mode off -route_type {P/G Std. Cell Pin Conn}
创建blockage
第一遍手动创建,首先添加硬blockege,集中于边角
再添加part blockege,50%
随后写成脚本
首先清除上一节的placement与placement blockege
remove_placement_blockage -all
remove_placement
AI写代码
再加入自动生成的blockege
derive_placement_blockages -apply -output_script x.tcl -thin_channel_ width 60
修改macro中间blockege的属性,随后保存
错误检查
verify_pg_nets
如果有错,使用verification/error browser
之后连接标准单元 create_fp_placement -effort low
添加route_guide
代码中使用这样创建
foreach_in_collection mem [all_macro_cells] {
set name [get_attri $mem full_name]
echo $name
set bbox [get_attri $mem bbox]
echo $bbox
set llx [lindex $bbox 0 0]
set lly [lindex $bbox 0 1]
set urx [lindex $bbox 1 0]
set ury [lindex $bbox 1 1]
set expand_v 0.6
set newllx [expr $llx - $expand_v]
set newlly [expr $lly - $expand_v]
set newurx [expr $urx + $expand_v]
set newury [expr $ury + $expand_v]
eval "create_route_guide -name route_guide_${i} -no_preroute_layers {M5} -coordinate {{$newllx $newlly} {$newurx $newury}} -no_snap"
incr i
}
floorplan阶段的drc
运行drc文件,修改这两行
可能需要ICV或Hercules
发布者:admin,转转请注明出处:http://www.yc00.com/web/1754948779a5219592.html
评论列表(0条)