综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是RTL CODE。很多人入门都用HDL做设计,就以为HDL就只是用来做设计的,没有看到HDL最初始的一面,所以在验证时,就无法用好HDL另外一部分强大的功能。有时间还是可以看看Writing Testbench这本书,增强对HDL语言在验证方面作用的了解,也是提高对HDL认识很好的补充。
       这里以Design Compiler为例子讲解综合的过程。
       首先,综合就要必须要用综合库,这个你可以向厂家要,综合库可以通过.lib这个库文件转变成.db综合库,这个过程可以在DesignCompiler里面用实现。
       综合库里面有什么内容呢?.db 是无法阅读的,.lib是可以阅读的,里面有库的基本参数的单位,库运行的条件,各种参数,最重要的是两个部分,一个是WLM-Wire Load Model,一个Gate的定义(输入输出,功能,时序参数,面积等等);这只是StandarCell的库,另外还有其他库,如RAM,DSP的综合库,都以.db的形式存在。        
      综合需要三种输入,一个是代码,一个是综合库,一个是综合脚本 script。
      综合脚本主要包括了一下内容,对综合工具环境的配置,对综合对象外部环境的设置(operation condiction),对WLD的设置,对综合对象的时序的约束,综合策略,综合优化,综合报告和输出。
      综合技术的研究可以追溯到20世纪60年代,IBM公司T.J.Watson研究中心开发ALERT系统,将寄存器传输级算法描述转化成逻辑级的结构实现;20世纪70年代,综合技术发展迅速,但主要致力于较低层次的逻辑综合和版图综合;20世纪80年代中期,专用集成电路的广泛应用,要求芯片设计大规模、高性能、短周期,大大推动了从算法级设计描速向寄存器传输级设计描述转换的高层次综合技术。
      逻辑综合负责将寄存器传输级的结构描述转化为逻辑层的结构描述,以及将逻辑层的结构描述转化为电路的结构描述。在数字IC设计领域常用的EDA综合工具中,最权威的要算Synopsys公司提供的综合工具。Synopsys公司提供的Design Compiler(DC)是业界流行的、功能强大的逻辑综合工具。用户只需要输入设计规格的HDL描述和时间约束,就可能得到较为优化的门级综合网表。此外,DC还集成了功能强大的静态时序分析引擎,并支持与后端布局布线工具交互工作。     
      从某种意义而言,综合就是将设计的HDL描速转化为门级网表的过程。Synopsys公司提供的综合工具DC把综合分为三个步骤进行:synthesis=translation+mapping+optimization。Translation是指把设计的HDL描述转化为 GTECH库元件组成的逻辑电路;GTECH库是Synopsys公司提供的通用的、独立于工艺的元件库。Mapping是指将GTECH库元件映射到某一特定的半导体工艺库上,此时的电路网表包含了相关的工艺参数。Optimization是根据设计者设定的时延、面积、线负载模型等综合约束条件对电路网表进一步优化的过程。从综合工具的使用流程来看,综合包括综合环境的设置,综合约束,综合优化,综合与后端流程等。
      综合约束用来设定电路综合的目标,它包括设计环境约束、时间约束和面积约束。
      设计环境约束指的是用来描述设计在工作时的温度、电压、驱动、负载等外部条件的一系列属性。基本的环境设置内容包括工作条件、负载模型、系统接口驱动或扇出能力等设置。这些属性约束在电路综合时是必须的,如果用户没有进行显示的说明,则DC在综合的时候会采用默认值。
      时间约束内容包括定义时钟、定义时钟网络的时间约束和时序路径时间约束设定,以及非同步设计的时间约束等。了解延迟的计算是定义恰如其分的时间约束的关键。 Synopsys公司支持几种延迟模型:一是CMOS通用的延迟模型,二是CMOS分段的线性延迟模型,三是非线性的查表延迟模型。深亚微米的设计,前两种模型并不常用,非线性的延迟模型以输入的迁越时间和输出电容负载为参变量计算延迟的时间值,其结果以表格的形式列出供DC查找.
      面积约束和时间约束之间是一对矛盾且需要折中的关系,DC综合默认为时间约束比面积约束拥有更高的优先级。DC优化时默认不进行面积优化,如果你关注于芯片的面积,可以使用set_max_area命令设定面积的约束,使得DC完成时序约束之后继续进行面积优化。 在设定综合约束之后,一般并不马上进行综合优化。因为对于一个较大的设计来说,综合一次时间很长。因此,综合前确认综合约束命令是否正确添加到设计中时很有必要的,可以减少由于综合约束不正确重新综合优化的风险,减少综合反复的时间。检查综合约束设置的命令有 report_design, report_port –verbose, report_clock [-skew], report_constraints, report_timimg_requirement 等。
      许多版图工具只接受Verilog或EDIF格式的综合网表作为输入。在综合后提供Verilog格式的网表送给后端的版图工具,IC工程师还必须对综合的网表做好一下处理:
