Design Compiler 使用简要说明
综合过程
Design Compiler可以针对层次化的组合电路或者时序电路的速度、面积和可布性进行优化。按照所定义的电路的测量特征所要达到的目标,Design Compiler综合一个电路并将其放入目标库中,这样可以生成适用于你的计算机辅助设计工程(CAE)工具的原理图或网表。
综合的过程如下图:
? 读入设计及其子设计。 ? 设置顶层的设计特性参数 ? 设置实际时序和面积目标参数
? 执行check_design验证设计,识别并且更正错误 ? 进行Design Compiler优化
练习介绍
在db、verilog、vhdl文件夹下设计内容都是一样的,只是形式不一样。
Db文件夹:
ALARM_BLOCK.db ALARM_COUNTER.db ALARM_SM.db ALARM_STATE_MACHINE.db COMPARATOR.db HOURS_FILTER.db MUX.db TIME_BLOCK.db TIME_COUNTER.db TIME_STATE_MACHINE.db CONVERTOR.pla CONVERTOR_CKT.db TOP.db
Verilog文件夹:
ALARM_BLOCK.v ALARM_COUNTER.v ALARM_SM.v ALARM_STATE_MACHINE.v COMPARATOR.v HOURS_FILTER.v MUX.v TIME_BLOCK.v TIME_COUNTER.v TIME_STATE_MACHINE.v CONVERTOR.pla CONVERTOR_CKT.v TOP.v
Vhdl文件夹:
ALARM_BLOCK.vhd ALARM_BLOCK.vhd ALARM_SM.vhd ALARM_STATE_MACHINE.vhd COMPARATOR.vhd HOURS_FILTER.vhd MUX.vhd TIME_BLOCK.vhd TIME_COUNTER.vhd TIME_STATE_MACHINE.vhd CONVERTOR.pla CONVERTOR_CKT.vhd TOP.vhd
设置path参数
将 Synopsys_installroot/arch/syn/bin加到.cshrc文件中。
设置Setup文件
.synopsys_dc.setup的读取顺序: 在启动时,Design Compiler将搜索三个Setup文件, 这三个文件都为.synopsys_dc.setup. 从这个文件中,软件工具读取初始化的信息,如使用那些库和如何定制你的图形环境等。尽管他们的名字相同,但是他们在不同的目录下。 1.Synopsys的根目录; 2.用户目录
3.启动Design_Compiler的当前目录 Tutorial——闹钟的设计
TOP
TOP是闹钟设计的最上层的模块,包括了对所有子模块的调用,而这些子模块都执行着闹钟设计的一个单独的功能。
ALARM_BLOCK
ALARM_BLOCK 是分级模块的第二级,它控制闹钟的设定。它有ALARM_BLOCK 有四个输入信号:
? ALARM 用来和HRS或MINS来设定闹铃时间 ? CLK 是系统时钟
? HRS用来和ALARM 来设定闹铃时间 ? MINS用来和ALARM 来设定闹铃时间
ALARM_BLOCK 有两个输出信号为:闹铃的小时和分钟。输出信号输出到MUX和COMPARATOR模块。
ALARM_BLOCK 实例化了两个子设计:
? ALARM_COUNTER 增加闹钟小时和分钟,并反映AM和PM设定。
? ALARM_STATE_MACHINE 设置闹钟时间。它有三个状态,如Figure 6-3.
TIME_BLOCK
TIME_BLOCK 类似于ALARM_BLOCK,只不过它是控制时间。它是分级模块中的第二级模块,有四个输入:
? SET_TIME 与 HRS or MINS 设置时间 ? CLK 式系统时间
? HRS 与SET_TIME 设置小时 ? MINS 与SET_TIME 设置分钟
小时和分钟是TIME_BLOCK 两个输出信号,他们输出到MUX和COMPARATOR模块。 TIME_BLOCK 实例化两个子模块。
? TIME_COUNTER增加时间和分钟,并且反映Am和PM设置
? TIME_STATE_MACHINE 用来设置和保存时间,状态机有3个状态,如Figure 6-4.
MUX
MUX 决定显示时间设置,使时间和闹铃的显示有效,它有5个输入信号: ? ALARM 与HRS 或 MINS 设置闹铃时间
? ALARM_HRS 是从ALARM_BLOCK输入的闹铃小时 ? ALARM_MIN 是从ALARM_BLOCK输入的闹铃分钟 ? TIME_HRS 是从TIME_BLOCK输入的闹铃小时 ? TIME_MIN 是从TIME_BLOCK输入的闹铃分钟 MUX 处理这些输入信号,并将结果输出到CONVERTOR_CKT, 使CONVERTOR_CKT 显示适当的时间和闹铃。缺省的显示是时间。当ALARM = 1, 显示闹铃。
COMPARATOR
COMPARATOR 比较时间和闹铃,它有四个主要的输入信号: ? ALARM_HRS 是从ALARM_BLOCK.来得小时闹铃信号 ? ALARM_MIN 是从ALARM_BLOCK来得分钟闹铃信号 ? TIME_HRS 是从TIME_BLOCK来得小时信号 ? TIME_MIN 是从TIME_BLOCK来得分钟信号
当闹铃和时间以及AM和PM都相等时,COMPARATOR 发出一个信号到ALARM_SM_2 模块。
ALARM_SM_2
ALARM_SM_2是有两个状态的状态机:IDLE 和 ACTIVATE, 如Figure 6-5.
CONVERTOR_CKT
CONVERTOR_CKT 分级的模块执行一个binary-coded-decimal (BCD)到 7段解码的功能。它将闹铃和时间的二进制表示转化为闹铃始终数字可以显示的信号。CONVERTOR_CKT 实例化两个子模块:
? CONVERTOR 在CONVERTOR_CKT设计中有两个实例。一个CONVERTOR实例转化将二进制表示的小时,另一个则转化分钟。CONVERTOR_CKT 为一个7段发光二极管显示准备转化好的信息。 ? HOURS_FILTER 使十位上的0的显示在10:00之前和12:59后失效。例如:九点的显示为9:00而不是09:00。
使用Design Analyzer设置设计环境 启动Design Analyzer Tsign_analyzer &
读入一个分级的设计 读入VHDL包
1. 选择 File > Read. 出现读文件的窗口。
2. 双击vhdl来进到vhdl目录。
3. 选择synopsys.vhd. 4. 点击OK.
出现VHDL 的窗口window并且显示行为。
5. 当Design Analyzer提示符(design_analyzer>) 出现, 在VHDL窗口中单击 Cancel。
读入最底层的设计模块
为了保证对所有模块的调用可以被正确的解析,我们要从设计的最底层模块开始读入,最后读入最上层的模块。
tutorial中最底层模块包括: ALARM_COUNTER
ALARM_STATE_MACHINE CONVERTOR (2) HOURS_FILTER TIME_COUNTER
TIME_STATE_MACHINE
使用read命令读入CONVERTOR因为它是PLA格式。.
分析VHDL设计
使用analyze和elaborate命令来读入五个VHDL文件。你可以一次性分析这些文件因为他们的格式相同,但是你必须分别elaborate他们。 当你分析这些设计模块是,Design Compiler将结果文件存在WORK目录下。
读入VHDL文件并且建立vhdl中间设计文件。 分析VHDL设计
1. 选择File > Analyze.
2. 用鼠标左键选择设计模块。选择ALARM_COUNTER.vhd。当你运行UNIX下的Design Analyzer来分析ALARM_COUNTER。
3.用鼠标中键选择其余的设计模块: ALARM_STATE_MACHINE.vhd HOURS_FILTER.vhd TIME_COUNTER.vhd
TIME_STATE_MACHINE.vhd 4. 点击OK.
出现分析窗口显示分析的命令,如Figure 7-3,设计中间文件存在work库文件中。
5. 点击Cancel关闭分析窗口。
Elaborate VHDL模块
分别Elaborate这五个VHDL模块。Elaborate命令将把设计文件的中间文件解析成.db 格式。 Elaborate每个VHDL模块:
1. 选择File > Elaborate.出现Elaborate设计窗口,如Figure 7-4。
2. 选择Library中的 WORK.
3. 选择Re-Analyze Out-Of-Date Libraries
4. 选择Design list中ALARM_COUNTER(BEHAVIOR). 5. 点击OK.
在Design Analyzer窗口中,出现ALARM_COUNTER的elaborated后的图标。
6. 重复上述elaboration过程(从第1步开始) ALARM_STATE_MACHINE (BEHAVIOR) HOURS_FILTER (BEHAVIOR) TIME_COUNTER (BEHAVIOR)
TIME_STATE_MACHINE (BEHAVIOR) 7. 点击Cancel关闭Elaborate窗口。 Designs view可以显示这些设计的图标
读入PLA 设计
使用Read命令来读入不是VHDL和Verilog格式的文件。CONVERTOR.pla 设计是PLA 格式的
读入CONVERTOR模块 1. 选择File > Read. 2. 选择.db目录
db目录有Synopsys .db格式的文件 3. 点击OK.
读文件的窗口出现并先是db目录中的设计文件。如Figure 7-7。
4. 点击滚动条,可以看到其他的文件。
读文件窗口列出了所有目录下的文件,但是只有.snopsys_dc.setup中view_read_file_suffix设定的后缀的文件可以显示出来。 5. 选择CONVERTOR.pla .如Figure 7-9
6. 选择Setup > Command Window. 7. 点击 读入文件窗口中的OK。
Design Analyzer 读入文件并关闭读入文件窗口。
Design Analyzer 显示用其它的图标来表示第三层的设计——CONVERTOR如Figure 7-11。
8. 最小化命令窗口
读入第二级设计 第二级包括: ALARM_BLOCK ALARM_SM_2 COMPARATOR CONVERTOR_CKT TIME_BLOCK MUX
象读入最底层设计一样analyze和elaborate上面的第二层设计
读入最上层设计
Analyze和elaborateTOP.vhd
当你读入了TOP模块后,全部的闹钟的设计的分级的层次结构都已经读入,并且显示在Designs View中有13个图标,如Figure 7-16.
用Design Analyzer设置特征参数:
在读入设计后,要说明设计的环境变量,这些环境变量包括了当信号到达端口(port)时,他们的的驱动能力,或者输出端口的负载能力。 本节就是描述如何来设置闹钟设计的这些参数。
为TOP模块设置参数
设置参数时可以使用Symbol view。 1.选择TOP.
2. 单击向下的箭头。
3. 点击Symbol View 按钮。
设置输入端口的驱动能力
假设除了CLK的所有输入端口的驱动能力为0.08(单位由目标库决定)。你可以同时选定并设定所有的要设定的输入端口。
1.使用鼠标左键来选择输入端口ALARM;
2.使用中间选择其他的除了CLK之外的所有的输入端口,见Figure 7-17。
设置驱动能力
1. 选择Attributes > Operating Environment > Drive Strength 显示Drive Strength 窗口,如Figure 7-18。
当你选择了一个端口时,在Port Name区域里会显示这个端口的名字,如果你选择了不知一个端口时,这个区域就会是空白的,而你在这个窗口输入的值将应用为所有选定的端口。 2. 在Rise Strength处键入0.08,而Fall Strength将自动会被设为0.08,因为“Same Rise and Fall”这个选项缺省的情况下是选定的。 3. 单击Apply。
你可以将端口的驱动的值设为与库中单元的输出引脚的驱动能力的值相同。当你不知道在库中你所需要地引脚的驱动值时,你可以使用drive_of 命令来找出并且设置这个值。假设CLK 的驱动值要设为与buffer单元B4I的Z引脚的驱动能力相同。
注意::
在例子中,我们用set_drive来设定驱动能力,然而set_driving_cell 比set_drive有更高的优先级。set_driving_cell命令将一个输入引脚和一个驱动单元相关联,而不是与一个具体的驱动的值相关联。
设置CLK的驱动能力
在这里,我们要将CLK的驱动能力设为与B4I的Z引脚的驱动能力相同。 1. 在Symbol view下,选择CLK。
2. 点击Rise Strength区域,按下Ctrl-u 来删掉值0.00。
3. 在Rise Strength 区域中,输入:drive_of (class/B4I/Z)。Design Analyzer 将该命令复制到Fall Strength区域。 4. 点击Apply。
Rise和fall的值(0.0335)出现在相应的框中,如Figure 7-19所示。
更改驱动能力
在设置过输入端口的驱动能力后,还可以对其进行修改。假设在本例子中,我们之前设置的输入端口SET_TIME的驱动能力不对,可以按下面的不走对其进行修改: 1. 选择SET_TIME端口。
2. 把Rise Strength的值改写为0.06,Fall Strength的值同时被更新为0.06。 3. 点击Apply。
4. 点击Cancel来关掉Drive Strength窗口。
设置输出端口的负载能力 设置SPEAKER_OUT的负载能力
负载能力用来对某个限定的模块的输出端口的负载的容量建模。你可以将端口的负载能力设置位于库单元的负载值相同。当你不清楚所需要的库单元的负载值时,使用load_of命令来决定和设置一个负载值。假设端口SPEAKER_OUT 驱动5个反向器,而反向器同库单元IVA(目标库中的一个反向器)相同。
1. 选择SPEAKER_OUT端口
2. 选择Attributes > Operating Environment > Load来打开Load窗口,如Figure 7-20。
3. 在Capacitive load 中填上load_of (class/IVA/A) * 5,在星号(*)前留个空。注意引脚A是IVA的输入端口。
4. 点击Apply,capacitive load 的值自动计算出来为7.50。SPEAKER_OUT 驱动能力为5个反向器,每个反向器的负载值为1.5,所以SPEAKER_OUT的负载值为 1.5*5 = 7.5。 5. 点击Cancel退出Load窗口。
设置总线的驱动能力
假设端口DISP1和DISP2每个的驱动能力都为3(标准负载),AM_PM_DISPLAY的驱动能力为2(标准负载)。
设置DISP1的驱动: 1. 选择DISP1。
2. 选择Attributes > Operating Environment > Load。 出现两个Load和Bus Selector窗口,如Figure 7-21。
使用Bus Selector窗口选择要设置参数的总线的位。在这个窗口中,所有的位都被选中。如果只想设置一个位的负载的话,只用选择某个位,然后在Load窗口中键入值即可。在这里,我们将整个总线设置相同的参数 3. 点击Cancel关闭Bus Selector窗口。 4. 在Capacitive load域中,键入3。
5. 点击Apply,负载值就被赋给了DISP1。
运用同样的过程将3赋给DISP2。
设置AM_PM_DISPLAY的负载能力 1. 选择AM_PM_DISPLAY。
2. 在Capacitive load域填入2。 3. 点击Apply。
4. 点击Load窗口中的Cancel。
为最上层模块设置其他的特性
有些特性是要为一个最上层模块设置的,但是并不是真对某个输入或输出端口。这些参数会对设计的优化产生一个全局的影响。这里我们要为TOP模块设置如下参数: ? Wire Load
? Operating Conditions
设置Wire Load
Design Compiler 优化以线网的扇出为基础来从连线负载(wire load)模型来估计连现长度。Design Compiler 使用这个信息来计算连线长度和传输延迟。
连线负载(wire load)模型由估计的die的大小来决定。在目标库中连线负载都有定义 如果ASIC的库支持的话,Design Compiler 以面积为基础自动选择连线负载表
1. 选择TOP。
2. 选择Attributes > Operating Environment > Wire Load,出现Wire Load窗口,如Figure 7-22,
3. 选择10x10 (class),在库文件的定义中,10x10 对应于的die的大小为1 mm x 1 mm。 4. 点击OK。
设置运行条件(Operating Conditions)
运行条件就是温度、过程、运行电压等。目标库定义了这些运行条件。库的生产厂商定一个一个与其他昌上不同的默认的运行条件。通用的默认的运行条件为: ? 温度 – 25?C ? 过程 – 1 ? 电压 – 5
Design Compiler 的静态时序分析是对设计的驱动能力,到达时间以及负载能力的变化对电路时序特征所带来的影响建模。同样,你能个分析一个设计的最好、中等、最坏特性或运行条件。
设置运行条件:
1. 选择Attributes > Operating Environment > OperatingConditions.
Operating Conditions窗口如Figure 7-23所示,其间列出了目标库中的运行条件。每一个运行条件的后面都有括号包括着目标库的名字。
2. 选择WCCOM (class),在这里,我们假设运行条件为最差的情况(WCCOM),按目标库中定义的,温度为70.0 F,过程为1.5,电压为4.75。 3. 点击OK.
保存设计
在设置完设计的特性后,保存文件 将TOP模块保存为.db格式,
1. 选择File > Save As 打开Save Design窗口,文件名显示为TOP.db。 2. 改变目录到tutorial/db/ directory.
3. 输入TOP_attributes.db 作为文件名,并保存这个文件。
4. 检查“Verify that the Save All Designs in Hierarchy option ”设置为on。 5. 点击OK。Design Analyzer保存了设计和所设置的特性参数。
使用dc_shell来设置设计环境
Starting dc_shell in UNIX
dc_shell 提供了两种命令行模式。dcsh模式使用的是Synopsys开发的命令行语言。Tcl 模式是基于Tool Command Language (Tcl)的。启动Design Compiler, 键入dc_shell命令,dcsh模式是默认的模式,使用-tcl_模式开关来运行Tcl模式。 % dc_shell ---启动dc_shell的dcsh模式。 dc_shell> 或者
% dc_shell -tcl_mode ---启动dc_shell的Tcl模式 dc_shell-t>
使用dc_shell读入层次化设计
在执行这些操作的过程中,dc_shell模式会反馈回一个数字“1”,表示命令成功完成。
读入一个层次化设计
简化一个大而复杂的设计的方法就是将它分为小的部分,每个部分都完成一个功能,这些小的部分就为子模块。一个设计韩又一个或多个子模块就是一个层次化的设计。层次化设计可以含有多个层,每层含有一个或多个子模块。最上层模块则调用或引用这些子模块。 Alarm Clock设计是个层次化设计,TOP是最上层模块。
在任何时候使用dc_shell保存设计
保存设计设置,将使用dc_shell的write命令。这个命令将整个设计写入磁盘。其语法: write [-format format] [-hierarchy] [-no_implicit][-modified] [-output file] [-library library_name][design_list] [-names_file mapping_name_files][-donot_expand_dw]
读入VHDL包
如果你要使用VHDL格式,那么必须要在读入设计文件前先读入VHDL包。包的文件名为synopsys.vhd,它在vhdl 目录下。 ?键入下面的命令:
dc_shell> read -format vhdl {“./vhdl/synopsys.vhd”} 或者
dc_shell-t> read_file -format vhdl [list {./vhdl/synopsys.vhd}]
例子输出
在成功之行Read命令后,dc_shell输出如下内容:
Loading db file ‘/usr/synopsys/myarch/libraries/syn/standard.sldb’ Loading db file ‘/usr/synopsys/myarch/libraries/syn/gtech.db’ Loading vhdl file ‘/usr/synopsys/tutorial/vhdl/synopsys.vhd’ Reading in the Synopsys vhdl primitives. /bohm/tutorial/vhdl/synopsys.vhd:
Information: Saving the package ‘synopsys’. (HDL-202) No designs were read {}
读入最低层的设计
Analyzing the VHDL Designs
使用analyze和elaborate命令来读入五个VHDL文件
dc_shell> analyze -format vhdl -lib WORK {./vhdl/ALARM_COUNTER.vhd,
./vhdl/ALARM_STATE_MACHINE.vhd,
./vhdl/HOURS_FILTER.vhd, ./vhdl/TIME_COUNTER.vhd,
./vhdl/TIME_STATE_MACHINE.vhd}
或
dc_shell-t> analyze -format vhdl -lib WORK [list ./vhdl/ALARM_COUNTER.vhd
./vhdl/ALARM_STATE_MACHINE.vhd ./vhdl/HOURS_FILTER.vhd ./vhdl/TIME_COUNTER.vhd
./vhdl/TIME_STATE_MACHINE.vhd]
例子输出
/bohm/tutorial/vhdl/ALARM_COUNTER.vhd:
/bohm/tutorial/vhdl/ALARM_STATE_MACHINE.vhd: /bohm/tutorial/vhdl/HOURS_FILTER.vhd: /bohm/tutorial/vhdl/TIME_COUNTER.vhd:
/bohm/tutorial/vhdl/TIME_STATE_MACHINE.vhd: 1
注意:
在这个输出的例子甚至全文中,这个作为结尾的输出的“1”表示命令成功执行。
Elaborate VHDL设计
分别Elaborate五个VHDL设计。Elaborate命令将分析analyze产生的中间文件转变为.db格式。在分析(analyze)VHDL的设计时,我们将结构设定为BEHAVIOR。在默认得情况下,VHDL的结构(architecture)为architecture。你使用analyzer加-lib参数来指明映射的目录,缺省的状态下,Design Compiler检查WORK目录。
Elaborate
? dc_shell> elaborate ALARM_COUNTER -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate ALARM_STATE_MACHINE -arch “BEHAVIOR” -lib WORK update dc_shell> elaborate HOURS_FILTER -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate TIME_COUNTER -arch “BEHAVIOR” -lib WORK -update
dc_shell> elaborate TIME_STATE_MACHINE -arch “BEHAVIOR” -lib WORK -update 或者
dc_shell-t> elaborate ALARM_COUNTER -arch {BEHAVIOR} -lib WORK -update
dc_shell-t> elaborate ALARM_STATE_MACHINE -arch {BEHAVIOR} -lib WORK update dc_shell-t> elaborate HOURS_FILTER -arch {BEHAVIOR} -lib WORK -update dc_shell-t> elaborate TIME_COUNTER -arch {BEHAVIOR} -lib WORK -update
dc_shell-t> elaborate TIME_STATE_MACHINE -arch {BEHAVIOR} -lib WORK -update
例子输出
dc_shell> elaborate ALARM_COUNTER -arch “BEHAVIOR” -lib WORK -update
Inferred memory devices in process
in routine ALARM_COUNTER line 11 in file ’/bohm/tutorial/vhdl/ALARM_COUNTER.vhd’.
===================================================================== Register Name | Type | Width | Bus | MB | AR | AS | SR | SS | ST
===================================================================== AM_PM_OUT_reg | Flip-flop | 1 | - | - | N | N | N | N | N HOURS_OUT_reg | Flip-flop | 4 | Y | N | N | N | N | N | N MINUTES_OUT_reg | Flip-flop | 6 | Y | N | N | N | N | N | N
===================================================================== Current design is now ’ALARM_COUNTER’ 1
Reading In the PLA Design
使用read命令来读入非VHDL和Verilog的设计文件。CONVERTOR.pla是PLA 格式。所以读入该文件用如下命令:
?dc_shell> read -format pla {“./vhdl/CONVERTOR.pla”} 或者
dc_shell-t> read_file -format pla [list {./vhdl/CONVERTOR.pla}]
Example Output
dc_shell> read -format pla {“./vhdl/CONVERTOR.pla”} Loading pla file ‘/bohm/tutorial/vhdl/CONVERTOR.pla Current design is now ‘/bohm/tutorial/vhdl/ CONVERTOR.db:CONVERTOR’ {“CONVERTOR”}
读入第二层模块 分析VHDL设计文件
? dc_shell> analyze -format vhdl -lib WORK {./vhdl/ALARM_BLOCK.vhd,
./vhdl/ALARM_SM_2.vhd, ./vhdl/COMPARATOR.vhd, ./vhdl/CONVERTOR_CKT.vhd, ./vhdl/MUX.vhd,
./vhdl/TIME_BLOCK.vhd}
或者
dc_shell-t> analyze -format vhdl -lib WORK [list ./vhdl/ALARM_BLOCK.vhd
./vhdl/ALARM_SM_2.vhd ./vhdl/COMPARATOR.vhd ./vhdl/CONVERTOR_CKT.vhd ./vhdl/MUX.vhd
./vhdl/TIME_BLOCK.vhd]
Elaborate VHDL设计文件
ALARM_BLOCK ALARM_SM_2 COMPARATOR CONVERTOR_CKT TIME_BLOCK MUX
?dc_shell> elaborate ALARM_BLOCK -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate COMPARATOR -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate CONVERTOR_CKT -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate MUX -arch “BEHAVIOR” -lib WORK -update
dc_shell> elaborate TIME_BLOCK -arch “BEHAVIOR” -lib WORK -update dc_shell> elaborate ALARM_SM_2 -arch “BEHAVIOR” -lib WORK -update 或者
dc_shell-t> elaborate ALARM_BLOCK -arch {BEHAVIOR} -lib WORK -update dc_shell-t> elaborate COMPARATOR -arch {BEHAVIOR} -lib WORK -update dc_shell-t> elaborate CONVERTOR_CKT -arch {BEHAVIOR} -lib WORK -update dc_shell-t> elaborate MUX -arch {BEHAVIOR} -lib WORK -update
dc_shell-t> elaborate TIME_BLOCK -arch {BEHAVIOR} -lib WORK -update dc_shell-t> elaborate ALARM_SM_2 -arch {BEHAVIOR} -lib WORK -update
粒子输出
dc_shell> elaborate ALARM_SM_2 -arch “BEHAVIOR” -lib WORK -update Inferred memory devices in process ‘SYNCH’ in routine ALARM_SM_2 line 32 in
file ‘/bohm/tutorial/vhdl/ALARM_SM_2.vhd’.
==================================================================== Register Name | Type | Width | Bus | MB | AR | AS | SR | SS | ST
===================================================================== Current State | Flip-flop | 1 | - | - | N | N | N | N | N
===================================================================== Current design is now ‘ALARM_SM_2’ 1
读入最上层设计模块 分析最上层设计模块
?dc_shell> analyze -format vhdl -lib WORK {“./vhdl/TOP.vhd”} 或
dc_shell-t> analyze -format vhdl -lib WORK [list {./vhdl/TOP.vhd}]
例子输出
/bohm/tutorial/vhdl/TOP.vhd: 1
Elaborate
?dc_shell> elaborate TOP -arch “BEHAVIOR” -lib WORK -update 或
dc_shell-t> elaborate TOP -arch {BEHAVIOR} -lib WORK -update
例子输出
Current design is now ‘TOP’ 1
使用dc_shell接口设置参数 设置输入端口的驱动能力
假设所有的输入端口(除了CLK)的驱动能力都是0.08。假设CLK的驱动能力与单元B4I的Z引脚相同,你可以设定端口驱动能力的值与库单元的输出引脚的驱动能力相同。当你不清楚具体的值时,你可以使用drive_of命令来找到并且设置这个驱动的值。 dc_shell> set_drive -rise .08 “ALARM” dc_shell> set_drive -fall .08 “ALARM” dc_shell> set_drive -rise .08 “HRS” dc_shell> set_drive -fall .08 “HRS” dc_shell> set_drive -rise .08 “MINS” dc_shell> set_drive -fall .08 “MINS”
dc_shell> set_drive -rise .08 “SET_TIME” dc_shell> set_drive -fall .08 “SET_TIME”
dc_shell> set_drive -rise .08 “TOGGLE_SWITCH” dc_shell> set_drive -fall .08 “TOGGLE_SWITCH” 或
dc_shell-t> set_drive -rise .08 {ALARM} dc_shell-t> set_drive -fall .08 {ALARM} dc_shell-t> set_drive -rise .08 {HRS} dc_shell-t> set_drive -fall .08 {HRS} dc_shell-t> set_drive -rise .08 {MINS} dc_shell-t> set_drive -fall .08 {MINS}
dc_shell-t> set_drive -rise .08 {SET_TIME} dc_shell-t> set_drive -fall .08 {SET_TIME}
dc_shell-t> set_drive -rise .08 {TOGGLE_SWITCH} dc_shell-t> set_drive -fall .08 {TOGGLE_SWITCH}
注意:
如果你没有声明-rise 或者 –fall选项,两个同时都被设定。
例子输出
下面的输出是当你设定端口ALARM的上升(rise)驱动能力时: Performing set_drive on port ‘ALARM’. 1
下面的输出是当你设定端口ALARM的下降(fall)驱动能力时: Performing set_drive on port ‘ALARM’. 1
设置CLK的驱动能力
?dc_shell> set_drive -rise drive_of (class/B4I/Z) “CLK” dc_shell> set_drive -fall drive_of (class/B4I/Z) “CLK” 或者
dc_shell-t> set_drive -rise [drive_of {class/B4I/Z}]{CLK} dc_shell-t> set_drive -fall [drive_of {class/B4I/Z}]{CLK}
例子输出
当你设置上升rise或下降(fall)驱动能力与B4I的Z引脚相同时,dc_shell输出如下: Performing drive_of on port ‘Z’. Performing set_drive on port ‘CLK’ 1
设置输出端口的负载能力 设置SPEAKER_OUT的负载
?dc_shell> set_load load_of (class/IVA/A) * 5 “SPEAKER_OUT” 或
dc_shell-t> set_load [expr [load_of {class/IVA/A}] * 5] {SPEAKER_OUT}
例子输出
Performing load_of on port ‘A’
Performing set_load on port ‘SPEAKER_OUT’ 1
设置总线为的负载输出
假设端口DISP1 和DISP2每个都可以驱动3 (标准驱动),而AM_PM_DISPLAY 可以驱动2 (标准驱动).
设置DISP1的负载能力
? dc_shell> set_load 3.0 “DISP1[13]” dc_shell> set_load 3.0 “DISP1[12]” dc_shell> set_load 3.0 “DISP1[11]”
dc_shell> set_load 3.0 “DISP1[10]” dc_shell> set_load 3.0 “DISP1[9]” dc_shell> set_load 3.0 “DISP1[8]” dc_shell> set_load 3.0 “DISP1[7]” dc_shell> set_load 3.0 “DISP1[6]” dc_shell> set_load 3.0 “DISP1[5]” dc_shell> set_load 3.0 “DISP1[4]” dc_shell> set_load 3.0 “DISP1[3]” dc_shell> set_load 3.0 “DISP1[2]” dc_shell> set_load 3.0 “DISP1[1]” dc_shell> set_load 3.0 “DISP1[0]” 或
dc_shell-t> set_load 3.0 {DISP1[13]} dc_shell-t> set_load 3.0 {DISP1[12]} dc_shell-t> set_load 3.0 {DISP1[11]} dc_shell-t> set_load 3.0 {DISP1[10]} dc_shell-t> set_load 3.0 {DISP1[9]} dc_shell-t> set_load 3.0 {DISP1[8]} dc_shell-t> set_load 3.0 {DISP1[7]} dc_shell-t> set_load 3.0 {DISP1[6]} dc_shell-t> set_load 3.0 {DISP1[5]} dc_shell-t> set_load 3.0 {DISP1[4]} dc_shell-t> set_load 3.0 {DISP1[3]} dc_shell-t> set_load 3.0 {DISP1[2]} dc_shell-t> set_load 3.0 {DISP1[1]} dc_shell-t> set_load 3.0 {DISP1[0]}
Shortcut:
可以set_load 3.0 “DISP1[*]”来取代上面的命令,达到一样的结果。
设置DISP2的负载能力
?dc_shell> set_load 3.0 “DISP2[13]” dc_shell> set_load 3.0 “DISP2[12]” dc_shell> set_load 3.0 “DISP2[11]” dc_shell> set_load 3.0 “DISP2[10]” dc_shell> set_load 3.0 “DISP2[9]” dc_shell> set_load 3.0 “DISP2[8]” dc_shell> set_load 3.0 “DISP2[7]” dc_shell> set_load 3.0 “DISP2[6]” dc_shell> set_load 3.0 “DISP2[5]” dc_shell> set_load 3.0 “DISP2[4]”
dc_shell> set_load 3.0 “DISP2[3]” dc_shell> set_load 3.0 “DISP2[2]” dc_shell> set_load 3.0 “DISP2[1]” dc_shell> set_load 3.0 “DISP2[0]” 或
dc_shell-t> set_load 3.0 {DISP2[13]} dc_shell-t> set_load 3.0 {DISP2[12]} dc_shell-t> set_load 3.0 {DISP2[11]} dc_shell-t> set_load 3.0 {DISP2[10]} dc_shell-t> set_load 3.0 {DISP2[9]} dc_shell-t> set_load 3.0 {DISP2[8]} dc_shell-t> set_load 3.0 {DISP2[7]} dc_shell-t> set_load 3.0 {DISP2[6]} dc_shell-t> set_load 3.0 {DISP2[5]} dc_shell-t> set_load 3.0 {DISP2[4]} dc_shell-t> set_load 3.0 {DISP2[3]} dc_shell-t> set_load 3.0 {DISP2[2]} dc_shell-t> set_load 3.0 {DISP2[1]} dc_shell-t> set_load 3.0 {DISP2[0]}
例子输出
Performing set_load on port ‘DISP1[13]’. 1
设置AM_PM_DISPLAY的负载
? dc_shell> set_load 2.0 “AM_PM_DISPLAY” 或
dc_shell-t> set_load 2.0 {AM_PM_DISPLAY}
例子输出
Performing set_load on port ‘AM_PM_DISPLAY’. 1
设置最上层模块的其他参数 设置Wire Load
dc_shell> set_wire_load “10x10” -library “class” 或
dc_shell-t> set_wire_load {10x10} -library {class}
例子输出
Using wire_load model ‘10x10’ found in library ‘class’.
设置操作条件
?dc_shell> set_operating_conditions -library “class” “WCCOM” 或
dc_shell-t> set_operating_conditions -library {class} {WCCOM}
例子输出
Using operating conditions ‘WCCOM’ found in library ‘class’.
保存设计
?dc_shell> write -format db -hierarchy -output “./db/TOP_attributes.db” {“TOP.db:TOP“} 或
dc_shell-t> write -format db -hierarchy -output {./db/TOP_attributes.db} [list {TOP.db:TOP }]
对应的,dc_shell会显示如下信息:
Writing to file /bohm/tutorial/db/TOP_attributes.db Then quit dc_shell, or go on to the next chapter. 退出
?dc_sehll>quit
确定优化目标和设置限制条件
在优化一个设计的过程中,Design Compiler的算法将评估如何可以最好的执行一个设计。你可以通过在优化前设置优化目标来引导Design Compiler的决定。这些优化目标称为限制条件。限制条件是可测量的电路的特征参数,如时序、面积、功耗等。 在优化的过程中,Design Compiler检查你这些限制目标参数,并试图在把设计综合到工艺库的时候满足这些条件。工艺库中含有重要的时序、面积和功耗的规范。在优化时,Design Compiler根据工艺库中的规范和你设计的限制条件来创建复杂的模型并进行详细的计算。为了得到精确的结果,要定义越符合实际情况的限制条件越好。你也可以设置限制条件来规范内部的设计时序、端口的逻辑和电气连接和子模块的接口。
准备工作
在进行本部分前,是否完成下面的操作: Design Analyzer部分:
1. 如果Design Analyzer还没有运行,在tutorial目录下启动它。 2. 读入TOP_attributes.db,它是在前面产生的设计文件。 3. 产生TOP的Symbol view.
dc_shell Command-Line部分:
1. 如果dc_shell没有运行,在tutorial目录下启动它。
2. 读入TOP_attributes.db。
dc_shell> read -format db {“./db/TOP_attributes.db”} 或
dc_shell-t> read_file -format db [list {./db/TOP_attributes.db}]
删除已经设置的限制条件 ?remove_constraint -all
此命令不能删除设计环境参数。
关于设置设计限制条件
限制条件是一个设计的性能目标参数,一般定义了最大面积和时序目标参数,如最大或最小延迟以及时钟规范。然后线是条件也定义其他的一些要求,如最大允许功耗、设计的可布性等。
把你的限制条件设置的跟你的设计目标很接近,就可以从Design Compiler的到最好的结果。如果时序目标设置的比实际的低(例如,0),优化时就会将buffer加入到关键路经重或者在多负载的线网上重复逻辑。所以,一个不切实际的时序目标会导致答的面积增加。使用切合实际的时序目标可以使优化产生最小的复合限制条件的电路。如果你不设置一个时序目标,缺省状态下,Design Compiler在优化规则中只应用设计规则作为限制条件。设计规则是受你要映射的工艺影响。
决定实际的目标参数
一般来说,时钟周期、定时数(timing numbers)以及电路的面积都会由设计规范来提供。这样,目标在开始阶段就看明确。然而,目标参数也可能没有在设计规范中或者说只有一个子模块需要优化。当优化一个子模块时,你可能知道整个设计的目标参数,却不知道子模块的。如果实际的目标参数都不知道,就把整个设计或子模块直接映射到门,而不用设置限制条件。这样映射可以帮助决定当前设计的速度。使用这个速度来决定限制条件的一个起始点。随着你在编译设计,你就可以更新你的限制条件。如果一个设计当前是网表的形式(已经映射到门了),你可以使用derive_timing_constraints 命令来得到确切的限制条件。
我们假设练习中限制条件都是符合实际的。
关于设置TOP模块的目标参数
模块TOP的时钟周期为1秒。如果你定义时钟周期为1秒位设计目标, Design Compiler可以轻易的达到,应为库单元的延时为钠秒级的(nanoseconds)。设置一个更严格的时序限制条件,假设闹钟要在以25ns(40MHz)为周期运行。另外信号必须要在下一个时钟周期(25ns)前到达输出端口。为达到这个目标,限制输出端口要求信号的到达时间早于20ns。假设设计面积不能超过1100门。你不需要设置面积的限制条件。优化产生最小电路可以满足时序限制。
使用Design Analyzer来设置设计限制条件
设置时钟限制条件
时序电路一般都有时钟。通过对时序电路的输入和输出端口设置时钟延迟来设置限制条件。组合逻辑不用时钟。所以你在设置输入和输出延时时必须创建一个虚拟的时钟。在练习中,在定义输入与输出延时前,创建一个虚拟的时钟。一个时钟又一个源,这个源可以为一个设计的输入端口,也可以一个器件的输出端口。一个时钟对象可以附着于一个时钟源。以闹钟设计为例,时钟源为端口CLK。时钟对象在Schematic view里表现为一个小的波形符号,在它的边上是所要附着的时钟源。
设置CLK的时钟对象
1. 在Symbol view选择CLK。
2. 选择Attributes > Clocks > Specify,Specify Clock window见Figure 8-1。
3. 在Period中键入25。
当该值被应用后,一个建立时间的限制就被设置到每个触发器由CLK驱动的D引脚。“Fix Hold”选项如果被选的话,将会使Design Compiler解决(fix)保持时间冲突(violated hold times)。一般来说,你要求Design Compiler先解决建立时间(setup time)的冲突,然后在遍以后,你检查保持时间。如果编译后存在保持时间的冲突,你把“Fix Hold”选定后再重新编译。 4. 点击Apply。
5. 点击Cancel关闭Specify Clock窗口。
时钟的限制条件就被设置了。注意在Specify Clock窗口中的值没有变化。CLK的时钟对象
被建立了。注意有个小波形贴在CLK端口旁边。如Figure 8-2.
设置延迟限制条件
输入延迟是对到达输入端口的外部延迟的建模。输入延迟被定义为一个实数或虚拟时钟。 输出延迟是对离开输出端口得延迟的建模。输出延迟必须被定义为实数或虚拟时钟来作为路径的限制条件。输出延迟与下一个上升延的时序相关。时钟的周期设为25ns,而输出信号的达到时间为20ns。这个时间关系定义了所有输出端口的输出的延时为5 ns。
设定输出端口的限制条件: 1. 选择4个TOP的输出端口。
2. 选择Attributes > Operating Environment > Output Delay。Output Delay window如Figure 8-3。
3. 选择CLK。
CLK变成高亮,并且在Relative To Clock处显示出CLK的值。 4. 在Max Rise和Max Fall处输入5。 5. 点击Apply。
6. 点击Cancel来关掉Output Delay 窗口。
Design Analyzer设置输出端口的限制条件,并且显示如下信息: Output delay attributes set on selected paths
检查设计,发现和修改错误:
当你在编译一个设计前,而在你设置完限制条件后,检查设计,确定和修改问题。这个过程检查设计的内部表达是否正确,并且会产生相应的警告或者错误。 检查设计
1. 选择Analysis > Check Design。Check Design窗口如Figure 8-4。
缺省时, Detailed Warnings和Check All Levels时被选定的。这些选项提供了鲜明的警告和错误信息,并且检查分级设计中的所有的子模块。
2. 点击并选择Check Timing。Check Timing将检查设计的时序特性。 3. 点击OK。出现Design Errors窗口如Figure 8-5。
CONVERTOR_CKT和CONVERTOR有警告信息。
显示出显Warning的区域
1.移动Design Errors的窗口到Design Analyzer窗口旁边,使得两个窗口都可以全部看见。
警告信息呈高亮状态,并且按钮Show和Next有效。
3. 点击Show,Design Analyzer 显示一个包含警告信息的设计区域的特写视图。
在Schematic view 中选定CONVERTOR,CONVERTOR的名字就出现在message area。 CONVERTOR的实例名为U7,它是CONVERTOR_CKT的子模块。
检查额外的信息
1. 在Design Errors窗口中点击Next,令第二条信息高亮: Pin ‘T0’ is connected to logic 0.
Pin T0 is selected in the schematic. Design Analyzer updates the schematic in the Design Analyzer window.
2. 点击Next令下一条消息高亮。:
Pin ‘T1’ is connected to logic 0.
Pin ‘T1’ is selected in the schematic.
3. 放大包含有引脚T0和T1区域。因为缺省情况下,引脚名称是被关闭(turn off)的,所以,引脚名T0和T1没有显示在原理图中。原理图由透明的层组成,每个层都包含了不同的信息。一个层的信息可见只有当其被打开(turn on)的时候。
显示引脚名称层
1. 选择View > Style。出现View Style窗口,如Figure 8-8。
浏览这些层的列表,每个层的名称描述它要显示的文字和图表。 使用View Style 窗口来看层的设定和设置额外的层。 2. 选择pin_name_layer,
3. 点击并选择Visible的On,然后点击Apply。 The schematic displays pin names. 4. 点击Cancel关掉View Style window。
检查其它的错误
1. 点击Design Errors窗口中的Next。 这个消息与前面看到的3个信息相关:
Warning: In design ‘CONVERTOR_CKT’, the same net is connected to more than one pin on submodule ‘U7’. (LINT-33)
Net ‘data_in1[5]’ is connected to pins ‘T0’, ‘T1’.
这个信息和前面的信息之所以报出是因为当输出端口没有连接时,会被Design Compiler
自动与逻辑0相连。所以这些警告并没有反映设计中的问题,你可以忽略他们。
2. 点击Next。
Warning: Design ‘CONVERTOR’ is instantiated 2 times. (LINT-45) Cell ‘U7’ in design ‘CONVERTOR_CKT’ Cell ‘U8’ in design ‘CONVERTOR_CKT’
这个错误之所以出现是因为在CONVERTOR_CKT中CONVERTOR被引用了不只一次。在优化前分解这个多重CONVERTOR实例(在后面我们会讲到)。 3. 点击Cancel关闭Design Errors窗口。
分解多重实例
分级设计会多次引用以个子模块。当同一个子模块在一个设计中被引用不只一次时,多个实例会存在于设计中。要在编译前分解多重设计实例。有三个方法可以分解:
设置优化目标和设置限制条件
? 用compile-once-don’t-touch方法 (set_dont_touchcommand)。 这个方法通过设置dont_touch 参数于单元或references,在优化设计的过程中保存子模块 ? 去掉层次。 (ungroup command).
这个方法去掉层次并产生以一个设计,其中所有的单元和references都只有唯一的名。 ? 通过复制每个实例,是的每个实例都是唯一的,(uniquify command)。
这个方法在当前的分层的设计中产生一个设计,其中所有的单元和references都有唯一的名字。
我们在这里使用第三种方法。uniquify multiple命令使得子模块在每次引用使都都创造出一个复制,并被赋予一个唯一的名称。在编译过程中,Design Compiler将每个实例都优化映射到他们各自的环境中。
对于闹钟设计, uniquify这个选择是最有效的,因为所有的CONVERTOR的实例都需要针对他们各自的环境来优化,而且他们的层次化需要保留。
1. 在CONVERTOR_CKT 的Schematic view中点击两次向上的箭头。 2. 选择Designs view并选择TOP模块。
3. 选择Edit > Uniquify > Hierarchy,针对TOP的uniquify命令开始运行,命令的结果显示在命令窗口中,如Figure 8-10。
在Designs view中, 信息“Design TOP uniquified” 和两个新的PLA图标出现—
CONVERTOR_0 和CONVERTOR_1—它们对应于TOP中的两个CONVERTOR实例。如Figure 8-11. During optimization, CONVERTOR_0 and CONVERTOR_1 are
optimized in the context of their different environments.
保存设计
1. 选定TOP模块。
2. 选择File > Save As。
3. 改换到db目录下。
4. 将设计报存为TOP_before_compile.db。
5. 点击并选择“Save All Designs in Hierarchy”。 6. 点击OK。
然后退出Design Analyzer。 选择File > Quit.
使用dc_shell设置设计限制条件 设置时钟限制条件
dc_shell> create_clock -name CLK -period 25 -waveform { 0 12.5 } { CLK } 或
dc_shell-t> create_clock -name CLK -period 25 -waveform [list 0 12.5 ] [list CLK ] 选项 –name规定了时钟的名称,-period规定了以库中时间单位的时钟波形的周期, -waveform给出了以库中单位时间为基础的时钟的上升沿和下降沿时间。dc_shell会有如下相应的输出:
Performing create_clock on port, ’CLK’.
设置延迟限制条件
在设计中,你可以使用optgoals.script或者optgoals.tcl script 文件。
这两个文件包含了设置延时限制条件的这些命令。通过使用这两个文件,就不用一个一个地输入命令来进行设置,而可以由文件控制一次性的将这些限制条件设置到输出端口。 dc_shell> set_output_delay -clock CLK -max -rise 5 “SPEAKER_OUT” dc_shell> set_output_delay -clock CLK -max -fall 5 “SPEAKER_OUT” dc_shell> set_output_delay -clock CLK -max -rise 5 “AM_PM_DISPLAY” dc_shell> set_output_delay -clock CLK -max -fall 5 “AM_PM_DISPLAY” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP2[13]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP2[13]” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP2[12]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP2[12]” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP2[11]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP2[11]” . . .
dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP2[0]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP2[0]” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP1[13]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP1[13]” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP1[12]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP1[12]” dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP1[11]”
dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP1[11]” . . .
dc_shell> set_output_delay -clock CLK -max -rise 5 “DISP1[0]” dc_shell> set_output_delay -clock CLK -max -fall 5 “DISP1[0]” 或,
dc_shell-t> set_output_delay -clock CLK -max -rise 5 {SPEAKER_OUT} dc_shell-t> set_output_delay -clock CLK -max -fall 5 {SPEAKER_OUT} dc_shell-t> set_output_delay -clock CLK -max -rise 5 {AM_PM_DISPLAY} dc_shell-t> set_output_delay -clock CLK -max -fall 5 {AM_PM_DISPLAY} . . .
dc_shell-t> set_output_delay -clock CLK -max -rise 5 {DISP1[0]} dc_shell-t> set_output_delay -clock CLK -max -fall 5 {DISP1[0]}
例子输出:
在每个命令执行后,dc_shell会显示类似于下面的确认信息。: Performing set_output_delay on port ‘SPEAKER_OUT’.
检查设计 注意:
使用Design Analyzer而不是dc_shell在观察综合前后的原理图。
dc_shell> check_design dc_shell> check_timing 或
dc_shell-t> check_design dc_shell-t> check_timing
这个命令产生相应的警告和错误信息。
例子输出
当check_design命令完成时,dc_shell会显示如下的信息:
Warning: In design ‘CONVERTOR_CKT’, a pin on submodule ‘U7’ is connected to logic 1 or logic 0. (LINT-32)
Net ‘data _in1[5]’ is connected to pins ‘T0’, ‘T1’.
Warning: Design ‘CONVERTOR’ is instantiated 2 times. (LINT-45) Cell ‘U7’ in design ‘CONVERTOR_CKT’ Cell ‘U8’ in design ‘CONVERTOR_CKT’ 1
当check_timing完成时,dc_shell会显示一段信息、表示警告和错误的消息: Information: Updating design information...(UID-85) Allocating blocks in ‘U1/U1’
Reading in the Synopsys synthetic primitives. . . .
Warning: Design ‘TOP’ contains unmapped cells.
Use report_cell to list unmapped cells in the design. (OPT-309)
Warning: The following end-points are not constrained for maximum delay. End point
--------------- AM_PM_DISPLAY DISP1[0] DISP1[1] DISP1[2] DISP1[3] DISP1[4] DISP1[5] DISP1[6] DISP1[7] DISP1[8] DISP1[9] DISP1[10] DISP1[11] DISP1[12] DISP1[13] DISP2[0] DISP2[1] DISP2[2] DISP2[3] . . .
在输出端口的警告信息表明不是所有的在报表中的点已经被设置了限制条件,当它被设置了限制条件后,这个警告信息自然会消除。
显示引脚名称的层
The following commands set the visual characteristics of the pin dc_shell> set_layer pin_name_layer visible TRUE dc_shell> set_layer pin_name_layer line_width 1
dc_shell> set_layer pin_name_layer plot_line_width 0 dc_shell> set_layer pin_name_layer red 65535 dc_shell> set_layer pin_name_layer green 65535 dc_shell> set_layer pin_name_layer blue 65535 这些命令与Tcl命令相同
dc_shell-t> set_layer pin_name_layer visible TRUE
Resolving Multiple Design Instances Using dc_shell dc_shell> uniquify 或者
dc_shell-t> uniquify
例子输出
当你执行uniquify命令,dc_shell显示如下输出信息:
Uniquifying cell ‘U8’ in design ‘CONVERTOR_CKT’. New design is ‘CONVERTOR_0’.
Uniquifying cell ‘U7’ in design ‘CONVERTOR_CKT’. New design is ‘CONVERTOR_1’.
保存设计
dc_shell> write -format db -hierarchy -output “./db/TOP_before_compile.db”
{“TOP_attributes.db:TOP”}
或
dc_shell-t> write -format db -hierarchy -output {./db/TOP_before_compile.db}
[list {TOP_attributes.db:TOP}]
编译一个层次化设计
优化是综合中把库单元中符合设计功能、面积和速度要求的单元组合起来的过程。Design Compiler编译命名调用优化。为的到一个符合约束规范的设计,在编译的过程中进行对设计进行修改和优化。
编译和分析设计 Design Analyzer Design Compiler自动的编译所有层级的设计,它支持分级结构的设计。在编译过程中,门级优化共分为5个阶段: 1. 初始时序优化 2. 组合优化 3. I/O pad优化 4. 最后时序优化 5. 局部调整
在编译完每个模块后,Design Compiler继续优化电路,直到满足所有的限制条件。有时,这个过程要求重新编译某个关键路径上的子模块。当性能指标都满足,而且结果没有更好的改进的时候,编译过程就会停止。缺省的情况下,在分级的设计中,每个子模块是单独给编译的。在编译子模块时,Design Compiler在优化使会考虑每个模块各自的边界条件。在编译前,使用uniquify set_dont_touch 或者 ungroup来分解一些相同的木块的实例。
编译优化设计 Design Analyzer
当你对闹钟的设计设置完限制条件和参数并且运行check_design后,设计就可以使用compile命令来优化了。
这部分,我们要进行如下操作: 1. 打开Design Optimization窗口 2. 检查和设置选项信息 3. 优化初始化
4. 读入已经修改过的设计
5. 检查设计在优化是产生的信息。
打开Design Optimization窗口 1. 在Designs view选择TOP。
2. 选择Tools > Design Optimization。Design Optimization窗口如Figure 9-1。
检查和设置选项
1.留意缺省得设置。
以下各项时被缺省选定的:
Map Design、Medium Map Effort (利用计算机的能力来映射设计)。对于很多优化,缺省的状态就可以了。 2. 点击并选中Verify Design。这个检查逻辑综合后的新的设计是否和原设计的功能相等。选择Verify Effort为Low(利用计算机的能力来验证)。
3. 点击并选中Allow Boundary Optimization。边界优化允许逻辑优化跨越边界。例如,如果一个子模块的输入端口的信号总是为逻辑0,边界优化就可以简化子模块中的For example, if the signal to an input port of a
subdesign is always logic 0, boundary optimization can simplify the logic in the subdesign, as shown in Figure 9-2.
CONVERTOR模块有两个输入端口没有用到,通过使用边界优化,与这两个端口相关的逻辑被优化掉了。
编译可以在前台也可以在后台进行,在这里,我们在前台进行编译。 注意:
后台编译有很多好处。你可以在编译的时候继续对设计进行操作,将不同的编译结果保存于不同的目录中,从中可以挑选出最好的结果
前台进行优化初始化
? 在Design Optimization窗口中,点击\和OK开始进行优化。在读入缺省的参数和设计后,Design Compiler开始进行CMOS优化。Figure 9-3显示了优化的结果。在这一阶段,Design Compiler尝试着要去满足规定的限制条件。
这个过程完成映射的有化阶段。结果如Figure 9-4。
在映射优化阶段,Design Compiler 进行结构化和映射。在编译的log文件中,注意产生了两个新的与resource sharing相关的设计模块。子模块ALARM_COUNTER和TIME_COUNTER使用一个综合了的源来执行一个多重加法操作(multiple addition operation)。在执行全部的加法操作时,这两个模块只需一个源,即综合后的模块DW01_inc_no(incrementor)。
在下一步,Design Compiler使用不同的策略来满足限制条件并改善电路。你的设计可能会与Figure 9-5有略微不同:
当优化结束后, Compile Log window 如 Figure 9-6: