来自:《综合与 Design Compiler》
1. 什么是综合
在满足设计电路的功能、速度及面积等限制条件下,将行为级描述转化为电路网表的过程。
分为三个步骤:转换(translation)、映射(mapping) 与优化(optimization)。
综合工具首先将 HDL 的描述转换成一个与工艺独立(technology-independent) 的 RTL 级网表(网表中 RTL 模块通过连线互联),然后根据具体指定的工艺库,将 RTL 级网表映射到工艺库上,成为一个门级网表,最后再根据设计者施加的诸如延时、面积方面的约束条件,对门级网表进行优化。
2. DC综合流程
- 读入设计文件以及库文件:需要指定的库文件包括:工艺库(link library、target library)、符号库(symbol library)、综合库(synthetic library)。
- 定义设计环境:定义对象包括工艺参数(温度、电压、制程),I/O 端口属性(负载、输入驱动),wire-load 模型,设计环境将影响设计综合及优化结果。
- 设置设计约束:包括设计规则约束和优化约束,设计规则约束(DRC)由工艺库决定,在设计编译过程中必须满足,用于使电路能按功能要求正常工作。设计优化约束定义了 DC 要达到的时序和面积优化目标,该约束由用户指定,DC 在不违反设计规则约束的前提下,遵循此约束综合设计。
- 选择编译策略:top down:顶层设计和子设计在一起编译,所有的环境和约束设置针对顶层设计。bottom up:子设计单独约束,当子设计成功编译后,被设置为 dont_touch 属性,防止在之后的编译过程中被修改,所有同层子设计编译完成后,再编译之上的父设计,直至顶层设计编译完。
- 编译:用 Compile 命令执行综合与优化过程,还可以利用一些选项指导编译和优化过程。
- 分析及解决设计中存在的问题:DC可以产生一些报告以反应设计的综合和优化结果,如:时序、面积、约束等报告,这些报告有助于分析和解决设计中存在的问题以改善综合结果
库文件
- target_library:工艺库是综合后电路网表要最终映射到的库,读入的 HDL 代码首先由 synopsys 自带的 GTECH 库转换成 Design Compiler 内部交换的格式,然后经过映射到工艺库和优化生成门级网表。工艺库是由 Foundary 提供的,一般是.db 的格式。
- link_library:包含目标库之外的宏单元、IP核等常用模块。
- symbol_library:定义单元的图形库,可以用design_vision查看。
- syntehtic_library:是Synopsys公司提供的DesignWare库,包含许多运算单元和IP核,用于产生gtech网表。
设计对象
设计环境
- 工作条件——温度、电压以及工艺:
单元的延时会随着温度的上升而增加;随着电压的上升而减小;随着工艺尺寸的减小而增大。Foundry 在建库的时候在工艺库中提供了几种工作条件的模型(operating condition model)以供设计者选择。这些工作条件一般分为三种:最好情况(best case)、典型情况(typical case)以及最差情况(worstcase)。一般综合只要考虑到最差和最好两种情况,最差情况用于作基于建立时间(setup time)的时序分析,最好情况用于作基于保持时间(hold time)的时序分析。
- 端口属性:
设置输出负载 如果输出负载过大会加大电路的 transition time,影响时序特性。另外,由于 DC 默认输出负载为 0,即相当于不接负载的情况,这样综合出来的电路时序显然过于乐观,不能反映实际 工作情况。设置输出负载是通过DC的set_load命令完成的
设置输入驱动 在默认的情况下,DC 认为驱动输入的单元的驱动能力为无穷大,也就是说,transition time 为 0。设置输入驱动是通过 DC 的set_driving_cell命令完成的。set_driving_cell 是指定使用库中的某一个单元来驱动输入端口。该命令是在输入端口之前假想一个驱动单元,然后按照该单元的输出电阻来计算 transition time,从而计算输入端口到门单元电路的延迟
- 线负载模型:
在DC综合的过程中,连线延时是通过设置连线负载模型(wire load model)确定的。连线负载模型基于连线的扇出,估计它的电阻电容等寄生参数。可以认为,模块越小,它的单位长度的电阻及电容值也越小,负载模型对应的参数也越小。设置线负载模型是通过 DC 的 set_wire_load_model 命令完成的。
设计约束
- 设计规则约束:
- set_max_capacitance:set_max_capacitance 0.5 [all_outputs]:限制一个driver的output pin驱动的最大电容,电容包括它驱动的所有load pin上的cap和互连线上的电容。实际上,转换时间本质上取决于输出负载的大小(所以要优先修复capacitance),电容越大,转换时间越大(信号上升下降时间越长)。
- set_max_transition: set_max_transition 0.6 [all_outputs]:设置最大电平转化时间。一般来说修复max_transition会使得setup变好,hold变差。因为cell delay和input transition以及output load有关。当input transition变小时,cell delay也会变小。为了防止修复max_transition而导致hold出现violation,可以设置hold margin。当timing path的裕量大于hold margin时,PT才会修复max transition violation。
- set_max_fanout:set_max_fanout 16 [all_outputs]:扇出数直接影响负载的大小,从而影响转换时间。max fanout不是必须要修复的。在设计初始阶段,工具不知道cell的物理信息,初始的大Fanout结构会导致对时序估计太乐观。在设计最终阶段经过对各种violation的修复后,一般不存在大Fanout结构。
- 面积约束:
定义面积约束是通过 set_max_area 命令来完成的
- 同步时序约束:
定义时钟
在电路综合的过程中,所有时序电路以及组合电路的优化都是以时钟为基准来计算路径延迟的,因此,一般都要在综合的时候指定时钟,作为估计路径延迟的基准。定义时钟的时候我们必须定义它的时钟源(Clock source),时钟源可以是端口也可以是管脚;另外还必须定义时钟的周期。另外有一些可选项,比如占空比(Duty Cycle)、时钟偏差(Clock Skew)和时钟名字(Clock Name)。定义时钟采用一个语句 create_clock 完成——
第一句定义了一个周期为 10ns 的时钟,它的时钟源是一个称为 Clk 的端口。
第二句对所有定义的时钟网络设置为 don’t_touch,即综合的时候不对 Clk 信号优化。如果不加这句,DC 会根据 Clk 的负载自动对他产生 Buffer,而在实际的电路设计中,时钟树(Clock Tree)的综合有自己特别的方法,它需要考虑到实际布线后的物理信息,所以 DC 不需要在这里对它进行处理,就算处理了也不会符合要求。
设置输入输出延时
建立时间set_input_delay -max; set_output_delay -max
input_delay:
从上图可以看出,我们所要定义的输入延时是指被综合模块外的寄存器触发的信号在到 达被综合模块之前经过的延时,在上图中就是外围触发器的clk-q的延时加上M电路的延时(输入延时)。确定之后,模块内部输入延时就确定了。假如时钟周期是 20ns,输入延时是 4ns,内部触发器的建立时间为 1.0ns,那么就可以推断出要使电路正常工作,N 电路的延时最大不能超过 20-4-1.0=15.0ns;
output_delay:
上图中,信号在被综合模块的触发器 U3 里触发,被外围的一个触发器接收。对外围电路而言,它有一个T电路延时和外围触发器的建立时间(输出延时)。当确定了他们的延时之后,被综合模块内部的输出路径延时范围也就确定下来了。假如,时钟周期 20ns,输出延时 5.4ns,U3 触发器的 clk-q 延时为 1.0ns,那么输出路径 S 的最大延时就是 20-5.4-1.0=13.6ns。
保持时间set_input_delay -min; set_output_delay -min
input_delay:
需要设置外围输入电路最快到达被综合模块输入端口的时间,假设 CLK 周期 10ns,FF2 的保持时间为 1ns,输入最小延时 0.3ns, 那么可以写成——
可以推断出,此时 N 路径必须满足的最小延时为1ns-0.3ns=0.7ns。(Tc2q+Tm+Tn>=Thold(FF2)) -> Tn>=Thold-Tm-Tc2q
output_delay:
图中所示,FF4 是输出电路外围的一个触发器,它的保持时间是 0.5ns,T 路径的最小延时是 0.3ns,那么得到FF3所在电路的输出最小延时(set_output_delay –min)就要比较小心,它的计算公式不是0.5-0.3=0.2ns,而是 0.3-0.5=-0.2ns。这一点需要引起大家的注意,此时留给 S 路径的最小延时为 0.2ns。
设置最小输出延时的命令如下——
Tc2q+Ts+Tt>=Thold(FF4) -> Ts>=Thold-Tt
组合电路约束:组合电路有 set_max_delay 和 set_min_delay 进行约束
异步时序约束:异步多时钟网络和同步多时钟网络的结构类似,只是它的各个时钟 CLKA-CLKE 不是从同一个时钟源中分频产生的,而可能是不同的两个晶振。由于是不同的晶振产生的时钟,它们之间的就不存在最小公约数的关系,但是在默认情况下,DC 并不知道,它会认为它们是同步的时钟网络而尽量去找两个时钟之间的最小捕捉时间,不但浪费了时间而且会产生出不符合要求的电路。在这种情况下,我们需要告诉 DC不要管两个时钟之间路径的时序,这里需要用到一个命令——set_false_path。
多周期路径:实际电路中可能存在超过一个周期的路径:
FF1 和 FF2 之前,存在一个 BIG_LOGIC,假设我们允许它的延时在两个周期之内,那么因该怎样把这个信息告诉 Design Compiler 呢?这里就需要用到 DC 的一个设置多周期路径的命令——set_multicycle_path
第一个语句说明建立时间是在 FF1 触发后的第二个周期后检查,第二个语句说明保持时间在 FF1 触发后的第一个周期检查。
3. 编译
优化的三个阶段:
Design Compiler进行优化的三个阶段由顶层到底层分别是:结构级、逻辑级以及门级,在不同的阶段,DC 运用的方法和优化余地是不一样的。DC从结构级开始优化,最后到门级。门级阶段所要作的工作主要就是 GTECH 到工艺库的映射。
3.1 结构级优化:
- DesignWare 选择:DC 能够根据设计者施加的时序或者面积的约束在 DW 的不同实现方式中找到它认为最佳的实现方案。比如加法器有如下实现方式:
其中 DW Foundation 需要有专门的 license,而且使用之前还要设置综合库(synthetic library)。
- 共享子表达式(Sub-Expressions):这里的子表达式主要是指数学表达式,比如下面这个例子,如果按照原来的语句综合,会包含 6 各加法器,但是如果表达式之间的公共项提取出来,便可以大大的减小面积,如下图:
如果要直接综合出共享后的电路,可以在编写 RTL 代码的时候做逻辑共享:
- 资源共享(Resource Sharing):资源共享的原理与共享子表达式类似,只不过这里指的所谓资源是一些HDL的运算符和表达式,比如加(+)、减(-)、乘(*)、除(/)以及大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。
DC 会根据具体的约束条件综合出最符合要求的结构来。当然也可以在Coding阶段引导DC做选择。算术运算资源共享的默认策略是约束驱动的。我们也可以指示DC使用面积优化的策略。即将变量hlo_resource_allocation设置为area,即set hlo_resource_allocation area ,否则设成none。
- 运算符排序(Operator Reordering)
对于下面这个表达式:
如果几个输入信号到达的时间相同,DC 会通过运算符排序优化成下图的平衡的结构,减小延时。
如果 A 信号较迟到达,则综合出的电路结构会如下——
3.2 逻辑级优化:
在经过结构级优化之后,电路被转化成了工艺无关的 GTECH 库的形式,这级也称为逻 辑级,对于逻辑级优化来说,只有结构优化或者扁平优化:
- 结构优化:结构(Structuring)优化用共用子表达式来减少逻辑,这种方式既可用作速度优化又可用作面积优化。结构优化是DC默认的逻辑级优化策略。结构优化在作逻辑优化时,在电路中加入中间变量和逻辑结构。DC作结构优化时,寻找设计中的共用子表达式。例如,对于下面的电路,优化前为:
做完结构优化后,电路和功能表达式为:
值得一提的是逻辑级的结构优化中共用子表达式和前面结构级的共用子表达式是不同的,逻辑级的结构优化指门级电路的共用子表达式,结构级的是算术电路的共用子表达式。逻辑级结构优化并不会改变设计的层次.
用下面的命令设置结构优化: set_structure true
- 展平优化:展平优化把组合逻辑路径减少为两级,变为乘积之和(sum-of-products,简称SOP)的电路,即先与(and)后或(or)的电路(因为所有电路数字逻辑都是最小项的乘积和),如下图所示:
这种优化主要用作速度的优化,电路的面积可能会很大。用下面的命令设置展平优化:set_flatten true -effort low | medium | high
命令选项“-effort”后的默认值为low,对大部分设计来说,默认值都能收到好的效果。如果电路不易展平,优化就停止。如果把选项“-effort”后的值设为medium, DC将花更多的CPU时间来努力展平设计。如果把选项“-effort”后的值设为high,展平的进程将继续直到完成。这时,可能要花很多时间进行展平优化。
由于 DC 默认是用结构化的方式综合逻辑级电路,而且这种方式可以得到兼顾时序和面积的结果,因此我们可以先用这种方式优化。在优化后的电路中找出关键路径,看看关键路径上有没有符合使用 SOP 电路的模块,再将这些方便使用 SOP 的模块set_flatten,以便取得最佳的效果。
3.3 门级优化:
- 工艺映射:工艺映射包括组合逻辑映射和时序逻辑映射。组合逻辑映射是指 DC 使用工艺库中的各种门替换 GTECH 单元,并选择能实现相同逻辑的符合时序及面积要求的单元
时序功能的映射的过程为:DC从目标库中选择时序单元组成设计,该设计能满足时间和面积的要求,为了提高速度和减少面积,DC会尽量使用复杂的时序单元吸收一部分组合逻辑:
- 设计规则检查:工艺库中包括厂商为每个单元指定的设计规则。设计规则有:max_capacitance, max_transition和max_fanout。映射过程中,DC会检查电路是否满足设计规则的约束,如有违反之处。DC会通过插入缓冲器( buffers)和修改单元的驱动能力(resizes cells)进行设计规则的修整。修正设计规则的步骤如下所示:
4. 编译策略
4.1 中断编译:
DC进行进行优化的时候,如果下面的条件之一都满足了:
- 所有的约束都满足了;
- 用户中断(ctrl+C);
- Design Compiler到了综合结果收益递减的阶段,即再综合下去对结果也不能有多大的改善。
这时DC就会进行中断优化,停止综合。
4.2 分析报告,调整策略
一般情况下,我们先作一个默认的编译,这样一般可以取得既快又准确的结果,然后在编译完成后使用一些报告时序的命令,并分析它们的输出结果,使用的命令主要有——
report_constraint –all_violators
报告电路中所有没有满足的约束条件,包括设计规则、建立时间、保持时间以及面积。通常这应该是最先执行的命令。
report_timing –delay max
报告基于建立时间检查的关键路径,每一个路径组的关键路径都被报告出来。
3report_timing –delay min
报告基于保持时间检查的关键路径,每一个路径组的关键路径都被报告出来。
下面我们就几个常见的约束违反情况,谈谈纠正它的综合策略:
较大的时序违反:
一般而言,如果电路中的最大负裕量(简称 WNS)所占时钟周期的 15%以上的话,可以认为电路存在较大的时序违反。此时检查主要有一下步骤:
- 检查约束条件,看是否有疏漏或错误
- 检查模块划分,看组合逻辑是否穿过多个模块
- 重新编译优化后的网表,当重新读入映射后的网表进行重新编译时,DC 会自动将门级的网表重新返回到 GTECH 的结构,相当于逻辑级。然后分别进行逻辑级和门级的优化,但是同时也可以进行 DesignWare 的替换。如果设计者仅仅将映射后的网表拿来再做一次 compile,编译后的结果并不会不一定会比原来的好,无非把以前做过的优化再跑一遍。因此,重新编译之前会改变一些参数,如——改变设计约束、改变 set_structure 和 set_flatten 参数以及改变编译的 map_effort。
- 修改 RTL 代码
较小的时序违反
这里主要讲一下 Incremental Mapping.这个开关告诉 DC,在重新编译的时候不需要把网表返回到 GTECH 结构,因此也不需要作逻辑级优化,速度也较一般的编译更省时间。这里 DC 所要作的是进行门级单元的替换,即在不违反设计规则的情况下用延时小的单元替换延时较大的单元。另外,如果读入的是 db 格式的网表,在这个阶段也可以进行 DesignWare 的替换。
设计规则违反
有些时候的时序违反是由于设计规则违反引起的,比如说一个单元的扇出(fanout)过 大,导致它的 transition time 的时间迅速增加。对于这种情况,我们可以通过
两个命令审查连线的连接和负载情况。
要修正设计规则的错误,可以使用一个编译的开关
compile -only_design_rule
如下面这个例子,为了满足最大电容的规则,在 A 端口的内部加上了一个 buffer,用于 缓冲 N 路径对 A 的负载。
DC综合之后,我们查看详细的报告,如果没有违规,设计既能满足时间和面积的要求又不违犯设计规则,那么综合完成。可以把门级网表和设计约束等交给后端(backend)工具做布局(placement )、时钟树综合(clock tree synthesis)和布线(route)等工作,产生GDSII文件。一般我们把保持时间修正放在布局后。如果要在综合时考虑hold,添加set_fix_hold 约束。
5. 形式验证
形式验证是为了验证RTL代码与综合后的门级网表之间的逻辑等价性。功能是否等价,与时序无关。等价性检验除了验证网表和RTL,还可以检验网表和网表
形式验证在设计流程中的位置
- 在综合后:在综合的流程中通常会插入DFT,这样综合出的结果的逻辑关系可能会与RTL代码的等效逻辑不一致,因此利用利用形式验证来保证综合过程没有出错,逻辑正确。
- 后端布局布线后:使用综合网表和布局布线后网表进行比较。保证后端没有引入逻辑错误。
- ECO后:ECO后的网表与ECO后的RTL做形式验证。(ECO当芯片已经流片出去了,工厂只做了一个底层,但金属层还没做可以做metalECO,发现某些容易修的bug后可以利用一些冗余的cell改变某些连线来修掉这个Bug,修改后端网表的同时对RTL也进行相应修改,然后将这两个文件进行LEC比较)
EDA tool:formality
读入文件(Guid、Ref)
添加.svf文件:
DC改变了RTL代码的结构,但是逻辑没有改变。比如很调整组合逻辑的位置,但是最终的功能是一样的。写出一个文件的后缀名为.svf,该文件用于后面的形式验证。
读入rtl设计文件,read design file > verlog > load files
·设置DC工具路径:otpion>browse
读取db文件,read DB libraries> DB > load files
设置顶层文件:set top design > set top
Implementation
读入网表文件,read design file > verlog > load files
设置顶层文件:set top design > set top
Setup
设置常量
Match
验证Reference和Implememtion的逻辑功能是否匹配
match>run matching
可以看到match和unmatch的points
Verify
验证rtl和门级网表功能是否相同verify> verify
Debug
如果功能不一致,进行debug。
双击可以进去看到设计的原理图,进行对比debug。
TCL脚本运行
//run_form文件
source run_form
fm_shell -file form_check.tcl //后台运行
#fm -gui -file form_check.tcl //gui界面运行
//form_check.tcl文件
set_svf -append {/home/IC/soc/form_test/svf/test.svf}
read_verilog -container r -libname WORK -05 { /home/IC/soc/form_test/rtl/verilog_test.v }
set hdlin_dwroot /opt/Synopsys/DC2015
read_db { /home/IC/soc/form_test/db/fast.db }
set_top r:/WORK/verilog_test
set_top r:/FAST/ACCSHCINX2
read_verilog -container i -libname WORK -05 { /home/IC/soc/form_test/netlist/netlist_test.v }
set_top i:/WORK/netlist_test
set_top i:/FAST/ACCSHCINX4
match
verify
标签:set,验证,形式,DC,电路,延时,设计,优化,综合 From: https://www.cnblogs.com/fukq/p/17051993.html