本文如果有错,欢迎留言更正;此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner
主要内容有:
·启动环境的概述
·路径变量的定义与解释
·库的指定与解释
(1)启动环境配置简述
我们按照前面的基本流程使用DC进行设置,但是这里主要使用的是脚本,因此不能一条一条命令进行演示其效果。在启动DC之前,首先要配置DC的启动环境,也就是那些库的设定。配置DC的启动环境主要是.synopsys_dc.setup配置文件的书写。.synopsys_dc.setup这个文件就是DC的配置文件,它配置了DC启动过程中要执行哪些命令、干哪些事。其中,search_path 、target_library...等等(后面会讲,放在这里给大家留个印象),这些是DC内部的变量名称,用来告诉DC做那些事的方法。
一般.synopsys_dc.setup 文件有三个:①一个在synopsys的安装目录下,这个文件最好不要动;②一个在用户目录下,这个文件没事也不要动他;③还有一个当前工作目录下,也就是启动DC的目录下(没有就需要自己创建),这个是要我们自己写的,这个想怎么动就怎么动。我们配置DC的启动环境,就是在启动的目录创建.synopsys_dc.setup并且修改它。
此外,这个文件名字不能随意更改,按照默认的名字来,DC在启动的过程中会自动读取各个名字的文件。(如果改变了它的名字,就需要通过source命令source一下)。
(2).synopsys_dc.setup配置文件的书写
如下图所示,一般设计的的目录文件夹管理:
主要关注两个文件夹,一个是rtl:放置.v设计文件,一个是syn文件夹:综合时的信息。
进入综合文件夹:
有5个文件夹,mapped是存放综合完成之后的文件的目录,这些文件是经过综合库映射的。Unmaped是存放综合时没有经过工艺库映射所得到的文件目录。
Report是存放报告(比如时序报告、面积报告、DC启动报告等)的目录。Script是存放约束脚本的目录。Work就是启动DC的目录了,在这个目录里面,我们要进行创建.synopsys_dc.setup文件并且编写这个文件:
文件的内容主要是指定这个四个库(的名称和路径):
当然这个不是这个文件的全部内容,这个文件的全部内容如下(后面有这个文件内容的讲解):
(3).synopsys_dc.setup的讲解
简单的.synopsys_dc.setup文件如上图所示了,总共79行。Echo那些行都是在终端打印相应的信息而已,提供我们判断DC是否按照我们设定的环境进行启动以及启动到哪一步。“#”开头的是注释部分。31行(包括31行)之前的set语句是进行定义变量,也就是把路径用变量来代替,在进行设置库的时候,就可以使用这些变量,而不是用长长的路径了,同时也让别人了解你这个路径是什么意思。依次定义:
①设计目录(SYN_ROOT_PATH)的路径:也就是你的总的设计路径,在这个路径下面进行仿真、综合、形式验证等等的操作。
②RTL文件的路径(RTL_PATH):放置RTL文件的路径。
③配置文件的路径(CONFIG_PATH):放置DC的一些配置文件,这里的设计没有任何的配置文件,因此没有进行设置。
④脚本路径(SCRIPT_PATH):放置约束脚本的路径。
⑤未映射文件的路径(UNMAPPED_PATH):放置DC没有用工艺库进行映射时得到的文件,也就是GTECH格式的文件(什么是GTECH文件,最前面第一点的时候就说了的哈),或者以ddc格式保存的未映射的文件。
⑥映射后的文件的路径(MAPPED_PATH):放置DC最终优化后得到的结果,可能是以ddc的形式保存。
⑦放置报告的路径(REPORT_PATH):放置DC运行过程中的一些报告,比如启动报告,使用约束脚本运行中的报告,时序报告、面积报告等,通过查阅这些报告,分析DC是否按照我们预料中的情况进行启动、运行,分析设计是否满足要求等。
⑧DC运行时的路径(WORK_PATH):启动DC时的路径,也就是DC工作时的路径。
⑨DC的路径(DC_PATH):也就是安装DC的路径。
⑩define_design_lib work -path $WORK_PATH:这个就不是定义变量了,这个是DC内部命令格式,指定设计和库的工作路径。
⑩①符号库(Symbol library )的路径(SYMBOL_PATH):指定你符号库的路径,至于什么是符号库,前面也有解说了。关联一些图形化库,使用GUI界面的时候,就可以看到综合得到的门级网表的图形化界面。否则看不到。
由于我用的是台积电90纳米的库,图形化符号库及其路径如下图所示:
第一个就是库的路径看,后面那个是库的名称;由于我们需要定义的是库的路径,因此自然是写路径,而不是写库的名字。
附注:.sdb是DC使用的库,是给DC看的,我们查阅得到的是乱码;而.slib是给我们看的,我们可以用vim打开。
⑩②工艺库(technology library )的路径:也就是链接库(link library) 、目标库(target library) 的路径,这两个库合称为工艺库。至于工艺库里面的具体信息,后面会进行讲解。我的库的路径和名称如下:
这里的.db 格式是用来给DC用的,也就是说,DC读取工艺库文件,就是读取.db这种格式的文件;.lib是给工程师看的。此外还有什么fast、typical、slow这些名称,这些是库的工作模式,一般情况下,我们都选择slow,在最慢的情况下DC进行综合,得到的时序和面积都OK,那么在其他情况下肯定都OK了的。.pdb,.plib是物理库(以前有物理综合的概念,即physical synthesis,用的是physical compiler吧。现在这个概念用在了ICC中了)。
从上面中我们会发现,定义(路径)变量用的都是set(跟tcl语法一样),因此这里就要强调一下:
set : 自己自定义的一些变量,方便定义系统变量的时候,不用那么麻烦;主要是定义。
set_app_var :定义DC内部的系统变量、指定DC内部的连接等。主要指定有:search_path、synthetic_library、target_library、link_library、symbol_library 以及其他的一些命令开关等。
当定义完这些“自定义”的变量之后,我们就要做一些正经事了,就是指定DC要用到的库了。
⑩③指定搜索路径(Search_path):当读入了一些工艺库时,忘了设置它的路径,那么DC就会根据这个变量设置的路径去寻找库。DC可以根据这些路径进行寻找相关的库文件;或者,当需要多个.v文件时,通过这个变量告诉DC那些.v文件可能的路径,让DC根据.v文件的名字去找.v文件。
如:set_app_var search_path “$search_path ./../....libs”;
set_app_var search_path [list . $xxx $xxxx ](注意:换行的时候需要加换行符\,而且\后面不能有空格),list是列表的意思,意思是这个search_path有多个(路径)变量,第一个路径变量搜索不到(库或者需要的文件),可以从下一个路径中找;中间的 . 的意思好像是当前目录。
接下来就是指定库文件了。在前面粗略地说了一下各个库的意思,下面在介绍指定库的同时,也接收这些库在DC中的作用,但是库里面的具体内容不在下面说明,将在后面进行介绍。
⑩④指定综合库(synthetic_library):这个库一般是synopsys的库:DesignWare library 和标准单元库,这里指定的就是库的名字了。
DesignWare library 这个库是synopsys的IP库:当使用到synopsys公司的IP核的时候比如使用了该公司的乘法器IP,那么就要定义这个综合库;此外,当需要用到这个库的一些比较高端的IP核的时候,是需要相关的证书的。
例如当你在代码中用来“*”或者“+”这操作,那么DC会通过这个你指定的综合库进行映射或者优化这些操作符(就是翻译成门电路)。这个库非必须指定。在这些库的名称如下所示:
⑩⑤指定目标工艺库(target_library):DC将RTL级的HDL描述映射到实际的门级电路时所需要的标准单元库。这个库指定为半导*造商提供的工艺库。库里面的具体内容后面详细说明。这里指定的就是库的名字。
附注:启动DC之后,可以通过printvar target_library 查看工艺库名称。
⑩⑥指定链接库(link_library):这里指定的就是库的名字了,链接库可以从下面几点理解:
·链接库是target_library一样的单元库或者是已经综合到门级的底层模块设计(比如IP核)。作用是:用于分辨电路中逻辑门和子模块的功能,然后用实际的库单元或者子模块代替它们;在由上而下的综合工程中,上一层的设计调用底层已经综合的模块时,将从link_library中寻找并且链接起来,因此当读入的文件是门级网表(比如用到了IP核的网表)时,需要把 link library 设成指向生成该门级网表的目标库,否则 DC 因不知道网表中门单元电路的功能而报错。
如果需要将已有的设计从工艺A转到工艺B时,可以将当前的单元综合库A设为link_library,而将单元综合库B设为target_library,重新映射一下就可以了。
·路径面前加*号表示开辟一块单独的内存空间给DC自己使用,然后先搜寻内存中已有的库,然后再搜寻变量link_library指定的其他库。DC搜寻的库为search_path指定的目录(比如说之前读入设计时读入了库a,库a存到内存里;这时DC在进行综合的时候,发现缺少某个东西,于是就先从库a里面找,找不到时就会从列表里面的变量路径中找)。
·一般情况下,我们只用一个工艺库,需要引用目标工艺库,因此指定target_library;此外我们还有可能用到synopsys公司的IP核,因此需要指定他的DW库。(这一点也就是上面这么指定link_library的原因)。
⑩⑦最后是指定图形化符号库(symbol_library):这里指定的就是库的名字了,这个前面说得比较详细了,这里不再重述。
⑩⑧最后source的那个脚本是用来定义一些命名规则,去掉网表中的一些符号,放置后端工程师拿到的网表中带一些奇怪的符号从而引起不必要的错误。
注意:
·库的指定只需要指定target_library、link_library,其他的可以不指定;
·上面的库设置仅仅适用于逻辑综合,也就是非拓扑模式下的综合;拓扑模式下,需要使用到物理库,或者相关的物理布局等信息;对于拓扑模式下的综合,我们在前面的流程中提及到,在后面的实验中,我们也会进行相关的解释。
·最后,一般情况下(以后的文章中),为了方便管理,我们会像上一节那样:
A路径变量的定义我们会放在common_setup.tcl中(一般是用set设置的变量)。
B库变量的指定我们一般放在dc_setup.tcl这个文件中,这里的库变量一般是用set_app_var进行指定,此外指定的是具体的某一个库,而不仅仅是路径,DC会从search_path里面寻找到这些库。
C.synopsys_dc.setup文件中,仅仅包含source xxx.tcl这些内容,比如source common_setup.tcl ;source dc_setup.tcl 以及source其他的设置内容。
Notes@C.A.
这里说一下自己的脚本
- xxx_timing.tcl 所有的timing constraint在这里
- lib.tcl 所有的lib相关信息在这里
- xxx_synopsys.tcl 所有的文件信息在这里
- mail.tcl 包含以上所有的脚本调用,写出log和netlist&sdc
- dc_shell -f mail.tcl | tee run.log