我是靠谱客的博主 羞涩羊,最近开发中收集的这篇文章主要介绍MCMM 脚本编写,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 脚本编写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部