ICC学习——LAB1

ICC学习——LAB1数据准备和基础流程

文章目录

    • ICC学习——LAB1数据准备和基础流程
    • Task1 创建Milkway库
    • Task2 载入netlist,TLU+,约束和控制
    • Task3 基础流程:设计规划floorplan
    • Task4 基础流程:布局placement
    • Task5 基础流程:CTS
    • Task6 基础流程:布线

学习目标:
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 所有命令执行的脚本

Task1 创建Milkway库

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命令,如果忘记了可以使用此命令查看变量
ICC学习——LAB1_第1张图片

4.在3中变量上方定义了逻辑库
如set_spp_var link_library set_min_library
ICC学习——LAB1_第2张图片

上面设置了一些别名,正如在LAB0A中提到的,
ICC学习——LAB1_第3张图片

也可以设置log文件的名字。
ICC学习——LAB1_第4张图片

Note:定义的变量可以按照任何顺序应用。
5.退出.synopsys_dc.setup文本
6.从UNIX命令行启动ICC

icc_shell

在ICC终端启动时所有的输出都存放到log文件中
7.为了验证.synopsys_dc.setup文件已经被读了,可以通过查询其中的一个变量进行检测。

printvar sdc_file

在这里插入图片描述
8.启动GUI

start_gui

也可以直接输入gui,这个实验提前预设了脚本(设置在.synopsys_dc.setup中?不在,应该是主目录下的.synopsys_dc.setup)

9.创建Milkway设计库
a:使用Main Window的菜单,File—>Create Library,挑出Create Library窗口

b:使用已经定义过的逻辑库名和工艺文件名(设置在.synopsys_dc.setup中?)

ICC学习——LAB1_第5张图片

c:将参考库链接到设计库中。(参考库指的是物理库),将标准单元sc加入到设计库中
ICC学习——LAB1_第6张图片

在这里插入图片描述

d:增加IO库和Macro库。“IO”和“ram 16*128”
ICC学习——LAB1_第7张图片

e:将“open library复选框勾上”,可以在设计库被创建后直接打开。
ICC学习——LAB1_第8张图片
f:点击OK
Note:预计会出现关于“Missing CapModel Sections”的警告
忽略以上警告,之后会载入TLU+文件
ICC学习——LAB1_第9张图片
查看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

Note:应该有3个lib文件和一个lock文件
在这里插入图片描述

Task2 载入netlist,TLU+,约束和控制

1.读入verilog网表钱,确保所有设计库是打开的,一个简单的方法去检查,目录打开File —>Open Library条目是否变黑,如果变黑了,当前库就处于打开状态。
ICC学习——LAB1_第10张图片
2.选择File —> Import Designs,打开导入设计对话框。
ICC学习——LAB1_第11张图片ICC学习——LAB1_第12张图片
3.在输入形式(input format)一栏选择verilog
ICC学习——LAB1_第13张图片
4.点击Add,选择路径下的网表文件design_data/Risv_chip.v,并点击Open
ICC学习——LAB1_第14张图片

在Top design name下键入$top_design(在.synopsys_dc.setup中设置?是的)或者Risc_chip,点击OK
ICC学习——LAB1_第15张图片
ICC学习——LAB1_第16张图片

上面的GUI操作等于执行以下TCL命令:

import_designs $verilog_file -format verilog -top $top_design

在这里插入图片描述

Verilog网表被读入和layout窗口被打开,所有单元都不被堆叠在原点。较大的IO pad和macro cell以浅蓝色展示。更小的单元是浅紫色的(使用zoom in操作放大才能会看到)
ICC学习——LAB1_第17张图片ICC学习——LAB1_第18张图片
问题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
ICC学习——LAB1_第19张图片
ICC学习——LAB1_第20张图片
ICC学习——LAB1_第21张图片
ICC学习——LAB1_第22张图片

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!]
ICC学习——LAB1_第23张图片
ICC学习——LAB1_第24张图片

8.验证link library被载入

list_libs

将会看到6个逻辑库。sc,io,macro最大库,最小库,两个被“set_app_var link_library”和 “set_min_library”定义。
以及两个总是被载入的通用逻辑库gtech.db和standard.sldb。
在这里插入图片描述
ICC学习——LAB1_第25张图片
9.定义PG引脚和网络的连接

