OCV大家应该都了解,对应的AOCV想必也不陌生。之前小编也专门介绍各类OCV的概念,如果还有同学不太了解则可以温习一下这两篇文章:
在工艺进入7nm及以下之后,又出现了POCV/SOCV等概念来模拟越来越复杂的variation。今天我们就一起来了解一下POCV的实际应用。一般来说设计中的POCV有两个主要来源:POCV文件和LVF库。二者有何区别又有什么联系呢?
- POCV文件
和AOCV文件类似,POCV文件也是一种特定的文本文件。对于每一种类型的标准单元库,其不同PVT条件均有不同的POCV文件。之前的文章中我们讲过,在使用POCV文件的情况下,cell delay的计算遵从如下公式,其中P代表正态分布,而C称为POCV coefficient:
# POCV参数计算delay(左右划动)
delay = nominal_delay + (C * nominal_delay) * P
而POCV文件中所能查到的内容正是上述公式中的参数C。一般在同一个PVT条件下的某个cell,都会有late-rise, late-fall, early-rise, early-fall等四种参数,这四种参数分别应用在setup和hold的rise/fall分析中。下图中展示了某一个buffer在ff/0.825v/0c条件下的四种POCV参数值:
通过POCV文件得到上述参数C后工具即可计算出不同cell在不同条件下的delay。
- LVF库文件
尽管POCV文件可以获得POCV分析所需要数据,但是在实际项目中小编观察到LVF库的应用更多。所谓LVF库是Liberty Variation Format的缩写,其主要特点是把POCV variation的相关参数集成在.lib库文件中。在之前的文章中讲过,LVF环境下的POCV delay计算公式如下:
# LVF条件下delay计算
delay = nominal_delay + σ * P
其中σ(sigma)可以直接从LVF库文件中获取。那么sigma是如何定义在.lib库文件中呢?目前根据不同的variation模型主要分为两种:正态分布(高斯分布)和Moment-Based模型。在先进工艺如7nm问世初期,主要采用正态分布的模型来模拟variation,并在.lib文件中的的cell的'timing'描述中增加ocv_sigma*的语法:
上述LVF的内容和语法可以和POCV文件中的语法找到如下一一对应的关系:
而随着对先进工艺的研究数据越来越多,逐渐发现工艺的variation尤其是低电压工艺下的variation并不是严格的正态分布,而是像下图所示的略有不对称:
而为了更精确地描述这种不对称,采用了新的模型来模拟,也就是moment-based LVF。对应的LVF库文件中也增加了新的语法来描述这种不对称,分别是:Mean Shift, Standard Deviation和Skewness。它们各自的数学定义分别如下:
# Moment-Based LVF(左右滑动)
Mean = E[x] = x1p1+x2p2+...+xkpk
Standard Deviation = (E[(X-E[X])2])1/2
Skewness = (E[(X-E[X])3])1/3
如果大家手头上正在做使用LVF库的项目,可以对照上面的ocv_sigma*和以下moment-based语法看看是属于哪种LVF库。
- POCV分析流程
有了POCV的文件或者LVF,如何将它们应用在设计中,又怎样开启POCV的分析呢?以PrimeTime为例,标准的POCV分析流程如下:
# PrimeTime POCV流程
pt_shell> set_app_var timing_library_derate_is_scenario_specific true
pt_shell> set_app_var timing_pocvm_enable_analysis true
pt_shell> set_app_var timing_pocvm_corner_sigma 3 ;# default
pt_shell> set_app_var timing_pocvm_report_sigma 3 ;# default
pt_shell> set_app_var timing_pocvm_precedence "file" ;# default
pt_shell> read_aocvm ${lib}_${pvt}.pocv
pt_shell> set_timing_derate -cell_delay -pocvm_guardband -early 0.95 ;# optional
pt_shell> set_timing_derate -cell_delay -pocvm_guardband -late 1.05 ;# optional
其中timing_pocvm_corner_sigma和timing_pocvm_report_sigma用来定义variation分布的sigma值,默认为3 sigma,数字越大越悲观。LVF库文件中一般以3 sigma为标准,调高sigma的数值可以让EDA工具以某种算法更悲观地计算delay和transition等,但是却要牺牲一点精度。timing_pocvm_precedence定义POCV文件和LVF同时存在时的优先级,默认以lib_cell的POCV文件优先级最高,LVF优先级最低,可以通过改变其数值来决定优先级顺序:
- POCV结果查看
按照以上流程开启PT中的POCV分析之后,可以通过以下命令报出所设置的POCV参数和POCV guardband:
pt_shell> report_ocvm –type pocvm -nosplit
pt_shell> report_timing_derate -pocvm_guardband
在update_timing之后,就可以通过report_timing -variation来获取timing path中的POCV信息:
pt_shell> report_timing -variation -from $startpoint -to $endpoint
示例report如下所示,请注意Incr和Path两部分与一般report的区别:
至于timing report的读法和具体的delay计算方法,我们将在后续文章中陆续介绍,敬请关注!
以上就是本篇的全部内容,如果你觉得学到了新知识,请帮忙点赞转发~
*****后端转行培训,后端学习资料大家可以私聊我*************