实验环境
VMware Workstation 16 Pro中的Ubuntu 22.04
DC版本为2016.03
文件夹结构
以onehot独热码为例
以下是文件夹结构
.
├── config
├── flist.f
├── library
│ ├── fast.db
│ ├── fast.lib
│ ├── slow.db
│ ├── slow.lib
│ ├── tsmc090.sdb
│ ├── tsmc090.slib
│ ├── tsmc090.v
│ ├── typical.db
│ └── typical.lib
├── makefile
├── mapped
├── report
├── rtl
│ └── onehot.v
├── script
├── tb
│ └── tb.v
├── unmapped
└── work
- config:配置文件;
- flist.f:文件列表;
- library:工艺库;
- makefile:make脚本;
- mapped:map过的网表文件;
- report:综合后的报告;
- rtl:RTL代码;
- script:tcl约束指令;
- tb:testbench验证时使用,综合时无用;
- unmapped:未map的网表文件;
- work:DC启动文件等。
大概的流程为:
准备好文件 ——>启动DC ——>读入设计前的检查——>读入设计和查看设计——>约束设计——>综合——>综合后检查(与优化)——>保存优化后的设计
DC启动文件的编写
在启动DC之前,首先要配置DC的启动环境,也就是那些库的设定。配置DC的启动环境主要是.synopsys_dc.setup配置文件的书写。.synopsys_dc.setup这个文件就是DC的配置文件,它配置了DC启动过程中要执行哪些命令、干哪些事。
一般.synopsys_dc.setup 文件有三个:①一个在synopsys的安装目录下,这个文件最好不要动;②一个在用户目录下,这个文件没事也不要动他;③还有一个当前工作目录下,也就是启动DC的目录下(没有就需要自己创建),这个是要我们自己写的,这个想怎么动就怎么动。我们配置DC的启动环境,就是在启动的目录创建.synopsys_dc.setup并且修改它。
.synopsys_dc.setup的内容:
source ./common_setup.tcl
source ./dc_setup.tcl
common_setup.tcl的内容:
echo "***********************************************************"
echo "************** Start load .synopsys_dc.setup **************"
echo "***********************************************************"
set SYN_ROOT_PATH /home/hyx/verilog/onehot
set RTL_PATH $SYN_ROOT_PATH/rtl
set CONFIG_PATH $SYN_ROOT_PATH/config
set SCRIPT_PATH $SYN_ROOT_PATH/scirpt
set MAPPED_PATH $SYN_ROOT_PATH/mapped
set REPORT_PATH $SYN_ROOT_PATH/report
set UNMAPPED_PATH $SYN_ROOT_PATH/unmapped
# 设置工作路径
set WORK_PATH /home/hyx/verilog/onehot/work
set DC_PATH /home/hyx/software/dc2016
set SYMBOL_PATH /home/hyx/verilog/onehot/library
set LIB_PATH /home/hyx/verilog/onehot/library
①设计目录(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的路径。
⑩①符号库(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要用到的库了。
dc_setup.tcl的内容:
# 设置工艺库
set_app_var search_path [list . $search_path $LIB_PATH \
$SYMBOL_PATH $RTL_PATH \
$SCRIPT_PATH \
${DC_PATH}/libraries/syn]
set_app_var synthetic_library [list dw_foundation.sldb standard.sldb]
set_app_var target_library [list typical.db fast.db slow.db]
set_app_var link_library [list * typical.db fast.db slow.db]
#set_app_var link_library [list * ${target_library} dw_foundation.sldb]
set_app_var symbol_library [list tsmc090.sdb]
echo "***********************************************************"
echo "************* End of load .synopsys_dc.setup **************"
echo "***********************************************************"
echo "***********************************************************"
echo "************** Start source hs_name_rules.v ***************"
echo "***********************************************************"
#source -v -e ./hs_name_rules.tcl
echo "***********************************************************"
echo "************* End of source hs_name_rules.v ***************"
echo "***********************************************************"
⑩③指定搜索路径(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,其他的可以不指定;
·上面的库设置仅仅适用于逻辑综合,也就是非拓扑模式下的综合;拓扑模式下,需要使用到物理库,或者相关的物理布局等信息