当前位置:文档之家› 利用DC进行逻辑综合_中文版

利用DC进行逻辑综合_中文版

利用DC进行逻辑综合

一.综合流程以及约束的编写:

一般来说,集成电路的设计过程可分为前端设计(front end)和后端设计(back end)两个阶段。在前端设计阶段,根据用户需求,确定设计所要实现的功能和时序,并确定出具体的数字逻辑电路(schematic);在后端设计阶段,由电路逻辑图产生相应的电路版图(layout)。

1.1概述

芯片综合的过程:芯片的规格说明,芯片设计的划分,预布局,RTL逻辑单元的综合,各逻辑单元的集成,测试,布局规划,布局布线,最终验证等步骤。设计流程与思想概述:一个设计从市场需求到实际应用需要用运工程的概念和方法加以实现,这需要工程人员遵循一定的规则按一定的设计步骤进行操作。下面我们给出了一个设计工程通常的工作步骤(请参见设计流程图)。从图中可以看出对一个完整的设计流程来说,可以将工作划分为两个阶段:前段设计和后端设计。前端工作主要完成IC与通讯整机设计接口问题,以及整个IC的内部总体结构设计;而后端工作则主要是在前段设计的基础上,使用EDA工具,遵循设计流程,完成整个IC设计。

1.1.1逻辑综合简介

综合就是将设计的原始思想转化为可大规模生产的并可以执行预期功能的器件这一过程。长期以来,硬件描述语言(HDL)只是用于逻辑验证, 设计者不得不手工将HDL代码转化为逻辑图并且画出组件间的互连线用以产生门级网表。随着综合工具的改进,这些手工操作渐渐由工具替代了,设计人员可以由工具自动完成HDL代码到门级网表的转化,这项工作就是综合。

设计的抽象层级依次为:原始设计思想、器件的功能描述、设计的行为级描述、寄存器传输级(RTL)、门级网表、物理设备。

综合的益处有以下几点:可以提高工作效率、代码可复用性(可以通过使用参数化代码、构建好的逻辑块、重新定位新库等手段达到目的)、可验证性、可以更加抽象等等。

综合是由约束来驱动的。

①环境属性约束:PVT,线负载模型、模式。

②设计规则约束:面积,扇出,驱动,负载。

③时序约束。

设计流程图

综合是基于路径的。

设计编辑器(DC)通过使用静态时序分析来计算设计中各路径的时序。时序路径的种类有四种:输入到寄存器;寄存器到寄存器;寄存器到输出;输入到输出

1.1.2初始化文件及系统保留变量

工艺库一般由ASIC供应商提供,它必须与DC兼容以便用DC进行综合。单元综合的流程:综合的过程 = 转化 + 优化 + 映射。一般,设计的HDL源代

码经过转换得到GTECH中间代码文件,然后再经过优化和映射两个过程将GTECH中间文件转化为工艺库中对应的具体单元。GTECH中间文件与具体工艺无关,它只是相当于将HDL源代码利用连接库忠实的转换为门级的逻辑连接结构,如果遇到算符则使用DesignWare将算术表达式用相应的宏单元代替产生对应的门级结构。

关键变量的介绍:

1、target_1ibrary变量:是DC中保留的变量,这个变量指定的库是DC用来构建一个电路的。DC进行映射的几个步骤:设置它让它指向你的生产商提供的库文件。使用厂家提供的工艺库中的时序数据计算这些门的时序。从target_1ibrary指定的库中选择功能正确的门。设定目标库使用如下语句: set target _1ibrary “slow.db”

2、1ink_1ibrary变量:是用来解析设计参照的。 set link_library “* slow.db” *号代表DC内存,后面接着的是指定的目标库(如果这个变量没有加入目标库的名字则可能会存在单元不能解析的问题)。link_1ibrary中指定的工艺库的名字只与用做参照的单元库有关,在link_1ibrary指定的工艺库不是为了给DC做优化判断的。它主要用在综合的转换阶段用以生成GTECH中间文件。

