网站 建设初步,wordpress下一页,万象园网站建设与开发,品牌建设整体体系包括什么Design Compiler是一个约束驱动(constrain-driven)的综合工具#xff0c;它的结果是与设计者施加的约束条件密切相关的。在本文里#xff0c;我们主要讨论怎样给电路施加约束条件#xff0c;这些约束主要包括——时序和面积约束、电路的环境属性、时序和负载在不同模块之间的… Design Compiler是一个约束驱动(constrain-driven)的综合工具它的结果是与设计者施加的约束条件密切相关的。在本文里我们主要讨论怎样给电路施加约束条件这些约束主要包括——时序和面积约束、电路的环境属性、时序和负载在不同模块之间的分配以及时序分析。
一、时序和面积 上图是RTL模块的综合示意图可以看出在RTL代码仿真通过以后就开始将它进行综合综合时需要对他加入约束和设计属性的信息DC根据这些约束将RTL模块综合成门级网表然后分析综合出的网表是否满足约束条件如果不满足就要修改约束条件甚至重写RTL代码。值得注意的是上面提到的仅仅是RTL模块的综合过程而不是整个芯片的综合整个芯片是由很多这样的模块组成的它的综合过程与上图描述的过程有一定的区别具体我们将在后面进行讨论。
1、定义面积约束 因为芯片面积直接关系到芯片的成本面积越大成本越高因此集成电路的设计总是希望面积尽量小以减小芯片成本。定义面积约束是通过set_max_area命令来完成的比如: dc_shell current_design PRGRM_CNT_TOP dc_shell set_max_area 100 上面的例子给PRGRM_CNT_TOP的设计施加了一个最大面积100单位的约束。100的具体单位是由Foundry规定的定义这个单位有三种可能的标准
一种是将一个二输入与非门的大小作为单位1第二种是以晶体管的数目规定单位第三种则是根据实际的面积(平方微米等等)。至于设计者具体用的是哪种单位可以通过下面的一个小技巧得到——即先综合一个二输入与非门用report_area看他的面积是多少如果是1,则是按照第一种标准定义的如果是4则是第二种标准如果是其他的值则为第三种标准。
2、同步设计的特点 同步时序电路是DC综合的前提因此这里有必要先讨论一下同步时序电路的特点及目标。这里所讨论的同步时序电路的特点是——电路中的信号从一个受时钟控制的寄存器触发到达另一个受时钟控制的寄存器。而我们要达到的目标是——约束电路中所有的时序路径这些时序路径可以分为三类输入到寄存器的路径 、寄存器到寄存器之间的路径以及寄存器到输出的路径。他们分别对应与下图所示的标号为N、X和S的电路。 假设在上面的电路中我们要控制触发器FF2到FF3之间的时序即X电路的延时那要通过什么方式让DC知道呢显然一个直观的办法就是定义系统的时钟Clk如果我们定义好了Clk的周期那么DC会自动的尽量保证从FF2触发的信号能在一个周期内到达FF3寄存器。假如周期是10nsFF3触发器的建立时间(setup time)是1ns那么留给X电路的延时最大只能有10-19ns。
3、定义时钟 在电路综合的过程中所有时序电路以及组合电路的优化都是以时钟为基准来计算路径延迟的因此一般都要在综合的时候指定时钟作为估计路径延迟的基准。定义时钟的时候我们必须定义它的时钟源(Clock source)时钟源可以是端口也可以是管脚另外还必须定义时钟的周期。另外有一些可选项比如占空比(Duty Cycle)、时钟偏差(Clock Skew)和时钟名字(Clock Name)。定义时钟采用一个语句create_clock完成—— dc_shell create_clock -period 10 [get_ports Clk] dc_shell set_dont_touch_network [get_ports Clk] 第一句定义了一个周期为10ns的时钟①它的时钟源是一个称为Clk的端口。 第二句对所有定义的时钟网络设置为don’t_touch即综合的时候不对Clk信号优化。如果不加这句DC会根据Clk的负载自动对他产生Buffer而在实际的电路设计中时钟树(Clock Tree)的综合有自己特别的方法它需要考虑到实际布线后的物理信息所以DC不需要在这里对它进行处理就算处理了也不会符合要求。
4、约束输入路径 从上图可以看出我们所要定义的输入延时是指被综合模块外的寄存器触发的信号在到达被综合模块之前经过的延时在上图中就是外围触发器的clk-q的延时加上M电路的延时。当确定这段延时之后被综合模块内部的电路延时的范围也可以确定下来了。加入时钟周期是20ns输入延时是4ns内部触发器的建立时间为1.0ns那么就可以推断出要使电路正常工作N电路的延时最大不能超过20-4-1.015.0ns。 设置输入延时是通过DC的set_input_delay命令完成的—— dc_shell set_input_delay -max 4 -clock Clk [get_ports A] 如上面的语句指出了被综合模块的端口A的最大输入延时为4ns。-max选项是指明目前设置的是输入的最大延迟为了满足时序单元建立时间setup time的要求。另外还有一个选项是-min它是针对保持时间的约束使用的。-clk是指出这个端口受哪个时钟周期的约束。
5、约束输出路径 上图中信号在被综合模块的触发器U3里触发被外围的一个触发器接收。对外围电路而言它有一个T电路延时和外围触发器的建立时间。当确定了他们的延时之后被综合模块内部的输出路径延时范围也就确定下来了。假如时钟周期20ns输出延时5.4nsU3触发器的clk-q延时为1.0ns那么输入路径S的最大延时就是20-5.4-1.013.6ns。 设置输入延时是通过DC的set_output_delay命令完成的—— dc_shell set_output_delay -max 5.4 -clock Clk [get_ports B] 上面的语句指出了被综合模块的输出端口B的最大输出延时为5.4ns。-max选项是指明目前设置的是输入的最大延迟-clk是指出这个端口受哪个时钟周期的约束。 至此模块的面积、时钟、输入输出延时都施加了相应的约束。在施加了这些约束之后可以使用下面的几个命令检查约束是否施加成功——
report_port –verbose 报告在当前设计中所有的输入输出端口属性和施加的约束值report_clock 报告当前设计中定义的时钟及其属性情况reset_design 删除当前设计中所有的属性值和约束(通常用在约束脚本的第一句)list_libs 列出内存中所有可用的库
二、环境属性 在上一节中我们主要讨论了怎样电路中加入时序约束如设置clock周期、设置输入输出延时等但是仅仅靠这些约束还是不够的。因为还要考虑到被综合模块周围环境的变化举个例子说如果当外界的温度变化或者电路的供电电压发生变化时延时会相应的改变所以这些方面也是必须考虑到的。类似的上一节仅仅约束了输入输出的延时而没有考虑到他们的电平转化时间(transition time)这些是有输入输出的外围电路的驱动能力和负载大小决定的。另外电路内部的互连线的延时也没有估计在内。这一节我们主要讨论怎样给电路施加这些环境属性。 1、设置输出负载 为了更加准确的估计模块输出的时序除了知道它的输出延时之外还要知道输出所接电路的负载情况如果输出负载过大会加大电路的transition time影响时序特性。另外由于DC默认输出负载为0即相当于不接负载的情况这样综合出来的电路时序显然过于乐观不能反映实际工作情况。 设置输出负载是通过DC的set_load命令完成的。该命令有两种用法一种是直接给端口赋一个具体的值另外则结合另一个命令load_of指出它的负载相当于工艺库中的哪个单元的负载值。 例如下图给OUT1端口设了一个负载为5的值。这里的单位也是由Foundry提供具体的单位可以通过report_lib命令查看一般而言是pf。 采用第二种方法从下图中可以看出第一条语句说明OUT1端口接的负载值是my_lib中and2a0单元的A管脚的负载值。第二条语句则多用了TCL语言的表达式的语法它说的是OUT1相当于接了三个inv1a0单元的A管脚的负载值。一般后面的这种方法用的多些。 2、设置输入驱动 与设置输出负载类似为了更加准确的估计模块输入的时序我们同样需要知道输入端口所接单元的驱动能力。在默认的情况下DC认为驱动输入的单元的驱动能力为无穷大也就是说transition time为0。 设置输入驱动是通过DC的set_driving_cell命令完成的。set_driving_cell是指定使用库中的某一个单元来驱动输入端口。该命令是在输入端口之前假想一个驱动单元然后按照该单元的输出电阻来计算transition time从而计算输入端口到门单元电路的延迟。 dc_shell set_driving_cell -lib_cell and2a0 [get_ports IN1] 3、设置工作条件 工作条件包括三方面的内容——温度、电压以及工艺。在Foundry提供的工艺库里它的各个单元的延时是在一个“标准”(nominal)条件下得到的比如说温度25.0度、工艺参数1.0和工作电压1.8V。一旦工作条件发生了改变电路的时序特性也必将收到影响以上三方面的因素对电路时序的影响如下所示 在较为先进的工艺中会出现温度翻转效应即低温反而导致delay更大所以在使用库的时候要详细阅读库的说明。 从图中可以看出单元的延时会随着温度的上升而增加随着电压的上升而减小随着工艺尺寸的增大而增大。以上的这些工作条件的变化Foundry在建库的时候已经考虑到了因此它在工艺库中提供了几种工作条件的模型(operating condition model)以供设计者选择。这些工作条件一般分为三种最好情况(best case)、典型情况(typical case)以及最差情况(worst case)。我们为了以后能使电路正常的工作在上面的三种情况下在综合的时候就必需要将他们考虑进来。一般综合只要考虑到最差和最好两种情况最差情况用于作基于建立时间(setup time)的时序分析最好情况用于作基于保持时间(hold time)的时序分析。 在默认情况下Design Compiler不会自动指定工作条件我们可以先通过report_lib命令来列出在当前的工艺库里提供了哪几种工作条件—— 然后指定需要用到的工作条件在做建立时间分析的时候需要用到最差情况的条件: dc_shell set_operating_conditions -max slow_125_1.62 如果我们既要分析建立时间又要分析保持时间那么就要同时指定最差和最好情况: dc_shell set_min_library core_slow.db -min_version core_fast.db dc_shell set_operating_conditions -max slow_125_1.62 -min fast_0_1.98 其中core_slow.db和core_fast.db分别是最差和最好条件下的工艺库文件第一句话先用set_min_library设定作保持时间检查的库第二句话则分别对应了两种时间检查需要用到的工作条件。
4、设置连线负载模型 在DC综合的过程中连线延时是通过设置连线负载模型(wire load model)确定的。连线负载模型基于连线的扇出估计它的电阻电容等寄生参数它是也是由Foundry提供的。Foundry根据其他用这个工艺流片的芯片的连线延时进行统计从而得到这个值。 下面是一个负载模型的例子 这个例子可以通过命令report_lib得到它是ssc_core_slow这个工作条件下的一个名为160KGATES的负载模型。其中时间单位为1ns电容负载单位为1pf电阻单位为1kΩ。从图中可以看出单位长度的电阻以及电容值DC在估算连线延时时会先算出连线的扇出然后根据扇出查表得出长度再在长度的基础上计算出它的电阻和电容的大小。若扇出值超出表中的值假设为7那么DC就要根据扇出和长度的斜率(Slop)推算出此时的连线长度来。 事实上在每一种工作条件下都会有很多种负载模型各种负载模型对应不同大小的模块的连线如上图的模型近似认为是160K门大小的模块适用的。可以认为模块越小它的单位长度的电阻及电容值也越小负载模型对应的参数也越小。 设置输入驱动是通过DC的set_wire_load_model命令完成的。 dc_shell current_design addtwo dc_shell set_wire_load_model -name 160KGATES 如上面的语句则设置了addtwo这个模块的连线负载模型为160KGATES。 另外我们也可以让DC自动根据综合出来的模块的大小选择负载模型这个选项在默认下是打开的。如下图所示当综合出的电路的面积小于43478.00时使用5KGATES的模型属于43478.00和86956.00之间时使用10KGATES的模型。 以上讨论的情况是一个模块内部连线的负载模型的估计。如果连线连接的是不同的模块那么它的负载模型又将怎么估计呢这就要用到连线负载模式(set_wire_load_mode)这个命令了。 连线负载模式一共有3种围绕(enclosed)、顶层(top)以及分段segmented。如上图所示一根连线连接了B2和B2两个模块这两个模块都位于TOP下的SUB这个子模块中
围绕模式是指连接B1和B2的连线的负载模型用围绕它们的模块的负载模型代替即用SUB的负载模型顶层模式是指用顶层模块的负载模型代替分段模式顾名思义分别根据穿过的三段的模型相加得到。如果要设置成围绕模式可以使用如下命令 dc_shell set_wire_load_mode enclosed 当然约束中时序约束还有很多需要详细了解会在其他文中介绍。。。