后端设计笔记 2 FLOORPLAN

理论1.design_setup2.floorplan实践一定记得切换回英文输入法该脚本完成物理设计初始化阶段的核心工作:建立工艺相关的设计库容器加载综合后设计数据(DDC格式更完整&#x

理论

1.design_setup

2.floorplan

  

实践

一定记得切换回英文输入法

该脚本完成物理设计初始化阶段的核心工作:

  1. 建立工艺相关的设计库容器
  2. 加载综合后设计数据(DDC格式更完整,含物理信息)
  3. 解决模块实例化冲突
  4. 生成可迭代的基线版本(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 WindowMain Window有些菜单会相同,有些菜单Main Window有,而Layout Window没有,有些菜单Layout Window有,而Main Window没有。个人觉得有点鸡肋...

任务二:浏览版图视图

 1.现在你可以花几分钟的时间熟悉下版图窗口下的zoom(放大和缩小)pan(拖动)的按钮,当你尝试滑动鼠标滚轮放大和缩小时候,你可以观察左上角的Overview(类似游戏里的小地图)窗口里的黄色矩形也会跟着放大和缩小,你还可以点击pan按钮后,拖动这个黄色矩形,你就会发现黄色矩形对应的版图区域就会显示出来。

 提示:当把鼠标的指针悬浮放在菜单栏的按钮上停止一段时间后,工具会弹出该按钮的功能简介。退出zoompan模式,并且选择Selection Tool(下图白色的箭头图标)或者按“Esc”按键,这时,工具会返回选择模式。

选择、放大、缩小、拖动的示例

2.当Layout Window(版图窗口)开启的时,你可以使用快捷键。例如:用小写的“f”键,或者“Ctrl + f”组合键将版图调节至全屏模式;再如:用“+”键将版图以2倍放大。

3.你可以通过两种方法获取快捷键的信息:1将鼠标指针放在菜单栏某个按钮上一段时间不动,工具会自动冒出来这个按钮的功能简介和快捷键。2你可以选择下拉菜单:HelpReport Hotkey Bindings,此时一个新的窗口会打开,这个窗口列出了快捷键的相关信息,关闭这个窗口的方法:WindowClose 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可见开关,此时inputoutputpowergroundpin就会被显示。

3.打开Labels,单元的名字此时可见,接下来,按“Z”键,或者滑动鼠标滚轮,放大任何一个标准单元,点击Labels左边的“+”图标,再勾选扩展出的PinVis开关,此时标准单元的pin的名字就会显示出来。

4.在选择模式中(按“Esc”键),按住鼠标的左键在有标准单元的地方随便画一个框,框中标准单元及标准单元的pin会高亮。取消选择的方法可以在版图任意空的地方单击鼠标左键。

5.设置pin不可被选择:找到Pin那一行,取消勾选对应的Sel栏,重复第4步,你会发现标准单元的pin没有被选择。

6.勾选RouteVis开关,此时所有的绕线会显示,扩展Route左边的“+”按钮,然后继续扩展Net Type,取消勾选PowerGroundVis开关,此时版图的信号线和时钟线会被显示。

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.单独的目标,例如(ShapeViaTerminalPin…等),可以点击对应图层的方块,这样开启或关闭这些单独的目标。

任务四:查询和选择目标

1.鼠标的指针必须是箭头的形状你才可以查询和选择目标,如果你的鼠标指针不是选择模式,点击菜单栏中的白色箭头的按钮或者按“Esc”键就可以进入选择模式。

2.将鼠标的箭头悬浮于版图的某个目标,注意不要单击,这个目标会被一个白色的虚线高亮,此时在左下角位置还会弹出一个信息提示的窗口,该窗口显示了被选择虚线高亮目标的关键信息。

3.现在鼠标左击并任意选择一个目标(例如一个标准单元),此时被选择的目标变成了白色的实线高亮框,如果你不选择该目标或者换一个目标,这个白色实线高亮框就会消失或者换成你选择的新目标,现在保持这个目标被选择的状态。

4.当一个目标被选择的状态时,你现在将鼠标的箭头悬浮另一个不同的目标,左下角位置仍会弹出一个信息提示的窗口,该窗口显示了虚线框目标的信息,即:悬浮另一个目标的信息,而不是步骤3鼠标选择的实线框的目标信息。

5.你可以按“q”键来获取完整的被选择的目标信息,或可以从菜单栏里依次点击:SelectQuery Selection。那么有关这个被选择目标的详细信息的窗口将在Layout Window的最右侧显示。你可以点击右上角的“-”关闭该窗口。

6.你可以点击版图的空白处,或通过快捷键“Ctrl+d”组合键,或通过使用菜单栏依次点击:SelectClear可以取消选择所有的目标。

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
  1. 场景初始化
    remove_scenario -all 清除所有现有场景约束
    source ../scripts/usr_tcl/mmmc.tcl 加载预定义的MMMC约束文件(通常包含工艺库、电压温度条件等基础设置)

  2. 路径分组优化(关键路径优先级控制)

    • 遍历所有激活场景(all_active_scenarios)
    • ports_clock_root 收集所有时钟源端口(用于区分时钟信号与数据信号)
    • 分组策略:
      • REGOUT:所有输出寄存器路径
      • REGIN:非时钟输入到寄存器的路径
      • FEEDTHROUGH:纯组合逻辑路径(输入到输出的直接路径)
  3. 时钟树重置

    • remove_propagated_clock 两步操作:
      ① 清除时钟树网络上的传播时钟属性
      ② 全局移除所有传播时钟定义
    • 目的:避免旧时钟树信息干扰后续CTS阶段
  4. 设计保存
    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


  1. 资源与计算设置
    • set_host_options -max_cores 1:设置主机使用的最大核心数为1。
    • set_delay_calculation_options -arnoldi_effort high:将延迟计算时的Arnoldi算法的计算力度设置为高。
  2. 通用优化设置
    • 多个应用变量的设置,如timing_enable_multiple_clocks_per_regcase_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。
  3. 临界范围设置
    • set_app_var physopt_area_critical_range 0.1set_app_var physopt_power_critical_range 0.1:分别设置物理优化时面积和功耗的临界范围为0.1。
  4. 禁用单元设置
    • source ../scripts/usr_tcl/set_dont_use.tcl :执行外部Tcl脚本,设置禁用的单元。

common_placement_settings_icc.tcl

  1. 布线层设置
    • set_ignored_layers -max_routing_layer M6:设置最大的忽略布线层为M6,意味着在后续的布线操作中,M6及以上的布线层可能会被忽略。
    • set_ignored_layers -min_routing_layer M1:设置最小的忽略布线层为M1,即M1及以下的布线层可能会被忽略。
  2. PNET选项设置
    • remove_pnet_options:移除之前设置的所有PNET选项。
    • set_pnet_options -partial {{M6 M4}} -see_object {{all_types}}:设置PNET选项,部分使用M6和M4层,并且可以看到所有类型的对象。
  3. 拥塞选项设置(注释部分)
    • # set_congestion_options -max_util 0.85:注释掉的代码,若取消注释,将设置最大拥塞利用率为0.85。
  4. 应用变量设置
    • 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
  1. set_keepout_margin -all_macros -outer {{5 5 5 5}}
    • 为所有宏单元(macros)设置外部禁止区域(keepout)的边界。{5 5 5 5} 通常表示上、下、左、右四个方向的禁止区域边界宽度均为5个单位。
  2. add_end_cap -respect_keepout -respect_blockage -lib_cell SHFILL3_HVT
    • 添加终端单元(end cap cells),这些单元用于芯片的边界。-respect_keepout 和 -respect_blockage 表示在放置这些单元时要考虑已设置的禁止区域和阻塞区域。SHFILL3_HVT 是库单元的名称,用于作为终端单元。
  3. 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个单位。为最小距离的四倍
  4. derive_pg_connection -power_net VDD -ground_net VSS -create_ports top
    • 推导电源(VDD)和地(VSS)的连接关系,并在顶层(top)创建电源和地端口。
  5. derive_pg_connection -power_net VDD -power_pin VDD -cells [get_flat_cells *] -reconnect
    • 为所有扁平化的单元([get_flat_cells *])推导电源连接,将电源引脚(VDD)连接到电源网络(VDD),并重新连接。
  6. 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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信