target_1ibrary和link_1ibrary的不同:target_1ibrary指定的工艺库与设计者让DC做优化并与产生最终映射的单元库一致,而link_library指定的库是在DC转换阶段用以生成GTECH中间文件的。

3、search_path变量:可以给DC指定寻找文件时的的工作路径。解析时DC首先,寻找内存,然后寻找1ink_1ibrary变量指定的库文件。接着,DC寻找所有的search_ path变量中指定的路径。

4、symbo1_1ibrary:这个系统变量指定的库包括了工艺库中单元的图形slow.sdb,当使用图形化的前端工具时,它可以用来表示门级的逻辑图,如果不指定则工具使用默认的generic.sdb。

这些变量必须准确指定,否则可能产生意外的结果,灵活的使用这些变量可以可以大大减少工作量例如:你可以指定了一个标准单元库作为一个目标库(target_library),然后在link_1ibrary列表中指定压焊点工艺库以及所有其它的宏模块(RAMS、ROMs、etc.),这意味着用户将能够利用标准单元库出现的单元综合设计,然后再在设计中连接pads和宏模块的实例,如果压焊点工艺库被包含在target_1ibrary列表中,那么DC可能使用pads综合内核的逻辑。target_1ibrary名也应该被包含在link_1ibrary列表中,这很重要,因为如果link_library中没有target_library的内容,那么当把门级网表读入DC中时,DC将不能解析在网表中映射的单元,这种情况下DC产生警告信息,它不能解析

在网表中出现的单元的参照。目标库和连接库系统变量允许设计者更好的控制单元的映射,这些变量也提供了一种有用的途径,用它们来重映射门级网表使门级网表由一种工艺转向另一种,在这种情况下,link_1ibrary能够包含老的工艺库的名字,然而目标库能够包括新的工艺库的名字,重映射可以通过在DC中使用translate来进行。

DC工作时需要预先设定一些系统变量用以指示DC的综合工作,这些变量放在初始化文件中,启动DC程序时初始化文件按顺序起作用,后启动的可以覆盖先启动的。DC的初始化文件(.synopsys_dc.setup)在三处存放。初始化文件执行顺序位置依次为:第一顺序放在安装目录中SYNOPSYS/admin/setup/.synopsys_dc.setup它拥有DC的所有原始的初始化信息用户一般不改。第二顺序放在使用DC的用户根目录中,用来管理项目。可以设置通用的变量属性值。第三顺序放在启动DC的当前目录中,含有当前设计中需要的初始化信息。如果在当前目录中没有初始化文件,用户需要手工创建。 1.1.3设计对象和属性

Synopsys的EDA软件支持许多变量、对象、和综合流程中的各种属性,使用这些元素设计者可以写出强有力的综合脚本,完成自动综合的过程。因此必须熟悉这些术语。设计对象包括以下几个:

1)设计(Design):

设计就是完成一定逻辑功能的电路描述,设计可以是单独的一个描述也可以在内部包含其他的子设计,虽然子设计是当前设计的一部分,但是Synopsys将它们当作另外的设计来看待。

2).端口(Port):

一般就是指设计的输入、输出端,它是设计与外界联系的窗口。

3).时钟(Clock):

时钟的源可以是端口也可以是引脚,时钟的指定可以在库的内部也可以用dc_shell的命令来实现。

4).连线(Net):

连线可以将端口或引脚相互连接起来实现设计的组装和电路的连通。5).参照(Reference):

它是一个单元/实例参考的原始设计。例如,网表中的叶单元必须参考连接库找出完成单元功能的参照,类似的,一个实例的参照就是完成该实例功能的一个子设计。

6).单元(Cell):

它是子设计在设计中的实例(instance)名,在Synopsys术语中单元和实例不区分对待,它们都是单元。

7).引脚(Pin)

它是设计内部单元的输入、输出端,与端口不同的是,端口是设计用来对外

联系的。