1.彻底解决多次例化同一子模块的问题
2.修正设计中部分连线的命名以简化综合网表
3.删除整个设计中悬空的端口
4.确保每个实例化单元的引脚都是可见
5.避免网表中存在assign语句、传输门和三态连线的定义
6.避免网表中存在不必要的门控时钟或门控复位信号
7.避免网表中引用的实例化名不存在对应的实现逻辑
      在综合之后,我们还得对综合后的网表进行门级仿真,在门级仿真上Synopsys公司提供的VCS仿真工具在服务器上运行的速度是比较快的。门级仿真过程中还有一步就是带时序反标的时序仿真,通过DC或者PT写出SDF文件,在网表中将逻辑延迟和线延迟反标入电路中,模拟更加真实的情况。
      功能仿真及验证
      验证的目的视为了保证设计实现提供的功能特性是正确的,是与设计规范中定义的功能特性保持一致。验证的目的在于证明设计没有错误。然而事实上验证只能证明某些设计错误存在或者不存在,验证是一个穷举设计中可能存在的错误的过程。业界中存在着相当度的验证手段和验证的策略,其中主要的验证手段可以粗略地划分为功能仿真技术、静态时序分析技术、形式验证技术等。
      功能仿真与调试
      功能仿真是设计验证的主要形式。从仿真的抽象层次来看,包括基于事件(event based)的仿真,基于时钟周期(cycle based)的仿真,基于事务交易(tansaction based)的仿真。
     基于事件的仿真器把输入激励的变化认为是事件的触发,每一个仿真时间仿真器处理一个事件触发,根据事件触发的内容对整个设计重新计算直到一个仿真稳态出现为止。基于事件触发的仿真特点是同时覆盖了设计的功能和时序模型,仿真结果精确,它非常容易探测到设计中的毛刺电路,尤其适用于异步电路的仿真。
     基于时钟周期的仿真在一个时钟周期那没有时间的概念,它只在时钟的上升沿或下降沿进行触发,每一个时钟周期的时间对电路计算一次。
     基于事务交易的仿真以数据包、图形、语音等对象作为直接的仿真激励而不在是添加到设计引脚的激励波形。
     功能验证的方法主要有三种:黑盒法、白盒法和灰盒法。
     架构测试环境在软件仿真过程称作“writing testbenches”。Testbench通常是指这样的代码,它对设计进行恰当的配置、产生测试激励盒有选择性地观察地响应。Testbench一般用硬件描述语言Verilog HDL或VHDL实现,也可以包含C语言或者C++语言产生地激励数据加上PLI,现在业界还有专门地验证语言Vera和Specman E。
     静态时序分析简称STA(Static Timming Analysis),它提供了一种针对大规模门级电路进行时序验证的有效方法。它指需要更具电路网表的拓扑,就可以检查电路设计中所有路径的时序特性,测试电路的覆盖率理论上可以达到100%,从而保证时序验证的完备性;同时由于不需要测试向量,所以STA验证所需时间远小于门级仿真时间。但是,静态时序分析也有自己的弱点,它无法验证电路功能的正确性,所以这一点必须由RTL级的功能仿真来保证,门级网表功能的正确性可以用门级仿真技术,也可以用后面讲到的形式验证技术。值得注意的是,静态时序分析只能有效地验证同步时序的正确性,对于大部分设计重可能包含地异步电路的时序验证,则必须通过门级仿真来保证其时序的正确性。由此我们可以得出这样子的结论:静态时序分析和门级时序仿真是从不同的侧重点来分析电路以保证电路的时序正确,它们是相辅相成的。
     Synopsys公司的Prime time时序分析的工具,对设计电路进行以下几种分析:
