Mountain Notebook https://bbs.21ic.com/?108394 [收藏] [复制] [RSS]

日志

10 利用DC进行综合设计

已有 3295 次阅读2008-9-22 11:14 |个人分类:ASIC|系统分类:网上好文







10.1预备知识


10.1.1DC的综合术语


用于设计的ASIC的EDA工具往往是一套很复杂的软件,包括大量的工具和文档。同时,每个公司都有自己的一套术语。只有理解了这些术语的含义才能很好的掌握这些工艺。


1 设计和设计对象


设计是实现一定逻辑功能的电路的描述。


设计对象就是在设计中被DC命令、属性和约束操作或控制的对象。常用的设计中包括元件、网络、端口、引脚和时钟。另外,一个设计可能包括某个相同子设计或库元件的多个例化。这时候被例化的设计或库元件称作参考。


在一个设计中查找某个对象的命令:find,这是在DC命令中很常用的命令。如:


列出当前设计的所有端口(ports):Dc_shell>findport OR find(port,”*”)


列出所有包含”DW”字母的元件:dc_shell>find (cell,”*DW*”)


列出cba_core库中的AN2门的所有接脚:dc_shell>find(pin,cba_core/AN2/*)


 


2 和时间有关的术语


时间路径:一般以基本输入端口或寄存器的时钟端口为起始点,而基本输出端口或寄存器的数据端为终点。


时间路径包括以下几种:


基本输入到寄存器,这类的路径通常可以通过定义时钟和相对于时钟的输入端口延时来设置约束。


触发器到触发器,这类路径的约束比较简单,只要定义了触发器的时钟就可以确定。


触发器到输出,这类路径可以通过定义时钟相对于时钟的输出端口延时来设置约束。


基本输入到基本输出,要设置这类的约束,我们需要设置其输入端口相对于时钟的时延和输出端口相对于时钟的时延。


建立时间,规定了信号到达有效时钟沿之前至少应该稳定有效的时间。


保持时间,规定了信号在有效时钟沿之后必须持续稳定的一段时间。


延时段,是指路径延时的最小组成部分,通常是网络和元件的延时。路径的延时就是改路径中所有延时段的延时之和。


时间容限(slack),时间容限是路径延时要求和时间延时的差值,它反映了实际延时满足延时要求的情况。如果这个值为正,则实际的路径时延满足了要求。如果为负则没有满足要求。另外,这个值的大小反映了时间的冗余程度。如果路径的延时大于最大延时要求,则称为建立时间违反(setup violation),因为这时已经无法满足建立时间的要求;如果路径延时小于最小时延的要求,则称为保持时间违反(hold violation),因为这时已经无法满足保持时间的要求。


关键路径:关键路径是指违反时间约束或时间容限或者时间容限很小的路径。这些路径是优化的重点。


最差时间违反(worst negative slack)和总的时间违反(total negative slack),最差时间违反指路径所需时间超过约束的最严重的情况;总的时间违反指每个路径终点对应的所有WNS的和。


 


10.1.2 DC的用户接口


用户接口就是用户使用DC功能,执行DC命令的途径。目前,DC提供了3中用户接口。


synopsys定义的命令语言接口


基于TCL的命令语言接口


Design analyzer图形用户接口(GUI)


DC_SHELL的概念


 


命令行用户接口又称为shell,它本来是一个操作系统的概念。Shell是软件中面向用户的层次,它使得用户可以和面向机器的部分进行交互。通常,我们把基于TCL语言的DC_SHELL模式称为TCL模式,把基于synopsys命令语言的DC_SHELL模式称为dcsh模式。在缺省的情况下,TCL模式的命令行提示符为dc_shell-t,而dcsh模式的命令行提示符为dc_shell。


我们使用dc_shell命令可以通过下面几种方式:


直接在dc_shell中输入单个命令


在dc_shell中执行命令脚本,命令脚本是一个包括dc_shell命令的文本文件,通常是连续执行一系列命令,完成一个给定的任务。一个脚本可以启动dc_shell,对设计执行各种操作、保存文件,退出dc_shell。


Design_analyzer命令窗口直接输入单个的命令,这样可以作为design analyzer 菜单接口命令的补充。


 


DC_SHELL的启动和退出


 


在UNIX系统下启动DCSH模式的dc_shell的方法,就是在系统操作符后输入命令dc_shell.启动TCL模式的DC_SHELL的命令就是dc_shell –tcl_mode。这个命令可以使用很多参数。具体请参照DC手册


在默认的情况下,DC启动时会执行一个启动文件:.synopsys_dc.setup。我们使用这个文件定义综合使用的库和一些综合的参数。当我们启动DC时,它会按照以下顺序在3个路径中查找这个文件:


Synopsys的根目录,在这个目录下的.synopsys_dc.setup文件称为系统范围的设置文件,它包含由synopsys定义的一些系统变量。这其中的设置会影响所有使用DC的用户。这个文件只有系统管理员才可以修改。


用户的根目录(home目录),在这个目录下的.synopsys_dc.setup文件称为用户定义的初始化文件,它包含了DC的工作变量。用户在这个文件中定义的变量确定了DC的工作环境。


启动DC的目录,这个目录下的synopsys_dc.setup文件时针对设计的初始化文件,是dc_shell启动时最后读入的文件。它包含影响当前目录中的设计的变量。要使用这个文件,必须从该文件所在的目录启动DC。通常,我们应该为每个设计建立一个工作目录,设置一个.synopsys_dc.setup文件。


 


如果这三个文件中有重复定义的命令和变量,那么最后出现的值将取代前面出现的值。因此,在设计工作目录里面的设置将取代在用户目录和synopsys根目录里面的设置。但是在使用DC前,应该确保这三个文件已经正确的存在,配置文件如下表所示。

 


下面的例子是一个.synopsys_dc.setup文件的一部分,它定义了综合使用的库和路径的情况:……….


Target_library=”tc6a.db”


Link_library={“*” ”tc6a.db” ”opcon.db”}


Symbol_library=”tc6a.sdb”


Search_path=search_path+”./unmapped”


………..


 


脚本(s)


 


一个命令脚本是一个包括了一系列dc_shell命令的文本文件。使用脚本文件,我们可以自动的执行一些dc_shell命令。在实际的综合过程中,我们很少是一次执行一个命令,而是通过脚本文件实现综合环境的设计、约束的设置、优化过程的执行和综合效果的分析。一个好的脚本文件往往可以大大提高我们的工作效率,充分发挥DC的功能。


使用命令脚本文件,我们可以:


更加方便的管理设计数据


在综合过程中把属性和约束保存在脚本文件中,然后使用这个脚本文件去驱动新的综合过程。


把一些需要的缺省值保存在脚本文件中,可以在其它脚本文件中重用这些设置


 


我们通常可以把一些常用的dc_shell命令保存在一个脚本文件中,以便在以后的工作中使用。通常,一个dc_shell 脚本文件会执行下面的功能:设置I/O变量读入设计,描述设计环境,检查设计和时钟,设置附加的优化目标,优化设计,把设计写入文件,分析综合结果。


下例是一个脚本文件的例子,它的功能是对设计tut1进行约束、综合,并报告综合的结果。


/***************************************************


对test模块进行约束,综合和分析的脚本


************************************************/


Read –format vhdl ./src/rtl/timer_tugw.vhd


Read –format vhdl ./src/rtl/test_top.vhd


 


/******************进行错误检查************************/


Check_error –v


If(dc_shell_status= =1){exit 1}


/*********************结束错误检查********************/


 


/******************链接***********************/


Current_design test_top


Link


 


/******************进行错误检查************************/


Check_error –v


If(dc_shell_status= =1){exit 1}


/*********************结束错误检查********************/


 


/************引入约束文件**************/


Include pass0/constraint/test_top.con


/******************进行错误检查************************/


Check_error –v


If(dc_shell_status= =1){exit 1}


/*********************结束错误检查********************/


/************设定约束(不包括约束文件内的约束)******************/


Set_max_area 0.0000


 


/**********设定扁平化*************/


Set_flatten false


 


/***********执行编译,综合************/


Echo”***doing full compile for the partition ‘test_top’***”


Sh date;


Compile –map_effort medium


/******************进行错误检查************************/


Check_error –v


If(dc_shell_status= =1){exit 1}


/*********************结束错误检查********************/


 


/***检查设计***/


Sh date;


Check_design


Compile_top_acs_partion=ture


Compile_top_all_paths=true


/***执行编译综合****/


Echo”***doing boundary compile for the partition ‘test_top’***”


Sh date;


Compile –top


Uniquify


/******************进行错误检查************************/


Check_error –v


If(dc_shell_status= =1){exit 1}


/*********************结束错误检查********************/


/*****输出结果,产生报告*********/


Sh date;


Current_design test_top


Write –format db –hierarchy –output pass0/db/test_top.db


Write –format verilog –hierarchy –output pass0/db/test_top.v


Write –format vhdl –hierarchy –output pass0/db/test_top.vhd


Report_timing> pass0/report/test_top.tim


Report_area> pass0/report/test_top.area


Report_constraints> pass0/report/test_top.cstr


Report_qor> pass0/report/test_top.qor


Report_constraints–all_violators–verbose>pass0/report/test_top.vio


/***退出****/


quit


脚本文件可以使用任何一个文本编辑工具产生或修改,也可以在dc_shell中执行write_scirpt命令产生。如,下面的命令就是将设计的属性和约束等信息保存到名为test.scr的脚本文件。


Dc_shell>write_>test.scr


脚本文件的语法应该符合dc_shell命令的语法。DC提供了一个语法检查工具和一个上下文检查工具,他们可以检查脚本文件的语法和脚本文件的错误,并提供相应的错误信息。


语法检查工具检查脚本文件的语法,但是不执行其中的命令。语法检查实现的功能包括:检查预先定义的命令参数是否正确,检查必须的参数是否存在、文件重定向问题、检查引用文件中的命令的语法、按照dc_shell正常的使用方式执行赋值。要使用语法检查,我们必须对该功能进行使能,此后每次引用或执行脚本前就会首先进行语法检查。在dc_shell中使能语法检查功能的方法如下:


Dc_shell>syntax_check true


Syntax check on.


上下文检查工具检查上下文的错误。在执行一个脚本文件前,我们应该对其进行上下文检查。上下文检查在检查每个命令的语法的同时,还会读入设计、检查设计和库文件是否有效、文件设法齐全等。其执行具体的功能包括:检查设计对象和属性的合法性,检查用户定义的属性,检查变量是否存在,检查条件语句的条件,检查循环语句,读入需要读入的文件,根据命令重定向文件,检查库和库对象。要使用上下文检查,我们必须对该功能进行使能,此后每次引用或执行脚本文件前就会进行上下文检查。使能命令如下。


Dc_shell>context_check true


Context check on.


最后,脚本文件的执行是比较简单的,可以通过两种方法:


在dc_shell中,应该使用include命令执行脚本文,include<file name>


在启动dc_shell时,可以使用-f选项执行脚本文件,dc_shell –f <file name>


在执行脚本前,如果我们激活了脚本语法检查和上下文检查,那么就会先进行相应的检查。


10.2准备HDL文件


输入DC的文件通常是HDL文件,HDL的代码质量将直接影响综合的效果,因此在编码中必须考虑设计数据管理、设计划分和HDL代码的风格


10.2.1数据文件管理


首先,由于综合过程中需要大量的数据和多种文件,因此数据的管理就显得非常重要。这种管理通常设计两个部分,设计数据控制和数据组织。控制设计数据主要是控制数据的创建、维护、覆盖和删除等。这和软件工程中的版本控制是基本一致的。在DC中对于不同类型的的文件,一般有约定的扩展名。在控制数据的同时还必须注意对数据合理有效的组织,一般,在使用DC综合的时候,我们都会使用层次化的目录结构来存放数据文件。相对于不同的综合策略,我们也有两种不同的目录结构。


可以看出,在应用自顶向下的综合策略时,由于综合是从顶层模块开始一次到各个模块,所以只需要一个综合目录。而自底向上的综合则现对各个模块进行综合,因此可能有多个综合目录。


10.2.2设计划分


对设计的合理划分可以改善综合的结果,减少操作的时间,简化约束文件和脚本文件。划分直接影响设计中模块的大小,如果模块太小,相当于人为的制造了一个界限,将限制DC有效的进行优化。另一方面,如果划分的模块太大,则会增加综合消耗的时间。


在划分的时候还要考虑设计的重用性,主要应该注意以下几点:详细定义并记录设计的接口,尽可能使接口标准化,编写参数化的代码。


通常,我们设计的划分一般使用以下策略:


(1)将相关的组合逻辑划分在一起


(2)消除胶连逻辑


(3)模块的输出都应该使用寄存器


(4)按照设计目标进行划分


按照编译技术划分,将设计中使用不同编译技术的部分划分到不同的模块。特别使当设计中既有高度结构化的逻辑(ALU),又有随机逻辑时,应当将他们分开。因为对于结构化的逻辑应该使用结构化编译,而对随机逻辑,应该使用扁平化的编译。


可以将共享的资源划分到一起


将用户定义的资源和他们驱动的逻辑划分到一起,用户定义的资源包括用户定义的函数、过程、宏单元和designware元件。DC对于这些资源无法自动实现共享和复制。因此,将他们和它们所驱动的逻辑放在一起,我们就可以手工的插入多个元件来增大驱动能力。


把顶层逻辑分成至少3级,将一些特殊的功能独立出来,如管脚、时钟、边界扫描和异步逻辑等。


如下图所示,一般情况下,设计的最顶层是I/O管脚。下一层包括边界扫描、时钟处理、异步逻辑和核心逻辑。增加这一层是为了I/O管脚例化的灵活性.将时钟处理独立出来是为了对这部分进行详细的分析仿真。将异步逻辑独立出来是为了可测性和静态时序分析的问题限制在一个比较小的范围之内。


设计划分的方法分为HDL划分和DC中的划分。HDL的划分就是根据上面一些原则通过HDL代码对设计进行划分。而DC中的划分是在DC中通过使用专门的命令,改变HDL中的划分和层次的结构。DC中提供了两个与此相关的命令:group,ungroup 。


 


2.3 确定设计库


综合之前必须设定链接库、目标库、符号库和综合库。连接和目标库属于工艺库,它们定义了半导体生产厂的工艺元件和其它信息。符号库定义用于design vision 或design analyzer 中的元件的符号表示


确定这些库是使用DC进行综合的前提条件,因此我们必须掌握DC中库的命令的使用,以便DC可以正确的使用库中的数据。


10.3.1工艺库


工艺库包括描述每个单元的功能和特性的信息。工艺库由半导体厂商提供和维护。


元件库包括元件名称、元件接脚名称、面积、时延信息、接脚负载。同时工艺库还定义了实现设计功能必须满足的条件。这些条件也可以称作设计规则约束。除此之外,工艺库还确定了工艺的工作条件和线载模型。


工艺库在DC中有下面一些用途:


(1)实现设计的功能,在dc综合过程中要将设计映射到某个工艺库,他们称作目标库。目标库包括了所有用于生产网表的元件以及设计工作条件的定义。


(2)解析元件参考,在dc中用于解析元件参考的工艺库称为链接库。链接库中除了工艺库外还可能包括设计文件。


(3)计算时延和路径延时,链接库还定义了用于计算时延值和路径延时的时延模型


(4)计算消耗的功率


10.3.2设置库变量


在使用dc综合之前我们必须对库进行设置。具体的方法是使用dc_shell中的变量来确定各种库。变量和库文件的定义见下表


在确定库的位置的时候,我们可以使用完整的路径也可以只用文件名。如果只确定了文件名,DC会在search_path变量确定的搜索路径中查找这个文件。


在设置工艺库和链接库的时候要注意:链接库包括了工艺库和设计文件。因此,link_library变量的值是工艺库加上一个星号“*”,表示链接时,DC既搜索工艺库,也搜索调入内存中的设计文件。


除了设置库变量,DC还支持各种对库的操作,如:读入和保存库,列出使用的库,显示库的内容,确定库的对象甚至直接对库对象进行操作。如下为一个工艺库的例子:


Cell(AND2 3)//元件名称


(area:8.000;//元件面积


Pin(Y)(direction :output;


Timing()(


Related_pin:”A”;


Timing_sence:positive_unate;


Rise_propagation(drive_3 table_1)(values(“0.2626,0.2607…..”)) //接脚延时


Fall_progpagation(drive_3_table_3)(values(“0.1316,0.1331….”))


)


……..


)


Timing()(related_pin:”B”;


……………..


)


:”A&B”;//接脚的功能描述


Max_capatiance:0.00220


Min_capatiance:0.00220 //输出引脚的设计规则


)


Pin(A)(direction:input;


Capacitance:0.012000;)


Pin(B)(direction:input;//输入引脚的电器特性


Capacitance:0.010000;)


)