这是七类对象类型。不同类型的对象可以使用相同的名字。如果要在在dc_ shell-t中发现对象可以使用以下命令:

get_designs:可以得到指定的设计。

get_cells:可以得到指定的单元。

get_nets:可以得到指定的内连线。

get_ports:可以得到指定的端口。

get_clocks:可以得到指定的时钟。

all_inputs:可以得到所有的输入端口。

all_outputs可以得到所有的输出端口。

与自然界的事物类似,设计对象也有它们自己的属性,这些属性保存了相关对象的特征信息。一般DC会预定义对象的一些属性,设计者可以针对实际情况为对象指定属性或得到相关属性。有些属性由DC单独拿出作为预定义的属性,例如:设计的dont_touch属性由专门的命令set_dont_touch指定,使得具有这个属性的设计在DC做优化时不再考虑。得到属性或设定属性也有专门的命令: set_attribute

这条命令可以为给定对象的具体属性指定相应的值。

get_attribute

这条命令可以得到给定对象具体属性的相关值信息。

在综合以前设计必须以RTL格式进入DC的内存(虽然,其他格式也可能存在)。读入设计后DC会根据用户写的约束脚本自动对设计进行综合。

写约束脚本书的步骤:

读入设计。(read_verilog design.v)

对设计进行约束。

对设计进行综合。

产生报告检查设计。

保存设计。(write –format db –output design.db)

运行脚本使用命令:source scp.tcl

1.2时序约束

如何根据设计要求加约束:约束一般包含了一个设计必须要满足的条件,通常在对设计加约束时需要反复的操作。下图给出了加约束的流程。

约束包括对时序的约束、对操作条件的约束。

因为每个Wafer(晶片)的面积是固定有限的,为了将电路能放在这个有限的区域中必须对电路的尺寸进行约束,所以使用面积约束。对面积的约束(set_max_area 100)

1.2.1基本原理

时序目标:同步设计

同步:数据来自时序设备,数据去向时序设备,并且各个寄存器时序的相位满足固定关系。

时序约束的各个路径(四种)

① 从输入到寄存器

② 从寄存器到寄存器的(内部)

③ 从寄存器到输出

④ 从输入到输出

寄存器的建立(setup)和保持(hold)时间

setup和hold时间是工艺库中指定的时序器件的特性参数。

电路必须满足setup/hold时间的要求数据才能稳定的接受和发送。

CLK

建立时间原理图

图中假定数据在一个时钟上升沿从DFF1的Q端发出,在下一个时钟上升沿从DFF2的D端捕获,那么数据经过组合逻辑的延迟到达D端必须要满足一定的要求。即数据不能太慢,否则在下一个时钟上升沿DFF2可能因为没有准备好而无

办法捕获数据。这时我们把这种情况叫做setup时间异常。

保持时间原理图

图中假定数据在时钟的一个上升沿由DFF1发出,要在下一个时钟的上升沿从DFF2捕获,数据经过组合逻辑的延迟到达DFF2的数据输入端,此时数据不能来的太快否则可能在同一个时钟上升沿两个触发器都会对数据起作用,那么,很可能新的这个数据会将DFF2的前一个捕获的数据冲掉,这时我们叫发生了hold 时间的异常。

因此,如果数据在一个时钟的上升沿从DFF1发出在第二个时钟上升沿用DFF2接受,那么,DFF2要能接受到稳定的数据必须满足以下要求:

1、数据从Q1到Q2不能太快否则DFF2上次接收的数据可能被冲掉(hold)

2、数据从Q1到Q2不能太慢,否则DFF2的时钟到来时可能数据无法接收(setup)所以我们引入以下两个名词:

a).数据到达时间(data_arriral_time):

就是数据到达下一级寄存器时相对于上一个时钟来说用了多少时间。它的计算方式是时钟从时钟源发起作为参照经过一定的延迟到达寄存器的时钟端,此时作为数据发送的参照,经过组合逻辑的若干延迟到达下一级寄存器的输入端,整个过程的总延迟时间即为数据到达时间。