1.从主要的输入端口到电路中所有触发器
2.从触发器到触发器
3.从触发器到主要输出端口
4.从主要的输出端口到主要的输出端口
      静态时序分析工具把整个设计电路打散成上述四种类型的时序路径,分析不同路径的时序信息,得到建立时间和保持时间的计算结果。当然还有另外几条路径:如 gated clock,DFF复位端的,具体可以参见PrimeTime的手册。  
      形式验证是一种静态的验证手段,它根据电路静态地判断两个设计在功能上是否等价,常用来判断一个设计在修改前和修改后其功能是否保持一致。它运行时无需测试向量,但是必须有一个参照设计和一个待验证的设计。参照设计时设计者认为功能上完备无缺的设计,理论上它可以用高级语言如C,C++实现的,也可以是用集成电路的建模语言systemC,或者验证语言vera或SpecmanE实现的;但是就实现而言,多数形式验证过程中参照设计就是我们的RTL设计,一般用verilog或VHDL实现的。
       当RTL级或FPGA功能仿真验证结束后,传统的IC设计流程需要完成一下几次门级仿真:综合后门级仿真;DFT之后的门级仿真;布局布线之后的门级仿真等,如果设计很大或者电路很复杂,往往需要庞大的测试向量来验证设计的功能及时序是否正确,这就使得我们花费在门级仿真的时间随着电路规模的增直线上升。
       形式验证在ASIC设计流程中犹如一个迭代算法,其最初的输入是RTL设计,每次比较,都将上一次比较后的设计(第n-1次)作为参照设计处理之后的结果(第n次)进行比较,之所以这么做,是基于以下考虑:
1.形式验证工具开始比较前,首先在两个设计中找到一一对应的比较点。
2.如果一个设计改动太大,改变前后的功能是完全一致的,但如果形式验证工具无法找到适合的比较点,也会认为这两个设计不等价。        形式验证在 ASIC设计流程中主要应用在以下几个方面:RTL-RTL的对比,RTL-GATE的对比,GATE-GATE的对比。采用形式验证进行RTL与RTL 的比较,可以在较短的时间内验证并保证代码修改的过程中没有引入功能性的错误;进行RTL与GATE的对比,是验证源代码与综合之后的门级网表是否等价,以保证综合过程中不会出现任何错误;进行GATE与GATE的对比,主要是发生在验证插入DFT后的电路网表在功能上是否一致;生成时钟树前后的电路网表在功能上是否一致;布局布线前后的电路网表在功能上是否一致等。 
      可测试设计与可测性分析(DFT)            
      什么是DFT,为什么要做DFT。
      可测试性技术(Design For Testability-DFT)就是试图增加电路中信号的可控制性和可观测性,以便及时经济地测试芯片是否存在物理缺陷,使用户拿到良好的芯片。其中包括Ad Hoc技术和结构化设计技术。目前,任何高集成度IC设计系统都采用结构化设计技术,其中主要扫描技术和内建自测两种技术。
      一个电路的测试性问题应两个方面:
1.由外部输入信号来控制电路中的各个节点的电平值,称为可控制性。
2.从外部输出端观测内部故障地难易程度,称为可观测性
     扫描技术是指电路中的任一状态移进或移出的能力,其特点使测试数据的串行化。比较常使用的是全扫描技术和边界扫描技术。全扫描技术是将电路中的所有触发器用特殊设计的具有扫描功能的触发器代替,使其在测试时链接成一个或几个移位寄存器,这样,电路分成了可以进行分别测试的纯组合电路和移位寄存器,电路中的所有状态可以直接从原始输入和输出端得到控制和观察。这样子的电路将时序电路的测试生成简化成组合电路的测试生成,由于组合电路的测试生成算法目前已经比较完善,并且在测试自动化生成方面比时序电路的测试生成容易得多,因此大大降低了测试生成的难度。
     对于存储器模块的测试一般由生产厂家提供专门的BIST电路,通过BIST电路可以方便地对存储单元地存取功能进行测试,所谓的BIST电路是指把测试电路做到IC里面,利用测试电路固有的能力自行执行一个测试存储器的程序。另外MBIST还可以解决RAM SHADOW的问题提高芯片的可测试性。
      为什么要做DFT呢?因为我们的设计,也就是RTL到GDSII交出去的只是一个版图,最后芯片需要生产织造是在foundry做的,也就是厂家根据你提供的数据GDSII做成芯片。这个流程过程中可能出现缺陷,这个缺陷可能是物理存在的,也可能是设计当中的遗留问题导致的,另外一方面在封装的过程也可能出现缺陷。为了保证我们的芯片能够不存在物理上的缺陷,所以就要做DFT。也就是说,你交给foundry一个加法器的GDSII,他在做的过程和封装的时候都可能引入缺陷;拿到这个加法器芯片你怎么知道,里面的一个与门,厂家给你做的就是一个正常工作的与门呢?你怎么知道厂家做好的加法器的dier在封装之后引脚就能正常输入呢?一句话,就是通过DFT!如何做DFT呢,就是上面提到的拉。
05-11 09:36