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上;

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个针对“Filled_pause_frequency”响应变量的偏差分析表,它使用Type III Wald卡方检验进行了假设检验。每个自变量都被单独测试,以确定它是否对响应变量产生显著影响。在此表格中,“Chisq”列显示了卡方值,“Df”列显示了自由度,“Pr(>Chisq)”列显示了对应的p值。 - 截距项(Intercept)的卡方值为49.7207,自由度为1,p值小于0.001,因此截距项对响应变量有显著影响。 - Chinese_level的卡方值为1.2587,自由度为2,p值为0.53293,因此在这个模型中,Chinese_level对响应变量没有显著影响。 - Request_scenario的卡方值为3.4722,自由度为1,p值为0.06241,因此在这个模型中,Request_scenario对响应变量的影响可能不显著,但也存在一定程度的不确定性。 - Strategy_type的卡方值为177.5540,自由度为2,p值小于0.001,因此Strategy_type对响应变量有极显著的影响。 - Chinese_level:Request_scenario的卡方值为4.1748,自由度为2,p值为0.12401,因此在这个模型中,Chinese_level:Request_scenario对响应变量的影响可能不显著,但也存在一定程度的不确定性。 - Chinese_level:Strategy_type的卡方值为95.3308,自由度为4,p值小于0.001,因此Chinese_level:Strategy_type对响应变量有极显著的影响。 - Request_scenario:Strategy_type的卡方值为4.6560,自由度为2,p值为0.09749,因此在这个模型中,Request_scenario:Strategy_type对响应变量的影响可能不显著,但也存在一定程度的不确定性。 - Chinese_level:Request_scenario:Strategy_type的卡方值为23.9163,自由度为4,p值小于0.001,因此Chinese_level:Request_scenario:Strategy_type对响应变量有极显著的影响。 总之,这个偏差分析表提供了每个自变量对响应变量的影响程度和显著性,以及交互作用的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺脆兵兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值