b).数据需求时间(data_required_time):

就是理论上数据在这个时间到达寄存器恰好可以正常工作的时间值,setup 与hold计算data_requirel_time的取用值是不同的,计算setup的数据需求时

间时数据的延迟时间要尽量大一点,计算hold则相反。它的计算方式是时钟从时钟源发起作为参照经过一定的延迟到达寄存器的时钟端,再扣寄存器的setup/hold时间即得到了理论上的数据需求时间。

c).时间裕度(slack)

就是数据到达时间在满足数据需求时间后宽裕下来的量值。

Slack setup=data_repuired_time setup – data_arrival_time setup >0

否则出现(violated)

Slack hold = data_arrival_time hold – data_required_time hold >0

否则出现(violated)

我们的工作是如何用各种办法消除这种异常,使设计满足时序要求。

1.2.2 Synopsys工艺库与延迟计算方法

现今的EDA软件之所以可以进行综合及布局布线的自动化,正是由于各种工艺库的支持,Synopsys工艺库格式几乎成为了现今的工业标准,大多数布局布线工具对Synopsys的工艺库提供支持,对一个设计的综合来说,设计者对工艺库格式和延迟计算方法的理解是成功综合的关键。

很多设计者不太关心工艺库的各种细节,认为只要库中包含了各种单元,DC可以自动完成综合的全过程,其实不然,为了成功的优化一个设计,设计者必须清楚DC如何计算路径的延迟,这通常需要查看库中的各种线负载模型和单元的描述。因此,我们在这里讨论一下Synopsys工艺库的一些描述。

Sysnopsys工艺库是一个文本文件(通常具有扩展名.lib)它可以由库编译器(LC)编译生成一个二进制文件(具有扩展名.db),一般工艺库包含以下信息:

a)库型

b)库级属性

c)环境描述

d)单元描述

1.2.2.1 库型

库型定义了库的名字,接下来的是一系列对库的具体描述,它由一对花括号扩起,如下所示:

library(mylib) {/*start of library*/

…….

……

}/* emd of library*/

建议库文件名与库名统一。

1.2.2.2 库级属性

库级属性是库的全局属性,它使用一套语句对库的特性进行说明,其中包含工艺类型、日期、版本和应用于整个库的默认值。

如下所示:

library(mylib) {

technology(cmos);

delay_model :table_lookup;

date :“Feb 29,2000”;

revision :“1.0”;

current_unit :“1A”;

time_unit :“1ns”;

voltage_unit :“1V”;

pulling_resistance_unit :“1kohm”;

capacitive_load_unit(1.0,pf);

default_inout_pin_cap :1.5;

default_input_pin_cap :1.0;

default_output_pin_cap :0.0;

default_max_fanout :10.0;

default_max_transition :3.0;

default_operating_conditions:NOMINAL

in_place_swap_mode :match_footprint;

……

……

}

1.2.2.3环境描述

环境描述定义了库中个模式变量的值,如:温度、电压、和制造工艺等。它由比例因数(scaling factors)、时序范围模型(timing range model)和操作条件(operation conditions) 三部分组成。另外,环境描述还包含线负载模型(wire-load model)的定义。这种模型在DC估算内连线的线延迟时使用。 1.2.2.3.1比例因数

比例因数或K因数是一系列系数,它们的引入是为了调整一些相关的延迟值,这些延迟值往往会因为PVT(工艺、电压、温度)的改变而改变。

如下所示:

k_process_fall_transition :1.0;

k_process_rise_transition :1.2

k_process_fall_propation :0.4;

k_process_rise_propagation :0.4;

k_temp_fall_transition :0.03;

k_temp_rise_transition :0.04;

k_temp_fall_propagation :1.2;

k_temp_rise_propagation :1.24;

k_volt_fall_transition :0.02;

k_volt_rise_transition :0.5;

k_volt_fall_propagation :0.9;

