概述
MCMM脚本
MM
multi-mode 的脚本
以最简单的两个mode为例, 一个func 一个test,肯定会分出来的两个mode;
MM的脚本主要写什么:
#
# 通过设置signal值,开启或者关闭mode
# Enable DFT logic and OCC Controller:
set_case_analysis 1 test_mode
set_case_analysis 0 occ_bypass
set_case_analysis 0 occ_reset
# test mode 的时钟和 func mode的时钟可能不一样而且一些macro cell 的时钟可能和主设计的时钟很多时候是不一样的,都要单独指定时钟.
#下面定义了6个clock 包括4个 source clock 和2个generated clock 其中ate_clk 不出意外 应该是 ATE机台的clk 也就是测试用的clk.
# PCI clock at 133 MHz (default)
create_clock -period 7.5 -name PCI_CLK [get_ports pclk]
create_clock -period 7.5 -name v_PCI_CLK
# SYSTEM clocks
create_clock -period 2.4 -name SYS_2x_CLK [get_ports sys_2x_clk]
create_generated_clock -source [get_ports sys_2x_clk] -name SYS_CLK
-divide_by 2 [get_pins I_CLOCKING/sys_clk_in_reg/Q]
# SDRAM clock at 266 MHz (default)
create_clock -period 4.1 -name SDRAM_CLK [get_ports sdram_clk]
create_clock -period 4.1 -name v_SDRAM_CLK
create_generated_clock -source [get_ports sdram_clk] -name SD_DDR_CLK
-combinational [get_ports sd_CK]
create_generated_clock -source [get_ports sdram_clk] -name SD_DDR_CLKn
-combinational -invert [get_ports sd_CKn]
create_clock -period 30 [get_ports ate_clk]
# 为时钟分组, 时钟域之间的路径(跨不同时钟分组的路径) 不会在时钟分析时考虑
# set_clock_groups
#[-physically_exclusive | -logically_exclusive | -asynchronous]
#[-allow_path]
#[-name]
#[-group clock_list]*
# 重点看第一个选项, physically_exclusive 是指物理相互独立的clock group ;物理独立的时钟不能在设计上同时存在; 最简单的例子就是 多个时钟 定义在相同的source pin 上;
#-logically_exclusive 是指他们之间没有任何functional path 存在;但是可能会存在耦合连接的时钟 一个简单的例子 多个时钟 由一个MUX 选择, 但在MUX的上游仍然可能相互影响
#-asynchronous 异步的时钟之间的分组,对于那些 没有 phase relationship的两个时钟. 信号完整性分析会使用一个无限大的arrive window on the aggressor;
set_clock_groups -asynchronous
-name func_async
-group [get_clocks SYS*]
-group [get_clocks *PCI*]
-group [get_clocks *SD*]
# Set a false path constraint from the ScanEnable port (top-level)
# to the PLL clocks:
# 这里可以想到的是 func mode 和test mode所用的时钟不同,可能会有ICG( internal clock gate),而门控的信号应该就是 scan enable.所以需要为 ScanEnable 和 其他func mode下的时钟做false path;
set_false_path -from scan_enable -to [get_clocks "PCI* SD* SYS*"]
# Specify the asynchronous relationship between the PLL clocks (the PLL outputs)
# and the ATE clock:
# 这里有一个疑问 对于 scan chain 的clock 和func mode 的clock 来说, 这里是logic exclusive 还是 asynchronous, 觉得ate_clock 和 func 的clk 肯定会使用选通器连接; 同时 他们也是异步时钟,没有phase 的relationship;
set_clock_groups
-name my_occ_clock_groups
-asynchronous
-group [get_clocks ate_clk]
-group [get_clocks "*PCI* *SD* SYS*"]
# Set false paths from all ScanInput pins to the PLL clocks:
# 除了分组上的exclusive 还需要手动对 scan chain的时钟端口和func的时钟端口 做false path;
set_false_path -from [get_ports test_si*] -to [get_clocks "PCI* SD* SYS*"]
# Set false paths from all PLL clocks to scan_in port "SD" of registers
set_false_path -from PCI_CLK
-to [get_pins -of_objects [all_registers] -filter "name == SI"]
set_false_path -from SDRAM_CLK
-to [get_pins -of_objects [all_registers] -filter "name == SI"]
set_false_path -from SYS_CLK
-to [get_pins -of_objects [all_registers] -filter "name == SI"]
set_false_path -from SYS_2x_CLK
-to [get_pins -of_objects [all_registers] -filter "name == SI"]
# Set multicycle paths with setup value of 3 and hold value of 2 from the
# clock chain bits. The specific setup value of 3 applies to the DFTC-inserted
# OCC controller. There are three delay elements (pipeline registers) to
# synchronize the clock controller to prevent metastability. For
# other OCC controllers, the path is multicycle, but the design should
# be inspected to determine the actual number to be used.
set_multicycle_path -setup 3 -from snps_clk_chain_0/U_shftreg_0/ff_0/q_reg
set_multicycle_path -setup 3 -from snps_clk_chain_0/U_shftreg_0/ff_1/q_reg
set_multicycle_path -hold 2 -start -from snps_clk_chain_0/U_shftreg_0/ff_0/q_reg
set_multicycle_path -hold 2 -start -from snps_clk_chain_0/U_shftreg_0/ff_1/q_reg
MC(multi-Corner)
通常 我们会为每一个 Corner 做独立的约束脚本,里面的内容主要是 所使用的的工艺库, 以及对应的 max/min TLUP文件.
#ff_125c
set TECH_LIB_NAME [file rootname [file tail $TECH_LIB]]
set_parasitic_parameters -library $TECH_LIB_NAME -early_spec minTLU -late_spec minTLU
set_temperature 125
set_process_number 1.01
set_process_label fast
set_voltage 0.95 -object_list VDD
set_voltage 1.16 -object_list VDDH
set_voltage 0.00 -object_list VSS
#设置 time derate 时序增减因子 是计算OCV的一种简单方法 , delay derate 是影响静态时序分析报告中的delay value,最长路径的延迟与 -late 设置的derate 值的相乘就是报告中的值, 而最短路径的delay 是 源delay与-early 设置的derate值相乘. 如果未指定 derating factors 默认为1.0; 也就是不变.
set_timing_derate -late 1.05 -cell_delay -net_delay
set_load 100 $orca_ports(pci_outputs)
set_load 10 $orca_ports(sdram_outputs)
set_load 10 $orca_ports(sd_ddr_outputs)
set_load 30 $orca_ports(test_so)
C +M 排列组成scenario
比如
func @ ss/125c
func @ ss/40c
scenario的脚本中还需要写些什么?
#
# ORCA_TOP
# scenario constraints func @ ss/125c
# Requires the file ORCA_TOP_port_lists.tcl to be sourced first
#
suppress_message UID-401
#指定此scenario下的driving cell 主要是获得 driving cell 对下级时序的影响
#scenario的脚本 和普通的时序脚本类似 要将准确而合适的 约束打上去 包括不限于 input delay output delay;clock latency clock uncertainty; 包括 hold 和 setup ;
#综合的时候的 约束 可以没有 hold 但是到了 布局布线 还是需要指定hold 的约束的, 直接导出 DC的约束文件 还是不太好;
set_driving_cell -lib_cell ${DRIVING_CELL_CLOCKS} $orca_ports(clocks)
set_driving_cell -lib_cell ${DRIVING_CELL_PORTS} $orca_ports(mode_reset)
set_driving_cell -lib_cell ${DRIVING_CELL_PORTS} $orca_ports(pci_inputs)
set_driving_cell -lib_cell ${DRIVING_CELL_PORTS} $orca_ports(sdram_inputs)
set_driving_cell -lib_cell ${DRIVING_CELL_PORTS} $orca_ports(sd_ddr_inputs)
set_driving_cell $orca_ports(test_si) -lib_cell INVX4_RVT
unsuppress_message UID-401
set_clock_uncertainty -setup 0.1 [get_clocks SYS_*]
set_clock_uncertainty -hold 0.05 [get_clocks SYS_*]
set_clock_uncertainty -setup 0.1 [get_clocks PCI_CLK]
set_clock_uncertainty -hold 0.05 [get_clocks PCI_CLK]
set_clock_uncertainty -setup 0.1 [get_clocks SDRAM_CLK]
set_clock_uncertainty -hold 0.05 [get_clocks SDRAM_CLK]
set_clock_latency 0.2 [get_clocks *SDRAM_CLK]
set real_clocks [remove_from_collection [get_clocks] [get_clocks "v_* SD_DDR_CLK*"]]
set_clock_transition 0.1 $real_clocks
set_input_delay -add_delay -max 3.0 -clock v_PCI_CLK $orca_ports(pci_inputs)
set_input_delay -add_delay -min 1.0 -clock v_PCI_CLK $orca_ports(pci_inputs)
set_output_delay -add_delay -max 2.0 -clock v_PCI_CLK $orca_ports(pci_outputs)
set_output_delay -add_delay -min -0.5 -clock v_PCI_CLK $orca_ports(pci_outputs)
# Constrain SDRAM ports
set_input_delay 0.500 -max -add_delay -clock v_SDRAM_CLK $orca_ports(sd_ddr_inputs)
set_input_delay 0.500 -max -add_delay -clock v_SDRAM_CLK -clock_fall $orca_ports(sd_ddr_inputs)
set_input_delay 0.100 -min -add_delay -clock v_SDRAM_CLK $orca_ports(sd_ddr_inputs)
set_input_delay 0.100 -min -add_delay -clock v_SDRAM_CLK -clock_fall $orca_ports(sd_ddr_inputs)
# Constrain DDR interface
set_output_delay 0.650 -max -add_delay -clock SD_DDR_CLK $orca_ports(sdram_outputs)
set_output_delay 0.650 -max -add_delay -clock SD_DDR_CLK -clock_fall $orca_ports(sd_ddr_outputs)
set_output_delay 0.080 -min -add_delay -clock SD_DDR_CLK $orca_ports(sdram_outputs)
set_output_delay 0.080 -min -add_delay -clock SD_DDR_CLK -clock_fall $orca_ports(sd_ddr_outputs)
tcl中的foreach 语句
foreach 可以循环一个或多个列表中的值,再循环时 list 的元素回想使用index命令一样 从前到后 依次分配给 varName, 然后调用tcl解释器 执行body中的命令 ,也就是说 body中的命令可以是 tool相关的;
foreach varName list body
foreach varlist1 list1 ?varlist2 list2 ...? body
#例如:
set values {a b c d e f g h}
foreach value $values {
puts $value
}
#在 multi_scenario 脚本中存在的: 使用 foreach 创建 mode 和 corner;
foreach m [array names m_constr] {
create_mode $m
}
## 补充 tcl 中 array 的用法
array option arrayName
#其中option 有许多玩法
array Name m_corner
#是指 返回与后面m_corner 相匹配的数组索引的列表
set_sceanario_status
为每个scenario 做设置,是否执行 setup /hold 的分析
leakage_power / dynamic_power 的分析
等一系列逻辑DRC的分析,.
需要注意的是 当使用 create_scenario 创建了一个scenario 之后 它会默认将其active 然后执行除了 cell 和 signal EM之外 所有DRC 已经功耗的分析. 所以 set_scenarios_status 命令用在哪些只做特定analysis type 的scenario上;
最后
以上就是羞涩羊为你收集整理的MCMM 脚本编写的全部内容,希望文章能够帮你解决MCMM 脚本编写所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复