10.4 DC对设计的一些操作


10.4.1读入文件


下表列出了DC支持的所有文件类型


对于设计文件,可以使用两种方法读入。使用read_file命令或使用analyze和elaborate命令。这两种方法有一些区别。简单的说,前一种适用于各种类型的文件,而后一种主要用于综合VHDL和verilog文件。但是使用后者有一些特殊的功能。具体说来,analyze的功能包括读入HDL源文件,检查错误,产生独立于HDL的中间类型的HDL库对象,存储中间文件。如果一个设计执行的analyze命令,只需要在这个设计改变之后再执行该操作。Elaborate命令根据analyze产生的中间文件产生一个与工艺无关的设计。这个操作还将HDL中的算术操作用于DESIGN WARE 库中的元件替代,同时确定总线的宽度。


当设计读入内存之后,它将转换为synopsys内部数据库的格式。DC之后的综合优化过程都是对内存中的设计执行的。


(1)链接


对于一个完整的设计,必须把所有的库元件和他们对应的设计参考链接起来。对于每一个设计,还必须有一个参考来衔接子设计和链接库。这一过程称为链接设计或参考解析。换句话说,链接就是要在链接库中找到设计中使用的所有元件和子设计,保证设计的完整。如果不能正确的链接,则无法进行以后的综合等操作。