source $derive_pg_file
check_mv_design -power_nets

ICC学习——LAB1_第26张图片
ICC学习——LAB1_第27张图片
不应有未连接的PG引脚
Note:pg_file文件内容被呈现,除了VDD和VSS,设计还有两个增加的PG信号,由外围设计使用VDDO/VSSO和VDDQ/VSSQ。
10.应用顶层设计约束

read_sdc $sdc_file

ICC学习——LAB1_第28张图片

接下来几条命令验证关键约束,或获取关键约束的特定信息。
11.检查是否缺少任何关键时序约束,如时钟,输入输出约束

check_timing

ICC学习——LAB1_第29张图片
ICC学习——LAB1_第30张图片
Note:检查不应给出任何警告或者错误信息。信息后跟1表示没有缺失或者不一致的约束。
12.检查你的设计是否有时序例外约束。包括false path和 multicycle path,以及异步最小和最大延时约束。这些约束对于单周期时序行为属于例外。了解你的设计里是否包含任何这些时序例外以及位置非常有用。

report_timing_requirements

ICC学习——LAB1_第31张图片

Note:应该没有任何时序异常约束

13.检查是否有路径禁用时序分析。如果存在禁用的时序弧,需要和综合组成员核对在物理设计是否需要。

report_disable_timing

ICC学习——LAB1_第32张图片
ICC学习——LAB1_第33张图片ICC学习——LAB1_第34张图片

false path:一条时序路径不进行时序分析
disable timing:时序约束用于禁用时序弧,防止对包含时序弧的所有时序路径进行分析。
14.检查设计是否已经配置为特定“mode”或者“case”,例如功能和测试模式。这通过在时序分析和优化阶段将引脚和端口设置成0或1实现,而不是硬连线。检查设计是否处于物理设计的正确模式。

report_case_analysis

ICC学习——LAB1_第35张图片
Note:由于没有列出管脚,因而没有被设置成常量的特殊引脚

15.检查时钟是否被精确建模

report_clock
report_clock -skew

ICC学习——LAB1_第36张图片
ICC学习——LAB1_第37张图片
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]

ICC学习——LAB1_第38张图片
ICC学习——LAB1_第39张图片

zic_timing.tcl脚本内容如下
18.上面的redirect -tee命令在屏幕上显示时序报告,并保存到文件中。可以通过在icc_shell中执行UNIX命令“cat”查看文件内容

exec cat zic.timing

向上并查看整个时序报告。有3个时序路径组被列出。每个路径组对应一条,称之为INPUTS、OUTPUTS和elk,这些路径组是在时序优化控制文件中被定义(在opt)
ICC学习——LAB1_第40张图片

ICC学习——LAB1_第41张图片

ICC学习——LAB1_第42张图片

问题3:约束设计是否通过“ZIC”健全性检查
回答:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

ICC学习——LAB1_第43张图片
在这里插入图片描述
至此已经完成了数据设置阶段。接下来进行floorplab,placement,CTS,routing,接下来的单元里详细了解这些阶段和相关命令。

Task3 基础流程:设计规划floorplan

本实验提供预定义floorplan——一个标准的存储floorplan信息的DEF文件。
DEF文件可以由ICC经过floorplan后生成或者由第三方floorplan工具生成。
1.读入提供的DEF文件

read_def $def_file

ICC学习——LAB1_第44张图片

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

ICC学习——LAB1_第45张图片
在这里插入图片描述

Task4 基础流程:布局placement

1.布局并优化时序

place_opt
redirect -tee place_opt.timing {report_timing}

在这里插入图片描述

问题4:布局满足时序吗?
回答:满足slack为正
ICC学习——LAB1_第46张图片
ICC学习——LAB1_第47张图片ICC学习——LAB1_第48张图片

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决定。
ICC学习——LAB1_第49张图片

分析拥塞:选择菜单中的?,下拉菜单中选择“Global Route Congestion ”,然后点击“Reload”,将会出现一个包含拥塞分析执行命令的对话框。在“(Re)Calculate Global Route Congestion Map Data”字段中列出以下命令

report_congestion -grc_based -by_layer -routing -stage global

