下一个项目,用cadence genus工具综合的可能性比较大。
综合的理解程度,还只是工程应用遇到问题,然后被迫去解决。没有一个系统学习的过程。
理解IC设计flow,很好的方法,就是阅读EDA工具手册。所以,留一个坑,慢慢填吧。(synopsys DC也应该熟悉一下)
preface
cadence genus综合工具,前身是RC(RTL Compiler);现已改名。
启动方式,有两种
1. genus
2. genus -legacy_ui
3. 区别?
a) genus是为了与cadence后端flow的EDA工具保持命令的一致,所以导致genus不再兼容RC命令;
b)genus -legacy_ui,与RC命令兼容;有些命令是不再支持了,所以要注意。结合工程角度,作为前端设计人员,基本不会和后端有命令兼容性的要求;而且新项目会基于前面项目的RC,所以后续笔记只关注genus legacy_ui
的用法。
man命令无法解析ERROR/WARNING的类型?
当前有这样的问题,不过可以通过genus message.pdf去查阅。
好像用下述命令方式,可以查阅,上班后试试效果。[:<没效果,可能是本地问题。]
get_attribute help [find / -message TIM-11]
在genus的路径里,有cdnshelp命令。这个适合通过关键词搜索genus所有文档。
cadence有command和attribute,
1. 通过help或man可以阅读command的帮助手册;
2. 通过下述命令,可以方便地理解attribute。
legacy_genus:/> get_attribute attribute_name * -help
genus有模板脚本可以自动生成。
相关命令是:write_template
,这个不错。
introduction
information_level
To control the amount of information written in the output logfiles, use the following command:
set_attribute information_level value
For analysis and debugging, set the information level to 9(max)。
design hierarchy
genus有自己的一套设计层次结构,类似linux shell里的文件目录。
通过理解这个设计层次结构,会对genus有更深理解。
相关命令:
ls
cd
pwd
如果查看linux的文件目录,则用命令(l前缀,可以理解为linux):
lls
lcd
lpwd
object和attribute
object和attribute是genus的两个重要概念。中文就是对象和属性。
object可以是design, subdesign, library, directory (including the root directory),
port, pin, 等等。
attribute是object的具体化设置,即某一个对象,可以有不同的属性,来表示不同的设计信息。
比如(纯属个人理解,还没验证想法)
dc::set_load [get_attribute load slow/INVX1/A] [dc::all_outputs]
获取object(子设计slow/INVX1/A)的属性,
用set_load命令,去应用到object(所有的输出)。
最开始的时候,往往会遇到很多error
不要设置遇到error就stop。比如下面的命令,确认fail_on_error_mesg
属性的值不是true。
set_attribute fail_on_error_mesg true /
设置某种message为error
相关命令,感觉很有用处。记录一下。
get_attribute help [find / -message TIM-11]
get_attribute severity [find / -message DFM-200]
set_attribute severity Error [find / -message DFM-200]
检查报告的message
report messages
可以打印出所有的warning和error类型。这个可以初步确认综合环境的正确性。有用!
genus使用的脚本语言是tcl
tcl特点,个人理解是基于list变量类型的操作比较方便。
design information hierarchy
这一章,对深入理解genus综合的结果体系,有很好的帮助。
待续。。。。。。。。。。。
Elaboration
elaboration包括以下任务:
1. 建立数据结构;(之后的约束是建立在这个结构上的)
2. infer设计中的registers;
3. HDL代码优化,比如去除无用的代码;
4. 检查语法;
个人认为有点意思的:
1. 可以指定module进行elaborate;
这是否意味着顶层加约束,综合子模块?自问自答:不是,因为顶层约束是基于elaborate顶层模块的层次结构。
genus 如何减少运行时间
超线程
可以本地机器和网络机器的线程一起;
基于cache方式
适合项目综合环境趋于稳定的阶段。应该类似cache原理,难道是设置虚拟内存?没必要啊,linux有swap空间。
也许是临时定义一个较大的虚拟内存,使得可以多次仿真的时候,减少迭代运行时间。
使能cache,定义cache目录
legacy_genus:/> set_attribute super_thread_cache directoy /
指定最大可cache的容量。默认是1GB,单位是MB。
legacy_genus:/> set_attribute max_super_thread_cache_size integer /
综合
综合主要分两个步骤:
1. syn_generic
内容包括:RTL代码优化、RTL代码映射为netlist(使用genus自带的generic逻辑库)。
2. syn_map
内容包括:指定的design映射为netlist(使用用户最终要求的工艺库)、逻辑优化。
syn_map也可以分为:
a). 与工艺无关的逻辑优化。
b). map映射为期望工艺。
c). 与工艺相关的门级优化。
综合的努力级别
带布局布线信息、寄生参数信息的综合
即物理综合。有专门的pdf文档。
syn_opt -physical
综合完成后要做形式化验证
cadence的工具叫LEC;
synopsys的工具叫formality。
因为综合,会把RTL映射成期望工艺下的网表文件;而且伴随着大量的RTL、netlist级别优化。所以功能也许会有误差,利用形式化验证,可以快速确认RTL与netlist的一致性。
从而确保综合结果的可靠性。
综合报告的tips
工程中常见到这样的用法:
report timing > timing.rpt
但是上述写法,有个不好的地方是,无法再genus.log里显示report timing的执行过程(包括error信息)。
所以推荐下面写法
redirect -tee timing.rpt "report timing"
这个类似linux下的tee
命令用法。
genus database
genus数据库,个人理解,主要是为了方便save/restore session。
适合关闭综合步骤后,能快速返回之前的综合环境里。
适合debug或者report;比如综合结束后,想report更多信息,如果没有保存session,那么就得重新综合。
修改网表
这个部分,主要面向ECO阶段,对后端提供的网表,进行脚本化修改。
脚本模板
利用write_template
命令,可以选择不同参数,得到一个标准的genus综合脚本模板。我用的命令是
write_template -full -outfile template.tcl