学习目标:
1.完成数据准备,将设计数据保存到milkway中
2.从floorplan到route完整流程
预期效果:
1.为自己创建milkway
2.将参考库(reference library)链接至设计库(design library)
3.读入TLU+(plus)模型,提取寄生
4.读入网表
5.应用sdc约束
6.应用时序和优化控制
7.载入DEF格式的floorplan
8.使用place_opt完成place和优化操作
9.使用clock_opt建立并优化时钟树
10.使用route_opt布线优化
11.产生并读懂时序报告
12.在新对话中加载以前的设计
介绍:主要完成两部分工作,一部分利用netlist,sdc约束和floorplan创建Milkway 设计库(design library)。第二部分完成标准单元放置,创建CTS,并进行布线。
相关文件和目录
A:.synopsys_dc_setup
B:设计数据(Design Data)
Risc_chip.v ——网表文件
Risc_chip.def ——floorplan
Risc_chip.sdc ——时序约束
C:scripts 脚本
opt_ctrl.tcl——时序和优化控制
zic_timing.tcl(zic:zero interconnect )——检查零互联时序约束
derive_pg.tcl——创建PG 连接
D:solutions 解决方案
run.tcl 所有命令执行的脚本
1.目录移至工作目录
cd ../lab1_data_setup
ls -la
可以看到.synopsys_dc.setup文件,以.开头的文件在Linux下是不可见的。
2.查看.synopsys_dc.setup
3.在.synopsys_dc.setup文件底部定义了变量
如:set my_mw_lib risc_chip.mw
如LAB0A实验中使用的printvar命令,如果忘记了可以使用此命令查看变量
4.在3中变量上方定义了逻辑库
如set_spp_var link_library set_min_library
Note:定义的变量可以按照任何顺序应用。
5.退出.synopsys_dc.setup文本
6.从UNIX命令行启动ICC
icc_shell
在ICC终端启动时所有的输出都存放到log文件中
7.为了验证.synopsys_dc.setup文件已经被读了,可以通过查询其中的一个变量进行检测。
printvar sdc_file
start_gui
也可以直接输入gui,这个实验提前预设了脚本(设置在.synopsys_dc.setup中?不在,应该是主目录下的.synopsys_dc.setup)
9.创建Milkway设计库
a:使用Main Window的菜单,File—>Create Library,挑出Create Library窗口
b:使用已经定义过的逻辑库名和工艺文件名(设置在.synopsys_dc.setup中?)
c:将参考库链接到设计库中。(参考库指的是物理库),将标准单元sc加入到设计库中
d:增加IO库和Macro库。“IO”和“ram 16*128”
e:将“open library复选框勾上”,可以在设计库被创建后直接打开。
f:点击OK
Note:预计会出现关于“Missing CapModel Sections”的警告
忽略以上警告,之后会载入TLU+文件
查看Main Window中的命令,查看以上GUI操作对应的TCL命令
create_mw_lib -technology $tech_file -mw_reference_library "$mw_path/sc $mw_path/io $mw_path/ram16X128" -bus_naming_style{[%d]} -open $my_mw_lib
10.在另一个终端或者在icc_shell执行以下命令,观察新创建的risc_chip.mw设计库的内容
ls -a risc_chip.mw
#或者
icc_shell > ls risv_chip.mw
1.读入verilog网表钱,确保所有设计库是打开的,一个简单的方法去检查,目录打开File —>Open Library条目是否变黑,如果变黑了,当前库就处于打开状态。
2.选择File —> Import Designs,打开导入设计对话框。
3.在输入形式(input format)一栏选择verilog
4.点击Add,选择路径下的网表文件design_data/Risv_chip.v,并点击Open
在Top design name下键入$top_design(在.synopsys_dc.setup中设置?是的)或者Risc_chip,点击OK
上面的GUI操作等于执行以下TCL命令:
import_designs $verilog_file -format verilog -top $top_design
Verilog网表被读入和layout窗口被打开,所有单元都不被堆叠在原点。较大的IO pad和macro cell以浅蓝色展示。更小的单元是浅紫色的(使用zoom in操作放大才能会看到)
问题1:MilkWay设计库有什么变化?
回答:增加了一个CEL view。
5.Main Window打开File —> set TLU+,打开set TLU+对话框,选择ref文件夹下的三个文件分别为
Max TLU+ file :…/ref/tlup/cb13_6rn_max.tluplus
Min TLU+ file : …/ref/tlup/cb13_6rm_min.tluplus
.map文件 层名映射文件 : …/ref/tlup/cb13_6m.map
TLU+是存储RC系数的二进制表格式。TLU+包括宽度,空间,密度和温度对于电阻系数的影响,可以实现精确的RC结果。
ITF:互连线技术文件,对上述效果进行建模的详细信息。由fondary提供用于生成tluplus文件。
Map:将MilkyWay技术文件中图层和名称与ITF文件中名称相匹配。
ITF,TLU+和map文件
6.检查物理库和逻辑库的一致性
这里使用默认检查而不是完整性检查,完整性检查将检查UPF power的约束,多模多角(MMMC),CCS电流源模型,会差生许多警告和错误,并不适应我们库。
默认检查命令:
check_library
高版本的ICC不再继承Library Complier,服务器上没有这一软件,默认通过。
完整检查命令:
set_check_library_options -all
UPF(United Power Format):新思对芯片中电源域设计进行约束的文件格式。
会有两个感兴趣的信息
“逻辑库中确实单元数目:19”
这个消息列出了feed through,power pad,substrate tap cell,这些单元被使用在物理版图,并不需要在逻辑库中,可以忽略。、
“单元引脚缺失或不匹配的引脚类型:12”
列出的单元具有不匹配的引脚类型。逻辑库将它列为“信号”类型,物理库列为接地或电源,也是物理库单元,忽略此消息。
Note:如果以上check列出了缺失或不匹配的标准单元,macro单元或者IO pad cell,就要修改库文件。
7.检查TLU+单元,是否通过三个一致性检查
check_tlu_plus_files
你将看到一组关于max_tlu+,min_tlu+和mapping file的信息,三个一致性检查都是[passed!]
8.验证link library被载入
list_libs
将会看到6个逻辑库。sc,io,macro最大库,最小库,两个被“set_app_var link_library”和 “set_min_library”定义。
以及两个总是被载入的通用逻辑库gtech.db和standard.sldb。
9.定义PG引脚和网络的连接
source $derive_pg_file
check_mv_design -power_nets
不应有未连接的PG引脚
Note:pg_file文件内容被呈现,除了VDD和VSS,设计还有两个增加的PG信号,由外围设计使用VDDO/VSSO和VDDQ/VSSQ。
10.应用顶层设计约束
read_sdc $sdc_file
接下来几条命令验证关键约束,或获取关键约束的特定信息。
11.检查是否缺少任何关键时序约束,如时钟,输入输出约束
check_timing
Note:检查不应给出任何警告或者错误信息。信息后跟1表示没有缺失或者不一致的约束。
12.检查你的设计是否有时序例外约束。包括false path和 multicycle path,以及异步最小和最大延时约束。这些约束对于单周期时序行为属于例外。了解你的设计里是否包含任何这些时序例外以及位置非常有用。
report_timing_requirements
Note:应该没有任何时序异常约束
13.检查是否有路径禁用时序分析。如果存在禁用的时序弧,需要和综合组成员核对在物理设计是否需要。
report_disable_timing
false path:一条时序路径不进行时序分析
disable timing:时序约束用于禁用时序弧,防止对包含时序弧的所有时序路径进行分析。
14.检查设计是否已经配置为特定“mode”或者“case”,例如功能和测试模式。这通过在时序分析和优化阶段将引脚和端口设置成0或1实现,而不是硬连线。检查设计是否处于物理设计的正确模式。
report_case_analysis
15.检查时钟是否被精确建模
report_clock
report_clock -skew
Note:report_clock的输出确认了时钟没有传播。
(否则属性列表中会有p),这是在时钟树综合前想要的结果。
clock_skew报告确定时钟树影响正被建模。(插入延时,偏差,转换时间)
问题2:对于建立时间,偏差,抖动和裕量的组合建模的效果是什么?
回答:负不确定性和建立时间有关
16.应用./scripts/opt_ctrl.tcl里的一些时序和优化控制
Note:大多数的设置被单元1里的附录设置。一些在之后的单元被讨论,不用花时间在这儿去理解它们
source $ctrl_file
ctrl_file在dc.setup中被定义
17.运行一个零互联时序约束报告
在icc_shell中使用[Tab]键
source sc[Tab]z[Tab]
zic_timing.tcl脚本内容如下
18.上面的redirect -tee命令在屏幕上显示时序报告,并保存到文件中。可以通过在icc_shell中执行UNIX命令“cat”查看文件内容
exec cat zic.timing
向上并查看整个时序报告。有3个时序路径组被列出。每个路径组对应一条,称之为INPUTS、OUTPUTS和elk,这些路径组是在时序优化控制文件中被定义(在opt)
19“scan_enable”信号被定义为一个理想网络,在$sdc_file中可以看到(找到它),为了在综合时组织为这个信号插入Bufffer。在物理设计阶段需要移除理想时钟,为了可以在此阶段插入Buffer
remove_ideal_network [get_ports scan_en]
20.保存cell,并且观察risc_chip.mw/CEL下新的二进制文件
save_mw_cel -as RISC_CHIP_data_setup
至此已经完成了数据设置阶段。接下来进行floorplab,placement,CTS,routing,接下来的单元里详细了解这些阶段和相关命令。
本实验提供预定义floorplan——一个标准的存储floorplan信息的DEF文件。
DEF文件可以由ICC经过floorplan后生成或者由第三方floorplan工具生成。
1.读入提供的DEF文件
read_def $def_file
Note:也可以使用GUI操作:File—>Import—>Read DEF 读入./design_data/RISC_CHIP.def
2.layout窗口点击[F],看到整个FloorPlan这个单元。
3.确保标准单元被防止在power或者ground金属下(这个约束不是DEF的一部分)
set_pnet_options -complete {METAL3 METAL4}
4.保存设计单元并注意risc_chip.mw/CEL下的新的二进制文件
save_mw_cel -as RISC_CHIP_floorplanned
1.布局并优化时序
place_opt
redirect -tee place_opt.timing {report_timing}
2.layout窗口,放大并查看被放置的标准单元
问题5:这个能称之为“core limited”设计吗?
回答:不能,它的尺寸是由PAD决定的,而不是标准单元和硬核的面积决定。
Pad Limited与Core Limited
芯片的pad太多,超出规划预期的,叫Pad_Limited;因为芯片的Core面积太大,超出规划预期的,叫做Core_Limited。示意图如下,左边是Pad_Limited,右边是Core_Limited。简单看起来,Pad_Limited的芯片,因为pad太多,所以pad排布十分密集,相对来讲,Core就很小,芯片面积由Pad决定。Core_Limited的芯片,Core面积相对较大,而Pad则相对稀疏,芯片面积由Core决定。
分析拥塞:选择菜单中的?,下拉菜单中选择“Global Route Congestion ”,然后点击“Reload”,将会出现一个包含拥塞分析执行命令的对话框。在“(Re)Calculate Global Route Congestion Map Data”字段中列出以下命令
report_congestion -grc_based -by_layer -routing -stage global
热图(heat map)显示在layout window中,有37个0溢出边,意味着有足够的布线轨道用于布线
3.点击拥塞对话框的小“x”,关闭拥塞地图
4.保存设计单元
save_mw_cel -as RISC_CHIP_placed
1.使用默认设置产生时钟树。为了在时钟树综合阶段让ICC计算真正的时钟树偏斜,而不是约束中估计的时钟偏斜,首先移除时钟树的不确定性。并且打开保持时间修正,在CTS单元详细说明这个问题。
remove_clock_uncertainty [all_clocks]
set_fix_hold [all_clocks]
clock_opt
redirect -tee clock_opt.timing {report_timing}
2.显示时钟树:使用layout window上的菜单Clock—>Color By ClockTree,打开视觉模式对话框,点击“Reload”
在对话框中保证源端“clk”被选择(蓝色高亮显示)
在对话框底部选择“All Levels,Types”
点击“OK”
此时时钟树的金属互连,以及连接到时钟树的标准单元,IOpad,硬核都被高亮显示。观察时钟树如何从IO pad单元“clk_iopad”开始(外围的上侧右边缘),然后连接到所有的寄存器(“sdnrq#”或“sdcrq”)和硬核单元(可以通过放大并且鼠标悬停查看单元名字)
3.通过关闭(“x”)可视化窗口模式,移除时钟树高亮
4.保存设计单元
save_mw_cel -as RISC_CHIP_cts
5.我们仍需进行布线设计,首先通过点击File—>Exit—>Discard All退出ICC,或在icc shell下键入exit或quit并点击“OK”,接下来会解释为什么这么做?
Task5中退出ICC的原因在于以下步骤:启用新对话1,重新应用特定设置,以及从之前的地方继续。
如果不退出会发生什么?
1.启用ICC的GUI
icc_shell -gui
2.因为已经创建了设计库,并且CTS已经保存了布局单元,所以你需要做的就是从risc_chip.mw中载入RISC_CHIP_CTS。如下
a:在主窗口点击浅蓝色“open design”按钮,(处于界面左上方)。或使用菜单File—>Open Design
b:在“Open Design”对话框中,点击黄色文件夹图标。“Select library”对话框打开。选择设计库文件risc_chip.mw,并点击选择。
c:选择RISC_CHIP_cts,并点击“ok”去打开它
3.重新应用数据设置阶段的时序和优化控制。这是必须的,因为某些设置是使用变量设置的。通常变量设置不会和设计单元一起保存——仅在当前ICC编译器期间保持设置。退出并重新调用ICC编译器时,变量会重置为默认值。
source $ctrl_file
4.现在我们继续为设计布线,这一步会考虑所有的信号线(时钟网络已经被“clock_opt”详细布线了)
route_opt
放大并查看一些布线细节
5.生成时序报告,应该可以看到一个正的时序裕量
Note:因为这个report输出的时间可能会很长,我们使用一个使用者创建的脚本命令“view”,它打开一个单独的窗口,在这个窗口里,输出可以被方便地滚动查看和搜索。“view”这个命令是一个TCL程序,这个workshop提前定义(在哪里?找到它)。并不是一个ICC标准命令,这个程序和其它及格程序被定义在…/ref/tools/procs.tcl
并且在.synopsys_dc.setup中被source(找到它)
view report_timing -nosplit
v rt
Note:下面的简写利用的是命令的别名,也在.synopsys_dc.setup中被定义(找到它)
source filename,sh filename,./filename的区别
①当脚本有执行权限时,sh filename 和./filename无区别
②sh filename重新建立一个子shell执行脚本中的语句,子shell继承父shell环境变量,但子shell不会影响父shell变量
③source filename简单地将脚本在shell里执行
6.默认情况下,时序报告显示最大延时或者建立时间时序。在CTS之后我们还需要产生最小延时和保持时间报告。应该查看是否有保持时间违例。
v rt -delay min
7.生成物理设计的统计数据
report_design -physical
8.保存设计
save_mw_cel -as RISC_CHIP_routed
9.退出icc shell
exit
#or
quit
至此就完成了数据设置阶段和在ICC中运行了RISC_CHIP的基础流程设计。