点击“OK”
ICC学习——LAB1_第50张图片
ICC学习——LAB1_第51张图片

热图(heat map)显示在layout window中,有37个0溢出边,意味着有足够的布线轨道用于布线
3.点击拥塞对话框的小“x”,关闭拥塞地图
4.保存设计单元

save_mw_cel -as RISC_CHIP_placed

在这里插入图片描述
ICC学习——LAB1_第52张图片

Task5 基础流程:CTS

1.使用默认设置产生时钟树。为了在时钟树综合阶段让ICC计算真正的时钟树偏斜,而不是约束中估计的时钟偏斜,首先移除时钟树的不确定性。并且打开保持时间修正,在CTS单元详细说明这个问题。

remove_clock_uncertainty [all_clocks]
set_fix_hold [all_clocks]
clock_opt
redirect -tee clock_opt.timing {report_timing}

在这里插入图片描述
在这里插入图片描述
ICC学习——LAB1_第53张图片

问题6:时序时OK的吗?
回答:OK
ICC学习——LAB1_第54张图片
ICC学习——LAB1_第55张图片
ICC学习——LAB1_第56张图片

2.显示时钟树:使用layout window上的菜单Clock—>Color By ClockTree,打开视觉模式对话框,点击“Reload”
在对话框中保证源端“clk”被选择(蓝色高亮显示)
在对话框底部选择“All Levels,Types”
点击“OK”
ICC学习——LAB1_第57张图片
在这里插入图片描述

此时时钟树的金属互连,以及连接到时钟树的标准单元,IOpad,硬核都被高亮显示。观察时钟树如何从IO pad单元“clk_iopad”开始(外围的上侧右边缘),然后连接到所有的寄存器(“sdnrq#”或“sdcrq”)和硬核单元(可以通过放大并且鼠标悬停查看单元名字)
ICC学习——LAB1_第58张图片ICC学习——LAB1_第59张图片

3.通过关闭(“x”)可视化窗口模式,移除时钟树高亮
4.保存设计单元

save_mw_cel -as RISC_CHIP_cts 

在这里插入图片描述
ICC学习——LAB1_第60张图片
5.我们仍需进行布线设计,首先通过点击File—>Exit—>Discard All退出ICC,或在icc shell下键入exit或quit并点击“OK”,接下来会解释为什么这么做?

Task6 基础流程:布线

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”去打开它
ICC学习——LAB1_第61张图片
ICC学习——LAB1_第62张图片

3.重新应用数据设置阶段的时序和优化控制。这是必须的,因为某些设置是使用变量设置的。通常变量设置不会和设计单元一起保存——仅在当前ICC编译器期间保持设置。退出并重新调用ICC编译器时,变量会重置为默认值。

source  $ctrl_file

ICC学习——LAB1_第63张图片
4.现在我们继续为设计布线,这一步会考虑所有的信号线(时钟网络已经被“clock_opt”详细布线了)

route_opt

ICC学习——LAB1_第64张图片
ICC学习——LAB1_第65张图片
放大并查看一些布线细节
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中被定义(找到它)
ICC学习——LAB1_第66张图片

source filename,sh filename,./filename的区别
①当脚本有执行权限时,sh filename 和./filename无区别
②sh filename重新建立一个子shell执行脚本中的语句,子shell继承父shell环境变量,但子shell不会影响父shell变量
③source filename简单地将脚本在shell里执行
6.默认情况下,时序报告显示最大延时或者建立时间时序。在CTS之后我们还需要产生最小延时和保持时间报告。应该查看是否有保持时间违例。

v rt -delay min

ICC学习——LAB1_第67张图片

7.生成物理设计的统计数据

report_design -physical

Note:这个报告包含设计利用率,拥塞(溢出)等信息
ICC学习——LAB1_第68张图片
ICC学习——LAB1_第69张图片

8.保存设计

save_mw_cel -as RISC_CHIP_routed

在这里插入图片描述
ICC学习——LAB1_第70张图片

9.退出icc shell

exit
#or
quit

至此就完成了数据设置阶段和在ICC中运行了RISC_CHIP的基础流程设计。

你可能感兴趣的:(数字IC,ICC,秋招准备,tcl)