!干货! 为设计指定输入驱动强度 set_driving_cell set_drive set_input_transition
推文主要内容:
-
为设计指定输入端口驱动强度;
-
set_driving_cell命令;
-
set_drive命令;
-
set_input_transition命令;
-
这三个命令之间的关系与区别。
相信大家在做逻辑综合或者写sdc约束的时侯总纠结上面三条命令该怎么用,那么它们之间有什么关系呢,且听我慢慢道来。
为设计指定输入驱动强度
我们知道,一个Cell的延迟与两个内容有关,一个是Input Transition,另一个是Output Load,如下图所示:
因此,对于整个设计的输入端口(Input Port)而言,要想让逻辑综合工具(如DC)、布局布线工具(如ICC)、STA工具(如PT)精确计算输入端口后边驱动的单元的延迟,必须让工具知道输入端口的Transition时间。
如下图所示,Transition时间越短(即越快Fast),Cell的延迟越小(从A端口到FF2的D端口延迟越小);反之,Transition越慢,从A端口到FF2的D端口的电路的延迟越大。因此我们需要为设计的输入端口定义驱动能力。
一般的EDA工具(如DC等)默认所有输入端口的Transition时间都是0,这显然过于理想,因此,要想精确获得输入端口处电路的时序,为所有输入端口设置合理的驱动能力或者Transition时间非常重要。
定义输入端口的驱动能力可以是标准单元库中的一个缓冲器或反相器(buffer/inverter)单元(用set_driving_cell命令设置),也可以是指定的电阻值(用set_drive命令设置),还可以是set_input_transition,那么它们有什么区别呢?该如何选取?
对输入端口指定驱动强度,方法好多哦,到底选哪种?
用set_driving_cell、set_drive还是set_input_transition呢?
set_driving_cell命令用法
应用场景:Block level
EDA工具(如DC)默认输入端口信号的Transition时间是0;
我们通过set_driving_cell命令来设置某个输入端口前面是什么驱动单元驱动它的,EDA工具会从指定的库中查找得出更加真实的Transition时间来代替零Transition。
set_driving_cell命令的语法:
set_driving_cell
[-lib_cell lib_cell_name]
[-library lib]
[-rise] [-fall]
[-min] [-max]
[-pin pin_name]
[-from_pin from_pin_name]
[-dont_scale]
[-no_design_rule]
[-none]
[-input_transition_rise rtran]
[-input_transition_fall ftran]
[-multiply_by factor]
port_list
举例:
例1:将ddfs的所有输入端的驱动单元设置为DFF1的管脚Q,并忽略该管脚上的设计规则
current_design ddfs
set_driving_cell -lib_cell DFF1 -pin Q -no_design_rule [all_inputs]
例2:为MY_DESIGN的输入端口A设置驱动单元为OR3B或者FD1的Qn输出Pin。
set_drive命令用法
应用场景:Chip level
set_drive命令通过为输入端口指定电阻值的方法来为其定义外部驱动强度。在逻辑综合工具进行优化期间,工具根据设置的驱动强度来计算由该输入端口驱动的逻辑电路的延迟。
对于芯片级的设计(即顶层设计)而言,它的输入端口的驱动能力很难用工艺库中的某个具体单元去量化,因此我们一般不能用set_driving_cell来为其指定驱动强度。我们一般在顶层通过set_drive命令定义输人电阻的大小,由于在顶层,要驱动的是负载较大的IO单元,故需要的驱动能力较强,典型的值是0.05,单位取工艺库中电阻的单位,一般为kΩ;
set_drive命令的语法:
set_drive
resistance
[-rise] [-fall]
[-min] [-max]
port_list
· 阻抗resistance:非负的驱动阻抗,该值越小表示驱动能力越大。(一个MOS管的开关模型是一个电阻串联一个开关,驱动一个MOS管栅极的是上一级MOS管的漏端,它总是通过该电阻连接到电源或者地,这里设置的是MOS管等效电阻的大小);
· 端口名列表port_list:设置为哪些输入端口设置驱动电阻。
由于通常情况下,设计的时钟和复位端都由驱动能力很大的单元或树形缓冲来驱动,所以可以用set_drive命令将这两个端口的驱动电阻设置为0,也就是驱动强度为无穷大(该命令对当前设计有效)。
举例:
例1:给设计的输入端口A、B和C指定2.0 kΩ(单位一般是kΩ,跟库中定义有关)的电阻,可以用该命令:
> set_drive 2.0 {A B C}
例2:为设计中的所有输入端口指定12.3 kΩ的电阻,可以用该命令:
> set_drive 12.3 [all_inputs]
例3:将ddfs的时钟和复位端的驱动设为无穷大,即驱动阻抗设为零:
current_design ddfs
set_drive 0 {clk, reset}
set_input_transition命令用法
应用场景:Chip level
我们可以用set_input_transition命令为输入端口指定一个固定的transition时间,工具会用该transition时间来计算它驱动的逻辑电路的延迟。
对于顶层设计(Chip level的设计)而言,除了用set_drive命令之外,我们也可以使用set_input_transition命令来为其设置固定的transition时间,因为芯片外边一般存在驱动能力比较强的器件和大电容。在这种情况下,transition时间相对独立于当前设计中的电容。
Input Transition分为上升和下降的Transition时间。
set_input_transition命令的语法:
set_input_transition
transition
[-rise] [-fall]
[-min] [-max]
port_list
举例:
例1:MY_DESIGN是Chip level的design,为其输入端口A指定0.12ns的input rise和fall transition:
Summary总结
set_driving_cell与set_drive和set_input_transition的区别
我们也可以用set_driving_cell或set_drive或set_input_transition命令来指定输入端口的驱动,那么它们有什么区别呢?
set_driving_cell命令通常是首选方法,因为它是最真实的模型。当我们的设计是模块级(Block level)的design时,我们的设计前面一般还有其他的设计。那么前面模块的输出便是我们模块的输入,如下图所示,我们可以根据外围电路的输出Cell来给自己的模块指定驱动强度:
当我们的设计是芯片级(Chip level)的顶层设计时,芯片外围电路要驱动的是负载较大的IO单元,故需要的驱动能力较强,一般无法用库里面已有的单元来指定驱动强度,因此一般用set_drive命令。
对于顶层设计(Chip level的设计)而言,除了用set_drive命令之外,我们也可以使用set_input_transition命令来为其设置固定的transition时间,因为芯片外边一般存在驱动能力比较强的器件和大电容。在这种情况下,transition时间相对独立于当前设计中的电容。
如果多种指定方式发生冲突,那么在工具中,最近使用的命令会覆盖先前的命令。
综合应用举例
对于内部的一个模块sub_design2,由于是Block level的design,因此我们根据已知的前级设计的输出单元用set_driving_cell来为本模块指定输入端口的驱动强度。
对于Chip level的顶层设计top_level_design而言,芯片外部的电路需要驱动负载较大的PAD,因此需要使用set_drive命令来通过设置电阻值来指定输入端口的驱动强度。
网易云课堂视频课程
链接:https://study.163.com/course/introduction/1005909004.htm《Calibre DRC教程-一键搞定DRC》
《Calibredrv教程-提高流程自动化》
《搭建IC设计的EDA虚拟机/服务器》