Oasys-RTL工具的使用(一)
Oasys-RTL工具的作用,用官方的语言来说就是:enable you to start with RTL and produce a placement-aware optimized netlist and floorplan.
也就是Oasys-RTL可以基于RTL做后面的综合、优化、测试等工作。
Oasys-RTL的使用流程(可以在这个基础上根据需要进行增删):
① 读取文件。事先要准备好各种库和文件,包括libraries、LEF、RTL等等。
Liberty Timing File (.lib):是最基本的时序模型,包含延迟、转换、建立和保持时间等要求。Liberty Timing File必须第一个被读取。
Library Exchange Format (.lef):有两种,分别是Technology LEF和LEF,分别存储layer信息和各种模块的layout信息。
Register Transfer Level (.vhd/.v/.sv):待综合的RTL描述,也就是用硬件描述语言写的程序。
还可以读取很多其他的特定文件,非必需所以先不做介绍。
② 综合。若后面需要做DFT,可将扫描链一起综合;若需低功耗设计,可与门控时钟一起综合。
③ 设置时序和布局上的约束。
④ 优化。对面积、时序、布局以及出现的阻塞进行优化。
⑤ DFT。插入扫描链对电路进行测试,对出现问题的地方进行修复。
⑥ 输出所需文件。如verilog文件、DEF文件、MXDB文件等。
然后按照上面的流程写一个脚本文件,这里就取名叫demo.tcl:
1 #===========================① 读取文件==========================#
2 # 设置各种库的路径
3 set lib_area "libs的路径"
4 set lef_area "lefs的路径"
5
6 # 设置用到的lib库,可能有多个
7 set timing_libs " \
8 $lib_area/第1个timing_lib的文件名 \
9 $lib_area/第2个timing_lib的文件名 \
10 $lib_area/第3个timing_lib的文件名 \
11 ......
12 $lib_area/第n个lib的文件名"
13
14 # 设置用到的Technology LEF
15 set tech_file "$lef_area/Technology LEF的文件名"
16
17 # 设置用到的LEF
18 set lef_files " \
19 $lef_area/第1个LEF的文件名 \
20 $lef_area/第2个LEF的文件名 \
21 $lef_area/第3个LEF的文件名 \
22 ......
23 $lef_area/第n个LEF的文件名"
24
25 # 将所有上面列好的timing_lib读取到一个目标库中,并给目标库命名,这里命名为target_timing
26 foreach lib $timing_libs {
27 read_library $lib -target_library target_timing
28 }
29
30 # 读取设置好的technology LEF
31 read_lef $tech_file
32
33 # 读取设置好的LEF
34 foreach lef $lef_files {
35 read_lef $lef
36 }
37
38 # 设置综合优化时使用的liberty Timing File为target_timing
39 set_target_library target_timing
40
41 # 将target_timing中所有单元模块设置为可使用(根据需要来,可以设置某些单元模块不可用)
42 set_dont_use [get_lib_cell * ] false
43
44 # 设置RTL文件路径,再将其赋给变量search_path
45 set rtl_dir "RTL的路径"
46 set search_path "${rtl_dir}"
47
48 # 设置需要综合的RTL模块。这里假设用的语言是VHDL,其他语言同理
49 set rtl_list {
50 module1.vhd
51 module2.vhd
52 module3.vhd
53 ......
54 顶层模块名.vhd
55 }
56
57 # Oasys-RTL根据设置好的路径search_path去读取$rtl_list中的所有模块
58 read_vhdl $rtl_list
59
60 # 检查库文件
61 check_library
62
63 #============================② 综合=============================#
64
65 # 设置top_module为上面读取的RTL的顶层模块
66 set top_module 顶层模块名
67
68 # 从顶层模块从上至下进行综合,可根据需要插入扫描链、门控时钟
69 synthesize -module $top_module -map_to_scan true -gate_clock
70
71 #==========================③ 设置约束===========================#
72
73 # 预先写一个SDC(Synopsys Design Constraints)文件(即时序约束文件),设置时钟、延迟等各种时序条件
74 # 读取该SDC文件。-verbose:输出读取该文件时的详细信息
75 read_sdc -verbose sdc文件路径+文件名
76
77 # 设置布线最大利用率约束,可多次设置
78 # 参数1:选择Technology LEF中定义的金属层
79 # 参数2:最大利用率百分比(写成小数形式)
80 set_route_layer_max_usage 参数1 参数2
81 ......
82
83 # 输出设计特性,包括设计用到的单元模块及其数量、面积、泄露功耗,若进行了布局优化,则还会有芯片面积、导线长度等信息
84 report_design_metrics
85
86 # 检查时序
87 check_timing
88
89 #============================④ 优化=============================#
90
91 # 针对时序进行优化,再输出时序(会报告整个设计在时序上的最长路径的详细信息)和设计特性
92 optimize -virtual
93 report_timing
94 report_design_metrics
95
96 # 针对布局进行优化,再输出时序和设计特性
97 optimize -place
98 report_timing
99 report_design_metrics
100
101 #=============================⑤ DFT=============================#
102
103 # DFT可以调用其它专业软件进行,这里用Oasys-RTL简单进行DFT。
104
105 # 设置无需进行扫描测试的电路
106 set_dont_scan 具体哪个模块的哪个位置
107
108 #设置DFT用到的端口为se(scan enable),命名为se,扫描时高电平有效,打开默认扫描使能,创建该端口
109 define_test_pin -name se -pin se -scan 1 -default_scan_enable true \
110 -create_port
111
112 #设置用于修复DFT错误的端口,为test_mode,命名为test_mode,扫描时高电平有效,创建该端口
113 define_test_pin -name test_mode -pin test_mode -scan 1 -create_port
114
115 # 设置测试时钟为clk端口
116 define_test_clock -pin clk
117
118 # 其他需要预先设置的pin都要写好!
119
120 # 如果前面插入了门控时钟,则可以把门控时钟的测试pin与se连接
121 connect_clock_gating_test_pin -test_pin se
122
123 # 进行DFT
124 check_dft -auto_test_clock -auto_test_pins
125
126 # 用前面设置的clk和test_mode,对DFT发现的不可控时钟和不可控的异步置位复位信号进行修复
127 fix_dft_violations -type all -test_clock clk -test_control test_mode
128
129 # 再次进行DFT
130 check_dft
131
132 # 输出DFT中出现的错误
133 report_dft_violations
134
135 #=========================⑥ 输出所需文件==========================#
136
137 # 可以根据需要进行一次最终优化,输出时序和设计特性
138 optimize
139 report_timing
140 report_design_metrics
141
142 # 输出所需文件,以.odb(Oasys-RTL database)和.v文件为例,其它格式文件同理
143 write_db odb文件路径+文件名
144 write_verilog verilog文件路径+文件名
脚本文件demo.tcl写好后,就可以直接启动Oasys-RTL,执行demo.tcl。
进入demo.tcl所在目录(也可以不进入,但是执行命令时demo.tcl前面需要加上文件所在路径)。
启动oasys(可以通过-log将运行的所有信息保存在一个日志文件中):
oasys (-log 日志文件路径+文件名)
在Oasys-RTL的命令行用source命令读取并执行tcl文件:
[oasys-RTL]$ source (tcl文件路径/)demo.tcl
执行后可以看到全部执行信息。如果出现错误停止运行,则根据报错信息对输入的文件进行修改,再重新执行上面的source命令。
基本的使用流程就是这样了,后面也许会再进一步记录Oasys-RTL工具的相关内容。
----------------------莫问收获,只问耕耘----------------------