-
利用
DC
进行综合设计
(2012-03-25 17:45:10)
转载
▼
标签:
dc
综合
杂谈
DC
的
综合术语用于设计的
ASIC
的
EDA
工具往往是一套很复杂的软件,包括大量的工具和文档。同
时,
每个公司都有自己的一套术
...
一、预备知识
1.1
、
DC
的综合术语
用于设计的
ASIC
的
EDA
工具往往是一套很复杂的软件,包括大量的工
具和文档。同时,
每个公司都有自己的一套术语。只有理解了这些术语的含义才能很好的
掌握这些工艺。
1
设计和设计对象
设计是实现一定逻辑功能的电路的描述。
设计对象就是在设计中被
DC
命令、
属性和约束操作或控制的对象。
常用的设计中包括元件、
网络
、端口、引脚和时钟。另外,一个设计可能包括某个相同子设计或库元件的多个例化。
这
时候被例化的设计或库元件称作参考。
在一个设计中查找某个
对象的命令:
find
,这是在
DC<
/p>
命令中很常用的命令。如:
列出当前设
计的所有端口(
ports
)
:Dc_
shell>findport OR find(port,
”
*
”
)
列出所有包含
”
DW
”
字母的元件:
p>
dc_shell>find (cell,
”
*DW*
”
)
列出
cba_core
库中的
AN2
门的所有接脚:
dc_shell>find(pin,cba_core/AN2
Read
–
format vhdl
./src/rtl/timer_
Read
–
format vhdl ./src/rtl/test_
Check_error
–
v
If(dc_shell_status= =1){exit 1}
Current_design test_top
Link
Check_error
–
v
If(dc_shell_status= =1){exit 1}
Include pass0/constraint/test_
Check_error
–
v
If(dc_shell_status= =1){exit 1}
Set_max_area
0.0000
Set_flatten false
Echo”***doing full compile
for the partition ?test_top?***”
Sh date;
Compile
–
map_effort medium
Check_error
–
v
If(dc_shell_status= =1){exit 1}
Sh date;
Check_design
Compile_top_acs_partion=ture
Compile_top_all_paths=true
Echo”***doing boundary compile for the
partition ?test_top?***”
Sh
date;
Compile
–
top
Uniquify
Check_error
–
v
If(dc_shell_status= =1){exit 1}
Sh date;
Current_design
test_top
Write
–
format db
–
hierarchy
–
output pass0/db/test_
Write
–
format
verilog
–
hierarchy
–
output pass0/db/test_top.v
Write
–
format
vhdl
–
hierarchy
–
output pass0/db/test_
Report_timing> pass0/report/test_
Report_area> pass0/report/test_
Report_constraints> pass0/report/test_
Report_qor> pass0/report/test_
< br>Report_constraints
–
all_vi
olators
–
verbose>pass0/report
/test_
quit
脚本文
件可以使用任何一个文本编辑工具产生或修改,
也可以在
dc_
shell
中执行
write_scirpt
< br>命令产生。
如,
下面的命令就是将设计的属性和约束等信
息保存到名为
的脚本文件。
Dc_shell>write_>
脚本文件的语法应该符合
dc_shell
命令的语法。
DC<
/p>
提供了一个语法检查工具和一个上下文
检查工具,他们可以检查脚
本文件的语法和脚本文件的错误,并提供相应的错误信息。
语
法检查工具检查脚本文件的语法,
但是不执行其中的命令。
语法
检查实现的功能包括:
检
查预先定义的命令参数是否正确,
p>
检查必须的参数是否存在、
文件重定向问题、
检查引用文
件中的命令的语法、按照
dc_shell
正常的使用方式执行赋值。要使用语法检查,我们必须对
该功能进行使
能,
此后每次引用或执行脚本前就会首先进行语法检查。在
dc
_shell
中使能语
法检查功能的方法如下:
Dc_shell>syntax_check true
Syntax check on.
上下文检查工具检查上下
文的错误。
在执行一个脚本文件前,
我们应该对其进行上下文检
查。
上下文检查在检查每个命令的语法的同时,
还会读入设计、
检查设计和库文件是否有效、
文
件设法
齐全等。
其执行具体的功能包括:
检查设计对象和属性的合法性
,
检查用户定义的属
性,检查变量是否存在,检查条件语句的条
件,检查循环语句,读入需要读入的文件,根据
命令重定向文件,检查库和库对象。
p>
要使用上下文检查,
我们必须对该功能进行使能,
< br>此后
每次引用或执行脚本文件前就会进行上下文检查。使能命令如下。
Dc_shell>context_check true
Context check on.
最后,脚本文件的执行是比较简单的,可以通过两种方法:
<
/p>
在
dc_shell
中,应该使用
include
命令执行脚本文,
inclu
de
在启动
dc_shell
时,可以使用
-f
选项执行脚本文件,
dc_shell
–
f
在执行脚本前,如果我们激活了脚本语法检查和上下文检查,那么就会先进
行相应的检查。
二、准备
HDL
文件
输入
p>
DC
的文件通常是
HDL
< br>文件,
HDL
的代码质量将直接影响综合的效果,因此在
编码中
必须考虑设计数据管理、设计划分和
HDL
代码的风格
2.1
、数据文件管理
首先,
由于综合过程中需要大量的数据和多种文件,
因此数据的管理就显得非常重要。
这种
管理通常设计两个部分,
设计数据控制和数据组织。控制设计数据主要是控制数据的创建、
维护、覆盖和删除等。
这和软件工程中的版本控制是基本一致的。在
DC
中对于不同类
型的
的文件,
一般有约定的扩展名。
在
控制数据的同时还必须注意对数据合理有效的组织,
一般,
在使
用
DC
综合的时候,
我们都会使用层次
化的目录结构来存放数据文件。
相对于不同的综
合策略,我们也
有两种不同的目录结构。
可以看出,
在应用自顶向下的综合策
略时,
由于综合是从顶层模块开始一次到各个模块,
所
以只需要一个综合目录。
而自底向上的综合则现对各个模块进行综合,<
/p>
因此可能有多个综合
目录。
2.2
、设计划分
< br>对设计的合理划分可以改善综合的结果,
减少操作的时间,
简化约束文件和脚本文件。
划分
直接影响设计中模块的大小,
如果模块太小,相当于人为的制造了一个界限,将限制
DC
有<
/p>
效的进行优化。另一方面,如果划分的模块太大,则会增加综合消耗的时间。
在划分的时候还要考虑设计的重用性,
主要应该注
意以下几点:
详细定义并记录设计的接口,
尽可能使接口标准化
,编写参数化的代码。
通常,我们设计的划分一般使用以下策略:
< br>(
1
)将相关的组合逻辑划分在一起
(
2
)消除胶连逻辑
(
3
)模块的输出都应
该使用寄存器
(
4
< br>)按照设计目标进行划分
按照编译技术划分,
将设计中使用不同编译技术的部分划分到不同的模块。
特别使当设计中<
/p>
既有高度结构化的逻辑(
ALU
),又有
随机逻辑时,应当将他们分开。因为对于结构化的
逻辑应该使用结构化编译,而对随机逻
辑,应该使用扁平化的编译。
可以将共享的资源划分到一起
将用户
定义的资源和他们驱动的逻辑划分到一起,
用户定义的资源包括用户定义的函数、
过
程、宏单元和
designware
元件。
DC
对于这些资源无法自动实现共享和
复制。因此,将他们
和它们所驱动的逻辑放在一起,我们就可以手工的插入多个元件来增
大驱动能力。
把顶层逻辑分成至少
3
级,将一些特殊的功能独立出来,如管脚、时钟、边界扫描和异步逻
辑等。
如下图所示,一般情况下,设计的最顶层是
I/O
管脚。下一层包括边界扫描、时钟处理、异
步逻辑和核心逻辑。
增加这一层是为了
I/O
管脚例化的灵活性
.
将时钟处理独立出来是为了对<
/p>
这部分进行详细的分析仿真。
将异步逻辑独立出来是为了可测性和
静态时序分析的问题限制
在一个比较小的范围之内。
设计划分的方法分为
HDL
划分和
DC
中的划分。
HDL
的划分就是根据上面一些原则通过
HDL
代码对设计进行划分。而
DC
中的划分是在
DC
中通过使用专门的命令,改变
HDL
中
的划分和层次的结构。
DC
< br>中提供了两个与此相关的命令:
group,ungroup
。
三、确定设计库
综合之前必须设定链
接库、目标库、
符号库和综合库。连接和目标库属于工艺库,
它
们定义
了半导体生产厂的工艺元件和其它信息。
符号库定义用于
design vision
或
design analyzer
中
的元件的符号表示
确定这些库是使用
DC
进行综合的前提条件,因此我们
必须掌握
DC
中库的命令的使用,以
便
DC
可以正确的使用库中的数据。
3.1
、工艺库
工艺库包括描述每个单元的功能和特性的信息。工艺库由半导体厂商提供和维护。
元件库包括元件名称、元件接脚名称、面积、时延信息、接脚负载。同时工艺库还定义了
实
现设计功能必须满足的条件。
这些条件也可以称作设计规则约
束。
除此之外,
工艺库还确定
了工艺的
工作条件和线载模型。
工艺库在
DC
中有下面一些用途:
(
1
)实现设计的功能,在
dc
综合过程中要将设计映射到某个工艺库,他们称作目标库。目
标库包括了所有用于生产
网表的元件以及设计工作条件的定义。
(
2
)
解析元件参考,在
dc
中用于解析元件参考的工艺库称为链接库。链接库中除了工艺库
外还可
能包括设计文件。
(
3
)计算时延和路径延时,链接库还定义了用于计算时延值和路径延时的时延模型
(
4
)计算消耗的功率
3.2
、设置库变量
在使用
dc
综合之前我们必须对库进行设置。具体的方
法是使用
dc_shell
中的变量来确定各
< br>种库。变量和库文件的定义见下表
在确定库的位置的时候,
我们可以使
用完整的路径也可以只用文件名。
如果只确定了文件名,
DC<
/p>
会在
search_path
变量确定的
搜索路径中查找这个文件。
在设置工艺库和链接库的时候要注
意:链接库包括了工艺库和设计文件。因此,
link_library
变量的值是工艺库加上一个星号
“
*
< br>”
,
表示链接时,
DC
既搜索工艺库,也搜索调入内存中的
设计文件。
除了设置库变量,
DC
还支持各种对库
的操作,如:读入和保存库,列出使用的库,显示库
的内容,确定库的对象甚至直接对库
对象进行操作。如下为一个工艺库的例子:
Cell(AND2
3)//
元件名称
(area:8.
000;//
元件面积
Pin(Y)(direction :output;
Timing()(
Related_pin:”A”;
Timing_sence:positive_unate;
Rise_propagation(drive_3
table_1)(values(“0.2626,0.2607…..”))
//
接脚延时
Fall_progp
agation(drive_3_table_3)(values(“0.1316,0.1331….”)
)
)
……..
)
Timing()(related_pin:”B”;
……………..
)
:”A&B”;//
接脚的功能描述
Max_capatiance:0.00220
Min_capatiance:0.00220
//
输出引脚的设计规则
)
Pin(A)(direction:input;
Capacitance:0.012000;)
Pin(B
)(direction:input;//
输入引脚的电器特性
Capacitance:0.010000;)
) <
/p>
四、
DC
对设计的一些操作
4.1
、读入文件
p>
下表列出了
DC
支持的所有文件类型
对于设计文件
,
可以使用两种方法读入。
使用
rea
d_file
命令或使用
analyze
和
elaborate
命令。
这两种
方法有一些区别。
简单的说,
前一种适用于各种类型的文件,<
/p>
而后一种主要用于综合
VHDL
和
verilog
文件。但是使用后者有一些特殊的功能。具体说来,<
/p>
analyze
的功能包括读
入
HDL
源文件,检查错误,产生独立于
HDL<
/p>
的中间类型的
HDL
库对象,存储中间文
件。
如果一个设计执行的
analyze
命令,只需要在这个设计改变之后再执行该操作。
Elaborate
命
令根据
analyze
产生
的中间文件产生一个与工艺无关的设计。
这个操作还将
HDL<
/p>
中的算术操
作用于
DESIGN
WARE
库中的元件替代,同时确定总线的宽度。
当设计读入内存之后,
它将转换为
synops
ys
内部数据库的格式。
DC
之后的综
合优化过程都
是对内存中的设计执行的。
(
1
)链接
对于一个完整的设计,
必须把所有的库元件和他们对应的设计参
考链接起来。
对于每一个设
计,
还必须
有一个参考来衔接子设计和链接库。
这一过程称为链接设计或参考解析。
换句话
说,
链接就是要在链接库中找到设计中使用的所
有元件和子设计,
保证设计的完整。
如果不
能正确的链接,则无法进行以后的综合等操作。
DC
p>
通过一下步骤完成参考解析:
首先,
它确定
哪个库元件和子设计在当前的设计中被使用。
然后,它在链接库中定位这些参考。最后,
把定位好的参考和设计链接起来。如图。
链接的操作可以自动
进行,也可以手工完成。当使用一些
DC
命令,如
compile
时会自动进
行链接。如果需要,也可
以使用
link
命令进行手工链接。
(
2
)对设
计和设计对象的操作
这些操作时<
/p>
DC
中的一些基本操作,和其它
EDA<
/p>
软件中的操作类似,如生成新设计、拷贝
设计、重新命名等。其中
比较重要的有以下几种:
设置当前设计。在
< br>DC
中,我们应当注意当前设计的概念,因为大多数的命令都是针对当前
设计进行的。一般说来,
如果成功的读入了一个设计之后,这个设计就会
作为当前设计。另
外,如果指定了一个当前设计,可以使用
cu
rrent_design
命令。
列
出设计和设计对象。使用
list_designs
命令来列出
内存中的设计,其中带
“
*
”
为当前设计。
下表也列出了显示设计对象信息的一些命令。
改变设计的层次,在
DC
中我们可以改变
HDL
所描述的设计层次关系。首先,使用
re
port_hierarchy
命令可以显示设计当前的层次关系。然后,使用
group
可以将一些元件或子
设计组合起来,
增加一个逻辑层次。或使用
ungroup
名去掉一个逻辑层次
。
编辑设计,使用下表列出的命令可以对设计对象进行编辑,
如生成,删除等。
Creat_cell
生成一个元件
Remove_cell
删除一个元件
Create_net
生成一个网络
Connect_net
连接一个网络
Disconnect_net
断开一个网络
Remove_net
删除一个网络
Create_port
生成一个端口
Remove_port
删除一个端口
Create_bus
生成一个总线
Remove_bus
删除一个总线
4.2
、属性的处理
属性描述了设计数据库中对象逻辑的电气、
物理和其它特性。
< br>一个属性通常都是附加给一个
设计对象并存储于设计数据库中。
< br>
DC
中,我们可以设置和使用以下一些对象的属性
p>
整个设计
设计对象,如时钟,网络和端口
设计中的子设计或元件的例化
工艺库,库元件
属性有自己的名称、类型和值。属性一般有以下几种类型:串、数或是逻辑。属性可以是< p>
DC
预设的,这些属性可以被
DC
识别;也可以是用户定义的。一些属性是只读的,其值由
DC
< br>设置,用户无法修改,另一些是用户可以自己修改的。
例如,我们经常使用
“
dout_touch
< br>”
属性,它可以付给网络,单元,端口或设计。而当我们需
要设置这个属性的时候,需要专门的命令:
set_dont_touch
而对于一般的属性,可以使用命令
set_attribute
来设置。
Design Compiler
综合脚本常用命令和模板
(2012-03-25 17:47:12)
转载
▼
标签:
分类:
微电子
dc
综合
script
杂谈
参照自己的设计,以及自己的工
艺信息,适当修改下面的
Constraints
和
Run
Script
等的脚本,添
加一些相
关的约束语句,就可以运行了详细
...
参照自己的设计,以及自己的工艺信息,适当修改下面的
Constraints
和
Run
Script
等的脚
本,添加一些相
关的约束语句,就可以运行了
详细的命令请参照
DC
的官方
User
Guide
等相关资料
。
Invoking Design Compiler
Unix% design_vision
#
Interactive GUI, WLM mode
Unix%
design_vision
–
topographical
# Interactive GUI, Topographical mode
Unix% dc_shell-t
#
Interactive shell, WLM mode
Unix%
dc_shell-t
–
topographical
# Interactive shell, Topographical mode
Unix% dc_shell-t
–
f | tee
–
i
# Batch mode
.synopsys_
set
search_path “$$search_path libs cons unmapped
rtl”
set synthetic_library
dw_
set
target_library
set link_library “*
$$target_library $$synthetic_library ”
set symbol_library
define_design_lib WORK
–
path ./work
set_svf
set_vsdc
history keep 200
set
sh_enable_page_mode false
set
cache_write .
set cache_read
$$cache_write
suppress_message {LINT-28
LINT-32 LINT-33 UID-401}
set
alib_library_analysis_path [get_unix_variable
HOME]
alias h history
alias
rc “report_constraint
-
all_violators”
TCL Commands and
Constructs
set PER 2.0 # Define a
variable and its value
echo $$PER #
Variable substitution à
2.0
set MARG 0.95
expr $$PER *
$$MARG # expr: *, /, +, -, >, <, =, <=, >=
set pci_ports [get_ports A] # Imbedded
command
set pci_ports [get_ports “Y??M
Z*”]
# Wildcards
echo
“Effctv P =
# Soft quotes
à
1.9
[expr
$$PERIOD * $$MARGIN]”
echo
{Effctv P = # Hard quotes
[expr $$PERIOD * $$MARGIN]} #
à
Effctv P = [expr $$PER * $$MARG]
# Comment line
set COMMENT
in_line; # In-line comment
set
MY_DESIGNS {B1.v ... B26.v}
#
foreach loop
foreach DESIGN $$MY_DESIGNS
{
read_verilog $$DESIGN
}
for {set i 1} {$$i < 27}
{incr i} { # for loop
read_verilog BLOCK_$$i.v
}
Helpful UNIX-like DC-shell
commands
pwd
cd
ls
history
!!
!7
!report
sh
printenv
get_unix_variable ARCH
Constraints
reset_design
set_max_area 0
create_clock -period 2
–
name Main_Clk [get_ports
Clk1]
create_clock
–
period 2.5
–
waveform {2 3.5} [get_ports
Clk2]
create_clock
–
period 3.5
–
name V_Clk; # VIRTUAL clock
set_clock_uncertainty
–
setup 0.14 [get_clocks *]
set_clock_uncertainty
–
setup 0.21
–
from [get_clocks Main_Clk]
–
to [get_clocks Clk2]
set_clock_latency
–
max 0.6 [get_clocks
Main_Clk]
set_clock_latency
–
source
–
max 0.3 [get_clocks
Main_Clk]
set_clock_transition 0.08
[get_clocks Main_Clk]
set_input_delay
-max 0.6 -clock Main_Clk [all_inputs]
set_input_delay
–
max 0.3
–
clock Clk2
–
clock_fall
–add_delay [get_ports “B E”]
set_input_delay -max 0.5 -clock
–network_latency_included V_Clk
[get_ports “A C F”]
set_output_delay -max 0.8 -clock
–
source_latency_included
Main_Clk [all_outputs]
set_output_delay
-max 1.1 -
clock V_Clk [get_ports “OUT2
OUT7]
set_max_capacitance
1.2 [all_inputs]
set_load 0.080
[all_outputs]
set_load [expr
[load_of slow_proc/NAND2_3/A] * 4] [get_ports
OUT3]
set_load 0.12 [all_inputs]
set_input_transition 0.12
[remove_from_collection [all_inputs][get_ports B]]
set_driving_cell
–
lib_cell FD1
–
pin Q [get_ports B]
set_operating_conditions
–
max WCCOM
set
auto_wire_load_selection false
set_wire_load_model
–
name 1.6MGates
set_wire_load_mode enclosed
set_wire_load_model
–name
200KGates [get_designs “SUB1 SUB2”]
set_wire_load_model
–
name 3.2MGates [get_ports
IN_A]
set_port_fanout_number 8
[get_ports IN_A]
set_false_path -from
[get_clocks Asynch_CLKA] -to [get_clocks
Asynch_CLKB]
set_multicycle_path
–
setup 4
–
from
–
from A_reg -through
U_Mult/Out
–
to B_reg
set_multicycle_path
–
hold 3
–
from
–
from A_reg -through
U_Mult/Out
–
to B_reg
set_isolate_ports
–
type inverter [all_outputs]
set_ideal_network [get_ports reset*
select*]
set_ideal_network [get_pins
FF_SET_reg/Q]
set_ideal_network
–
no_propagate [get_nets
CTRL]
set_ideal_latency 1.4 [get_ports
reset* select*]
set_ideal_transition
0.5 [get_pins FF_SET_reg/Q]
set_scan_configuration -style
Checking and Removing Constraints and
Directives
report_clock; report_clock
-skew
report_design
report_port
–
verbose
report_wire_load
report_path_groups
report_timing_requirements
(
–
ignored)
report_auto_ungroup
report_isolate_ports
write_script
–
output <>
check_timing
reset_path
–
from FF1_reg
remove_clock
remove_clock_transition
remove_clock_uncertainty
remove_input_delay
remove_output_delay
remove_driving_cell
remove_wire_load_model
Syntax Checking
Unix% dcprocheck constr_
Physical Constraints
–
Topographical Mode
set_aspect_ratio
set_utilization
set_placement_area
set_rectilinear_outline
set_port_side
set_port_location
set_cell_location
create_placement_keepout
Misc. Reports
# Generate A library report file
read_db library_
list_libs
redirect
–
file
reports/ {report_lib
report_hierarchy [-noleaf]
# Arithmetic implementation and