DC通过一下步骤完成参考解析:首先,它确定哪个库元件和子设计在当前的设计中被使用。然后,它在链接库中定位这些参考。最后,把定位好的参考和设计链接起来。如图。


链接的操作可以自动进行,也可以手工完成。当使用一些DC命令,如compile时会自动进行链接。如果需要,也可以使用link命令进行手工链接。


(2)对设计和设计对象的操作


这些操作时DC中的一些基本操作,和其它EDA软件中的操作类似,如生成新设计、拷贝设计、重新命名等。其中比较重要的有以下几种:



  • 设置当前设计。在DC中,我们应当注意当前设计的概念,因为大多数的命令都是针对当前设计进行的。一般说来,如果成功的读入了一个设计之后,这个设计就会作为当前设计。另外,如果指定了一个当前设计,可以使用current_design命令。
  • 列出设计和设计对象。使用list_designs命令来列出内存中的设计,其中带“*”为当前设计。下表也列出了显示设计对象信息的一些命令。



    改变设计的层次,在DC中我们可以改变HDL所描述的设计层次关系。首先,使用report_hierarchy命令可以显示设计当前的层次关系。然后,使用group可以将一些元件或子设计组合起来,增加一个逻辑层次。或使用ungroup名去掉一个逻辑层次。

编辑设计,使用下表列出的命令可以对设计对象进行编辑,如生成,删除等。


Creat_cell 生成一个元件


Remove_cell删除一个元件


Create_net生成一个网络


Connect_net 连接一个网络


Disconnect_net 断开一个网络


Remove_net 删除一个网络


Create_port 生成一个端口


Remove_port 删除一个端口


Create_bus生成一个总线


Remove_bus 删除一个总线


10.4.4属性的处理


属性描述了设计数据库中对象逻辑的电气、物理和其它特性。一个属性通常都是附加给一个设计对象并存储于设计数据库中。


DC中,我们可以设置和使用以下一些对象的属性



  • 整个设计
  • 设计对象,如时钟,网络和端口
  • 设计中的子设计或元件的例化
  • 工艺库,库元件

     属性有自己的名称、类型和值。属性一般有以下几种类型:串、数或是逻辑。属性可以是DC预设的,这些属性可以被DC识别;也可以是用户定义的。一些属性是只读的,其值由DC设置,用户无法修改,另一些是用户可以自己修改的。


例如,我们经常使用“dout_touch”属性,它可以付给网络,单元,端口或设计。而当我们需要设置这个属性的时候,需要专门的命令:set_dont_touch


而对于一般的属性,可以使用命令set_attribute来设置;


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)