k_volt_rise_propagation :0.85;

1.2.2.3.2时序范围模型

时序范围模型提供了一种附加的计算信号到达时间的能力,信号的到达时间基于具体的操作条件。在DC进行设计优化判断时,Synopsys提供这种能力允许操作条件在一定范围内波动,并且在时序分析期间DC使用时序范围估计信号的到达时间。

如下所示:

timing_range(BEST) {

faster_factor :0.5;

slower_factor :0.6;

}

timing_range(WORST) {

faster_factor :1.2;

slower_factor :1.3;

}

1.2.2.3.3操作条件

操作条件的集合定义了一套关于工艺、温度、电压、和RC树模型的值,这

些值用于设计的综合和时序分析期间。一个工艺库正是使用这一整套操作条件来刻画它的特性。在综合和时序分析期间,如果指定了某一个操作条件集,那么DC 使用K因数来调整基于具体操作条件的延迟值。库的开发者可能会定义许多操作条件,下面列出典型的几个操作条件集。

operating_conditions(WORST) {

process :1.3;

temperature:100.0;

voltage :2.75;

tree_type :worst_case_tree;

}

operating conditions(NOMINAL) {

process :1.0;

temperature:25.0;

voltage :3.00;

tree_type :balance_tree;

}

operating conditions(BEST) {

process :0.7;

temperature:0.0;

voltage :3.25;

tree_type :best_case_tree;

}

这些属性中工艺、电压、温度前面已解释过了,我们着重看一看tree_type属性。tree_type属性定义了内连线模型使用的条件,DC使用这个属性值选择合适的公式计算内连线的延迟。最坏情况树(worst_case_tree)属性是一种极端的情况,这种情况假定负载的引脚与驱动连接端的距离是最远的,计算延迟时会将全部线电容和线电阻集中考虑(D c= R net*(C net+C pins))。平衡树(balanced_tree)模型则是把来自驱动的内连线电容电阻均分开再与引脚的负载电容合并计算(D c=(R net /N)*(C net /N+C pin ))。最好情况树(best_case_tree)模型,也是一种极端假设,假定负载引脚正好位于驱动端的附近。这时,驱动端与负载引脚间只有连线电容而没有连线电阻。因此,延迟为零。

1.2.2.3.4线负载模型

线负载模型包含的信息是版图设计前DC估算内连线延迟时使用的。通常,几种模型分别适用于不同的设计规模。这些模型定义了电容、电阻、和面积因数。另外,线负载模型中还包含了信号倾斜以及各种统计后的与扇出对应的线长值。

电容、电阻、和面积因数代表内连线的每个单位长度对应的线电容、线电阻、和面积。fanout_length属性定义的值是与扇出数相关联的线长。

如下所示:

wire_load(SMALL) {

resistance :0.2;

capacitance :1.0;

area :0;

slope :0.5;

fanout_length(1,0.020);

fanout_length(2,0.042);

fanout_length(3,0.064);

……

fanout_length(1000,20.0);

}

……

1.2.2.3.5 单元描述

在库中的每一个单元都有一个属性描述的表,表中包含与各个单元相关的功能、时序、和其他的信息。下面给出了一个单元的部分描述以供参考。

cell(BUFFD0) {

area:5.0;

pin(Z) {

max_capacitance :2.2;

max_fanout :4.0;

function :“1”;

direction :output;

timing() {

……

}

timing() {

……

}

related_pin :”I”;

}

pin(I) {

direction :input;

capacitance :0.04;

fanout_load:2.0;

max_transition:1.5;

}

}

1.2.3时序约束命令

在计算时序是否满足要求的时候,实际是把路径分为若干组来计算的,分组的标准是以到达终点寄存器的时钟来分,如果路径的终点具有相同时钟DC 把它当做一组来计算,如果要对一组路径的时序进行分析还需要对各路径加以约束,以下图说明(每使用一次create_clock 则创建一个组)。

TO_BE_SYNTHESIZED

