由于8月份有点忙,更新会没那么频繁,不过也会抽空给大家分享学习心得哒
上一节我们介绍了Flat RTL设计,本章将介绍Hierarchical设计方式。
1、Flatten和Hierarchical
Flatten展平化设计:自底向上 bottom-up
Hierarchical层次化设计:自顶向下 top-down
1.1 Bottom-up
最基本的设计方法,芯片经过RTL设计仿真,通过逻辑综合产生门级网表以及相应的标准时序约束SDC文件,再调用standard cell library、IP以及这些单元的时序库,通过布局布线实现物理设计。
优点:不用分配边界约束,可以在芯片全局范围内进行优化,时序结果更好。
缺点:大设计的展平设计周期较长。
1.2 Top-down
在自顶向下设计时,需要保证设计是一种层次化结构,并采用逐层例化的方式去设计,从系统级别出发,逐步分解成较低的层次模块,直到达到设计细节的层次。
分成数个分割快后,对每个分割快进行展平化处理,包括独立的布局布线,最后在顶层完成组装设计。
优点:将大设计分为若干个小设计,可由工程师协作完成,复杂性小,周期短。
缺点:模块之间的时序收敛问题较难解决,可能需要顶层重新作约束分配。
2、层次化设计
层次化设计示例
module TOP (IN1,IN2,...
input IN1,IN2,...
output OUT1,...
A U_a (.A1 ...
B u_b (.B1 ...
IP_LIB_RAM U_ram (.A ...
...
2.1 Target_libarary和Link_library的拓展应用
①target_library包含多种文件的最常见的场景就是在执行泄漏功耗和静态功耗优化时。
会包含HVT和SVT library等。
set_app_var target_library "hvt.db svt.db"
set_max_leakage_power ...
补充:---------------------------------------------------------------------------------
HVT:High Voltage Threshold
SVT:Standard Voltage Threshold
LVT:Low Voltage Threshold
HVT | SVT | LVT | |
Power | 最低 | 较低 | 较高 |
Delay | 较大 | 较小 | 最小 |
上面我把“等”高亮了,这是因为出于功耗的考虑,在满足timing的前提下,综合时尽量使用HVT和SVT,避免使用LVT。如果timing无法满足,可以使用部分LVT cell。
②将IP或者Macro库包含在link_library中
set_app_var link_library "* $target_library IP.db Macro.db"
补充:-------------------------------------------------------------------------------
有许多同学可能分不太清IP、Macro和Memory的区别,这里咱们可以一起讨论一下!!!
三者之间的关系:memory IP Macro
memory在设计库中一般是自带的,如果设计库中没有memory,向第三方购买的memory可称为IP。IP就是设计中买的第三方的硬核或者软核。IP和memory可以统称为Macro宏单元。
ICC中可使用【all_macro_cells】将三者都列出来。
2.2 Good Practice
我们在写flow的时候需要养成一些良好的习惯 !!!
①在link之前指定一下当前设计
current_design TOP
link
②在link之后需要针对连接和层次化问题检查一下当前设计:
- 缺少的port或者没有连接的输入pin
- 递归的层次化结构或者多个实例化
link
check_design
//check_design也可以基于HTML
check_design -html check_design.html
补充:打开HTML文件的方式
sh firefox check_design.html
当link或者check_design未成功时,可以直接退出DC工具。
read_verilog
current_design TOP
if {[link] == 0} {
echo "Linking Error"
exit;
}
if {[check_design]==0} {
echo "Check Design Error"
exit;
} ;
source TOP.con
compile_ultra
2.3 analyze & elaborate
如果使用analyze和eleborate,则不需要设置 current_design or link
- analyze
①读取Verilog
②检查语法并发出error/warning
③将Verilog转换为中间二进制文件,并放置在当前目录中
④可以使用define_design_lib将文件/目录重定向到子目录
- elaborate
①读取中间.pvl文件并且在DC memory中建立“GTECH”(unmapped ddc)
②将当前设计设置为指定设计
③link指定设计
④唯一一种可修改参数值的方法
analyze -format verilog {TOP.v}
elaborate TOP -parameters "A_WIDTH=8"
如果采用read命令不能改变参数值
⑤如果在search_path中找到了.ddc文件,加载.ddc文件并且覆盖一个RTL源码
2.4 .ddc(Design ) file
- .ddc文件是什么呢?
.ddc文件用于设计数据在不同EDA工具之间的传递和共享。
首先呢,.ddc文件并不一定是综合完成后才输出的,综合前和综合后的设计都可以保存为.ddc格式!!
.ddc包含网表(netlist.v)、设计约束(constraints.sdc)以及属性(attributes)。
- Reading .ddc
将.ddc文件加载到DC memory的方法:explicitly reading,不建议自动加载
link只自动加载ddc,而不能自动加载verilog。
read_ddc {decode.ddc.ENCODE.ddc}
我们需要养成一个良好的习惯,在compile之前保存unmapped ddc,原因有以下2点:
①RTL到mapped ddc需要耗费很长一段时间
②可能需要重新读取unmapped ddc来作优化
保存Hierarchical design的两种方式:
①包含整个设计层次的一个文件 -hier
write -format ddc -hier -out unmapped/TOP.ddc
②包含设计层次部分的独立文件
write -format ddc -out TOP.ddc //by default
write -format ddc A -out A.ddc
write -format ddc B -out B.ddc
- save .ddc after compile
mapped ddc可以重新读入DC或者读入ICC进行物理设计
write -format ddc -hier -output mapped/TOP.ddc
3、输出.v文件
为了减少. [ ]等容易引起不同工具解析错误和理解错误的特殊符号,会采用change_name命令将这些命令修改。
A[0] -> A_reg_0_
change_names -rule verilog -hier
write -format verilog -hier -output mapped/TOP.v