因为上图中的各路径它们的参考时钟都是clk 所以应该是一组。

以下对这组路径加约束:(如果电路的工作频率是100MHZ setup=INS

则:create_clock_period 10

〔get_ports clk 〕

set_dont_touch_network 〔get_ports clk 〕

创建时钟这条命令会对寄存器之间的路径群X 产生约束,但对设计TO-BE-SYNTHESIZED 来说路径群N 与S 仍然没有约束,set_dont_touch_network 命令告诉DC 即使寄存器的负载非常大也不要对时钟网使用驱动和缓冲(时钟树在版图设计前时通常不在设计网表中表示,在做版图时基于物理布局由后端完成)

如何对N 路径群加以约束呢?(定义I/O 与时钟的时序关系)

这时必须提供输入路径的约束。

set_input_delay -max 4 –clock clk [get_ports A ]

这条命令作用后将考虑外部逻辑用了多少时间,DC 在计算时将会考虑到内部逻辑还剩多少时间。

如何对S 路径群加以约束呢?

这时必须提供输出路径的约束。

set_output_delay -max 5.4 –clock clk[get_ports B]

这条命令对输出路径作了约束。

在这里我们仍然必须指定外部逻辑需要多少时间。

DC会计算出内部逻辑还剩多少时间。

发送沿接受沿

数据内部传输

对输出路径的约束

几条报告命令的使用:

report_port -verbose:

这条命令将返回所有加在输入和输出端口的约束。

report_clock:

返回当前设计中所有时钟对象的周期、时钟源和占空比。

reset_design:

从当前设计中删除所加的属性和约束。

list_libs:

返回内存中可获得的库。

对时钟的几条约束:

创建一个时钟必须指定时钟的源和时钟周期,另外还可以指定时钟占空比,时钟偏移量、以及时钟名(若不指定则与port/pin名一致)。

如果指定由晶振到时钟树起点的时钟延迟则用:set_clock_latency -source来表示。如果不用这个命令而使用set_input_delay对一个时钟作用也可以产生相同的效果但不建议这样使用。从时钟树到具体寄存器的时钟输入端会产生一定的延迟,这个延迟用set_clock_latency –rise 1 [get_clocks clk]和set_clock_latency -fall 2[qet_clocks clk]这样的命令来指定。在版图设计完成后可以使用set_propagated_clock 这条命令由DC精确计算出时钟网的延迟。

在同步设计中因为时钟总是由一个源时钟产生通过时钟树到达具体寄存器的时钟输入端,不可避免时钟信号通过时钟树的分支到达各寄存器会产生相位的偏移,我们把这种偏移叫做uncertainty,指定了这个值意味着在时钟的uncertainty的时间区间内,时钟都是有可能到达的,这由命令set_clock_uncertainty 0.5 [get_clock clk]来指定(如果没有-max和-min 则在计算SETUP或HOLD时间时取用相同的值)。另外在寄存器内部从时钟端clk 到输出端q总有一个延迟,我们用命令set_clock_transition 0.2 [all_clocks] 来指定这个延迟,以便于DC进行优化时进行选择。

几条有用的命令:

remove_input_delay:

删除以前用set_input_delay指定的延迟。

report_lib:

显示工艺库和符号库上的信息。

remove_design:

从DC中删除设计或库的列表。

remove_from_collection:

从一个原始的collection集合中删除另一个collection集合中指定的对象并返回一个新的collection,但原始collection集合中的对象保持不变。 report_port:

返回当前设计中指定的端口信息。

1.3时间预算

有的时候在给各路径加约束的时候,并不清楚与他们相关的其它路径的信息,比如不清楚输入的延迟或是输出需要的建立时间,这时我们一般采用保守的预算对设计加约束。(如果所有输出都是寄存器,我们估算时间的时候将会变的更容易,这就是我们为什么在划分的时候希望以寄存器作为划分的边界)。

如:

create_clock –period 10 [get_ports clk]

set_dont_touch_network [get_clocks clk]

set_input_delay –max 6 –clock clk [all_inputs]

remove_input_delay [get_ports clk]

set_out_delay –max 6 –clock clk [all_outputs]

如果在编译前不知道输出负载和输入驱动单元,那么我们就必须进行负载预算。首先,假定在输入端有一个比较差的驱动单元(采用保守估算)

set_driving_cell

接着,限制每个输入端的输入电容

set_max_capacitance

load_of

还有要估计输出可能会驱动的最大逻辑块的数目

set_load

下例显示如何书写约束规则限制输入端的输入电容。

current_design myblock

link

source timing_budgen.tcl

#Assume a weak driving buffer on the inputs

set_driving_cell lib_cell inv1a0 [all_inputs]

remove_driving_cell [get_ports clk]

#limit the input load

set MAX_INPUT_LOAD [expr [load_of tech_lib/and2a0/A]*10]

set_max_capacitance $MAX_INPUT_LOAD [all_inputs]

remove_attribute [get_ports clk] max_capacitance

#Model the max possible load on the outputsassuming

#Outputs will only be tied to 3 subsequent block

set_load [expr $MAX_INPUT_LOAD*3] [all_outputs]

在设计中根据要求指定环境属性:包括指定温度、电压、线负载模型等等。为了准确地计算出输出电路的时序,DC需要知道被输出端驱动的电路的电容总

数。set_load命令允许用户指定输出端口上的外部负载电容。默认情况下,DC假定输出端口上的外部电容为零。用户可以指定一些其他的常量值或是用load_of 命令指定外部负载电容为工艺库中某个单元的引脚负载电容。

例如:

set_load 5 [get-ports OUT1]

set_load [expr [load_of my_lib/inv1a0/A]*3] OUT1

输入驱动能力的问题:

为了准确计算输入电容的时序,DC需要知道信号到达输入端口的转换时间。 set_driving_cell命令允许用户指定一个实际的外部单元驱动输入端口默认情况下DC假定外部信号的转换时间为0。

在输出端口上放置一个驱动单元可以让DC计算出输入信号在指定库单元的驱动下实际转换的时间。

库单元通常情况下使用“nominal”,电压/温度特性。但事实上操作条件不总是这样的,因此供应商允许电路综合时考虑的操作条件不为“nominal”而是工艺库中提供的某种操作条件。默认的条件下一个设计并没有指定操作条件,设计者可以通过report_lib libname命令列出厂家支持的操作条件,选定要求的操作条件后可以通过set_operating_conditions命令设定操作条件如:set_operating_conditions -max “slow_125_1.62”

如何计算连接线(net)的延迟:

线负载模型是一种统计的估算参数,它是基于扇出的关于net的RC寄生延迟。这种模型由厂家提供的库支持,模型中的估算值通常是由使用这种工艺制造出的很多器件中的net延迟的一组统计值。

首先,设定线负载模型的模式(两种)

如果,模式mode = top则设计内部的子设计也使用相同的线负载模型。(会穿越层级边界)

如果mode = enclosed则线负载模型不会对子设计产生作用

如下例:

set_wire_load_mode enclosed

接着指定线负载模型:

先看看库中支持那些线负载模型

report_lib sss_core_slow

将当前设计变量置为合适的设计

set current_design add2

指定线负载模型

set_wire_load_model –name 160KGATES

几条有用的命令:

reset_design

将设计的所有属性和约束清除。

remove_design –design从DC内存中删除设计

remove_design –all从DC内存中删除所有的设计和库

list_files列出所有的DC内存中的文件

list_designs列出所有在DC内存中的设计名

list_lib列出所有在DC内存中的库名

list_license列出所有能允许当前shell使用的功能

1.4时序分析(DC中的STA工具DesignTime)

时序分析的主要步骤:

1).将设计分成几个时序路径的集合。

2).计算每条路径的延迟。

3).检查所有路径的延迟看是否满足时序约束。

路径的分组:

每条路径有一个始点、一个终点,始点和终点的取值为,始点:输入端、触发器或寄存器的时钟引脚。终点:输出端、除时序器件时钟引脚外的所有输入引脚。时序路径以控制它们终点的时钟作为分组的参照。所以,每用一次create_clock 创建一个时钟将会产生一组路径。没有被任何时钟捕获的路径单独分为一组(default组)。

进行静态时序分析(STA)需要用到的参考数据:

1)、单元的延迟模型:(一般有两个表,每个单元通过查询表获得延迟的信息)延迟有线性和非线性两种,线性比较简单,非线性延迟的数据即是表的数据,因为输出负载电容和输入转换时间会影响单元的延迟和输出转换时间,而输出转换时间又可以作用于下一级单元的输入转换时间,所以表的内容如下图所示:

2)、线负载模型(它决定了线路R和C的数量)

在版图设计前估计线路的寄生电阻和寄生电容。

3)、内连线(net)的模型:

R-C的树模型有三种:最好情况树、平衡树、最坏情况树。树的类型表示了使用的内连线的模型。内连线延迟测量的是从驱动引脚的状态改变到每个接受单元输入引脚状态改变所要得延迟时间。乐观情况下:使用最好条件树,此时内连线延迟为0。默认情况下使用平衡树,这时扇出的每条负载线路的R和C都等值均分。D c=(R net /N)*(C net /N+C pin ),N=fanout。悲观情况下使用最坏情况树,这时RC的负载延迟被集中在一起。D c= R net*(C net+C pins)

4)、操作条件(Operating Conditions):

在进行STA时DesignTime根据工艺、电压、和温度等信息确定每个单元和

连线的延迟。

DesignTime的时序报告:

用户可以通过键入reporttiming命令来访问DesignTime每个时钟对应的路径组上存在的一条关键路径(Worse Violate)的时序报告,它将会把每组路径的关键路径时序信息显示到屏幕上。

DesignTime的时序报告有四个主要的部分:

1)路径信息部分。

2)路径延迟部分。

3)路径时序要求部分。

4)概要部分。

在对报告进行分析时,要仔细考察各个部分的详细说明。

几条命令的应用:

report_path_group

报告当前设计中个路径组的信息。

report_timing

报告当前设计的时序信息。

其后的各选项开关说明如下:

1.5对设计进行综合

综合包括转化、优化和映射几个部分,EDA工具会根据设计人员给出的约束规则,自动完成这项工作。

1.5.1对多时钟和多周期设计的综合

对于同步多时钟的设计而言所有的时钟都由相同的时钟源头产生。如果一个设计中某些寄存器的时钟端对应的时钟端口不一致,那么对一个端口可能产生多重约束。与单时钟设计的方法类似,多时钟设计分为以下几步:首先,定义时钟,必要的时候使用虚拟时钟。接着,指定相对于某一时钟来说的I/O延迟。这里,我们先澄清虚拟时钟的概念,虚拟时钟只是在输入或输出端做延迟计算时作为参照而引入的,在当前设计中,虚拟时钟没有指定与之相对应的时钟端口,但它可以被定义而存在于DC的内存中。引入虚拟时钟是为了更加准确的对当前设计加约束。这是因为往往当前设计的数据信号来源所使用的时钟与当前设计中定义的时钟不同,这样计算时序时如果按单一时钟来考虑情况可能太过于乐观了。DC在进行时序分析时,是以最保守的条件进行判断的也就是说 数据的发送沿和接受沿的时间间隔取最小,即,两个时钟的有效沿最接近的间隔来判断。虚拟时钟的创建很简单命令如下所示:

create_clock –name vclk –period 20

它有几点要求:第一它必需有名;第二它没有时钟的端口。因为创建的虚拟时钟没有给它指定时钟端也就没有默认的名字。多时钟输出的延迟与输入的情况类似都是按最保守的条件进行综合。如果输出的虚拟时钟有多个,则按其中条件最苛

文本预览