Design_compiler经典教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微电子学实验室
实验教程
ASIC综合器软件——Design Compiler实验
2006-7
Design Compiler实验
前言
Design Compiler(简称DC)是synopsys公司的ASIC综合器产品,它可以完成将硬件描述语言所做的RTL级描述自动转换成优化的门级网表。

DC得到全球60多个半导体厂商、380多个工艺库的支持。

Synopsys的逻辑综合工具DC占据91%的市场份额。

DC是工业界标准的逻辑综合工具,也是Synopsys最核心的产品。

它使IC设计者在最短的时间内最佳的利用硅片完成设计。

它根据设计描述和约束条件并针对特定的工艺库将输入的VHDL或者Verilog的RTL描述自动综合出一个优化的门级电路。

它可以接受多种输入格式,如硬件描述语言、原理图和网表等,并产生多种性能报告,在缩短设计时间的同时提高设计性能。

本实验对DC软件的使用进行简单的介绍,熟悉和掌握综合器软件使用中的基本概念和术语,了解如何对数字电路施加约束,掌握同步数字电路设计、约束和优化的方法,了解时钟的概念,理解同步电路静态时序分析(STA)的方法和时序报告。

西安交通大学微电子学实验室
实验1setup和synthesis流程
实验准备
有两种界面可以运行Design Compiler:
1)命令行界面,dc_shell-xg-t;
2)图形用户界面(GUI),Design Vision。

本次实验主要运用GUI模式。

图1.1给出了RTL逻辑综合的直观概念和简要流程。

图1.1 RTL逻辑综合的直观概念和简要流程。

在DC中,总共有8种设计对象:
z设计(Design):一种能完成一定逻辑功能的电路。

设计中可以包含下一层的子设计。

z单元(Cell):设计中包含的子设计的实例。

z参考(Reference):单元的参考对象,即单元是参考的实例。

z端口(Port):设计的基本输入输出口。

z管脚(Pin):单元的输入输出口。

z连线(Net):端口间及管脚间的互连线。

z时钟(Clock):作为时钟信号源的管脚或端口。

z库(Library):直接与工艺相关的一组单元的集合。

Design Compiler实验
检查.synopsys_dc.setup文件
DC使用名为“.synopsys_dc.setup”的启动文件,用来指定综合工具所需要的一些初始化信息。

启动时,DC会以下述顺序搜索并装载相应目录下的启动文件:
1)、DC的安装目录;
2)、用户的home目录;
3)、当前启动目录。

1.将实验文件拷至自己的工作目录:
u n i x%c d~
u n i x%c p–r/c a d/L a b s/s y n o p s y s/d c/D C_1_2004.12./
2.进入risc_design文件夹。

用文本编辑器或者文本编辑命令vi打开.synopsys_dc.setup文
件。

u n i x%c d D C_1_2004.12/r i s c_d e s i g n
u n i x%l s–a
3.检查以下语句是否在.synopsys_dc.setup文件中。

set target_library "core_slow.db"
set link_library "* core_slow.db"
set symbol_library "core.sdb"
set sh_enable_line_editing true z target_library用于设置综合时所要映射的库,target_library中包含有单元电路的延迟信息,DC综合时就是根据target_library中给出的单元电路的延迟信息来计算路径的延迟。

z link_library是链接库,它是DC在解释综合后网表时用来参考的库。

一般情况下,它和目标库相同;当使用综合库时,需要将该综合库加入链接库列表中。

注意:在link_library的设置中必须包含’*’, 表示DC在引用实例化模块或者单元电路时首先搜索已经调进DC memory的模块和单元电路,如果在link library中不包含’*’,DC 就不会使用DC memory中已有的模块,因此,会出现无法匹配的模块或单元电路的警告信息(unresolved design reference)。

z symbol_library为指定的符号库。

symbol_library是定义了单元电路显示的Schematic的库。

用户如果想启动design_analyzer或design_vision来查看、分析电路时需要设置symbol_library。

z synthetic_library是DesignWare综合库,在初始化DC的时候,不需要设置标准的DesignWare库standard.sldb用于实现HDL描述的运算符,对于扩展的DesignWare,需要在synthetic_library中设置,同时需要在link_library中设置相应的库以使得在链接的时候DC可以搜索到相应运算符的实现。

z search_path指定了综合工具的搜索路径。

图1.2给出了实验将要用到的文件夹risc_design的结构。

实验的HDL源代码(source code)已经被转换为ddc格式,保存在子文件夹unmapped下。

注意:在所有实验中,都必须在文件夹下risc_design启动Design Compiler。

西安交通大学微电子学实验室
启动design vision
1. 在risc_design 目录下启动design vision 。

留意LOG 区域的信息”Starting shell in XG mode…” risc_design>synopsys.setup risc_design>design_vision-xg
2. 选择菜单File —>Setup ,检查库是否设置正确。

点击Cancel 关闭窗口。

图1.2 文件夹risc_design 的结构
图1.3 design vision 图形用户界面(GUI)
Design Compiler 实验
3. 在启动design vision 的Terminal 窗口,输入以下命令进一步确认库设置变量(library setup
variable)。

design_vision-xg-t> printvar target_library design_vision-xg-t> printvar link_library design_vision-xg-t> printvar symbol_library design_vision-xg-t> printvar search_path 读入文件
1. 选择菜单File —>Read 或者直接点
击,双击文件夹unmapped/,选中
PRGRM_CNT_TOP.ddc 并打开。

在Hier.1窗口你将看到PRGRM_CNT_TOP, I_PRGRM_FSM, I_PRGRM_DECODE, I_PRGRM_CNT 的图标。

2. 选择菜单File —>Link Design —>OK ,查看LOG 区域有无warning 或error 信息。

3. 在design vision 图形用户界面下方或在启动design vision 的Terminal 窗口,输入以下命
令,观察LOG 区域。

图1.5 Hier.1窗口
图1.4 库设置对话框
西安交通大学微电子学实验室
design_vision-xg-t> list_designs design_vision-xg-t> list_libs 熟悉Designs-, Symbol-, Schematic-视图
1. Designs 视图:左键单击选中PRGRM_CNT_TOP ,在窗口右下方将观察到
:。

2. Symbol 视图:单击工具栏黄色图标,进入Symbol 视图。

3. Schematic 视图:单击工具栏黄色图标,进入Schematic 视图。

4. 现在图形用户界面有三个窗口,最大化其中的一个,点击
中不同的按钮,可以显示不同的窗口。

5. 显示Hier.1窗口,在Logic Hierarchy 窗口分别选中
I_PRGRM_FSM,
图1.6 Symbol 视图
图1.7 Schematic 视图
Design Compiler 实验
I_PRGRM_DECODE, I_PRGRM_CNT
,单击工具栏黄色图标
和,显示它们的Symbol 和Schematic 视图。

6. 除PRGRM_CNT_TOP Schematic 视图外,关闭其它视图窗口。

双击标有PRGRM_CNT 的块(BLOCK),点击工具栏图标回到PRGRM_CNT_TOP Schematic 视图。

用Script 文件加约束
1. 打开PGRRM_CNT_TOP Symbol 视图。

2. 选择菜单File—>Execute Script...,弹出对话框。

选中/scripts 文件夹下的
example.tcl 文件,选中Echo commands 选项,然后点击Open。

example.tcl 文件中设置了以下内容:
1) 时钟周期4ns,时钟歪斜(skew)0.35ns ;
2) 除时钟Clk 端口(port )外,其它所有输入端口由库单元fdef1a2驱动;
3) 除时钟Clk 端口外,其它所有输入端口最大输入延迟(max input delay )为2.0ns ;
4) 所有输出端口最大输出延迟为2.0ns;
5) 所有输出端口负载为15×ssc_core_slow/and2a1/A ,表示负载是ssc_core_slow 库中
and2a1单元的管脚A 负载的15倍;
6) 互连线负载模型为5KGATES ;
7) 最大面积为2000。

电路的面积单位有可能是2输入与非门、晶体管或um 2。

目标
库到底用哪种面积单位,需要咨询库的供应商。

ssc_core_slow 中单元and2a1的面
积是12.54。

图1.8 用Script 文件加约束对话框
西安交通大学微电子学实验室
编译(compile)
1.在design vision窗口下方输入:
design_vision-xg-t>compile 2.观察I_PRGRM_FSM, I_PRGRM_DECODE, I_PRGRM_CNT的Schematic视图。

时序(Timing)和面积(Area)报告
1.返回到PRGRM_CNT_TOP Symbol视图。

2.将鼠标停留在工具栏柱状图图标上,将会出现关于图标作用的提示,点击
Path Slack Histogram图标,弹出对话框,直接点OK。

3.在启动design vision的Terminal窗口输入:
design_vision-xg-t>report_constraint –all_violators 记录以下信息:
最大延迟(Max Delay):Largest Violation (Slack)__________________________
最大面积(Max Area):Actual Area______________________________________
注意:你也可以分别用report_timing和report_area命令来报告最大延迟和最大面积。

4.显示PRGRM_CNT_TOP Schematic视图。

5.选择菜单View—>Hihglight—>Critical Path,显示最关键路径。

6.取消highlight选择:View—>Hihglight—>Clear All (Ctrl+M)。

保存设计
1.返回到PRGRM_CNT_TOP Symbol视图。

2.选择菜单File—>Save As,弹出对话框。

双击文件夹/mapped,确认Save All Designs
In Hierarchy按钮被选中。

输入my_first_design.ddc,点击save。

Design Compiler实验
图1.9 保存设计对话框
3.选择history按钮,点击按钮Save Contents As,将命
令历史保存在risc_design文件夹下,命名为run_dvxg.txt。

退出design vision
1.选择菜单File—>Remove All Designs,清除design vision内存中的所有设计(design)
文件。

2.在design vision图形用户界面下方或在启动design vision的Terminal窗口,输入以下命
令,观察LOG区域,发现design vision内存中的设计文件已被清除。

如果要清除design vision内存中的designs和libraries,可以用命令remove_design –all。

design_vision-xg-t> list_designs 3.选择菜单File—>Exit,退出design vision。

思考
为什么要创建一个.synopsys_dc.setup文件?
实验2 设置Constraints和Attributes
实验准备
我们设计电路总是有一个设计目标,Design Compiler用设计约束来描述这个目标。

这里所说的目标主要包括时序目标和面积目标,所以设计约束也由时序约束(Timing Constraints)和面积约束(Area Constraints)组成。

时序约束主要包括时钟周期(组合电路不需要时钟的设置)、输入延时、输出延时等内容。

面积约束用来设置电路的最大面积。

图2.1 Timing and Area Constraints设置
另外电路的性能还受实际工作环境的影响,所以我们用Design Compiler综合电路时还必须设置环境属性(Environmental Attributes)。

环境属性主要包括电路工作时的温度、电源电压,以及输入驱动、输出负载、互连线负载模型等。

图2.2 Environmental Attributes设置
本次实验我们将在dc_shell-xg-t模式下设置电路的时序面积约束和环境属性。

图2.3给出了做电路综合所需要的一些设置、命令以及综合的全过程。

图2.3综合的全过程以及各个步骤所使用的命令
本次实验的电路示意图如图2.4所示,时序面积约束和环境属性如表2.1所示。

表2.1 PRGRM_CNT_TOP 的时序面积约束和环境属性 时钟频率(Clock Frequency)
250Mhz(4ns) 50%占空比 时钟歪斜(Clock Skew) 0.25ns 输入端口(最坏情况输入延迟) T clk-q =1.7ns 输出端口(最坏情况输出延迟)
所有输出端口寄存器输出 面积目标(Area Goal) 无
电源和温度变化(V oltage and Temperature Variation)
1.8V+/-0.18V , 0。

C to 125。

C
输入端口的驱动寄存器(Clk 端口除外)
cell “fdef1a1”, pin”Q” 互连线负载模型(Wire Load Model)
自动选择(Auto Wire Load Model) 互连线负载模式(Wire Load Mode)
enclosed 每个输入端口允许的最大电容
(Clk 端口除外)
5 “and2a1” cells, pin “A” 每个输出端口能驱动的block 数目 3
每个输出端口负载 5×3 ”and2a1” cells, pin “A” 输入端口的最大转换时间(Clk 端口除外) 0.25ns
输入端口(最好情况输入延时) T clk-q =0.2ns
输出端口(最好情况输出延时) 寄存器最小保持时间=0.5ns
外在逻辑最小延迟 T T =0.2ns
启动dc_shell
1. 在risc_design 文件夹下启动Design Compiler 。

unix% cd risc_design unix% dc_shell-xg-t
2. 检查库设置变量(library setup variable)。

确认target_library 是”core_slow.db”,link_library
是”* core_slow.db”。

如果library variables 没有设置正确,退出DC ,在正确的文件夹下重新启动。

记住:库变量是在risc_design 文件夹下的.synopsys_dc.setup 文件中设置的。

dc_shell-xg-t> printvar target_library dc_shell-xg-t> printvar link_library
3. 读入文件unmapped/PRGRM_CNT_TOP.ddc 。

用help read*来帮助决定用那条命令。


验过程中如果对那条命令用法不清楚,可以用help –verbose command_name ,
图2.4 实验2电路示意图
command_name -help或man command_name寻求帮助。

dc_shell-xg-t> help read* dc_shell-xg-t> read_ddc unmapped/PRGRM_CNT_TOP.ddc 4.链接。

在进一步工作之前,需要将设计中调用的子模块与链接库中定义的模块建立对应
关系,这一过程叫做链接。

这一过程可以利用link命令显式地完成,也可以将来综合时利用compile命令隐式地进行。

推荐每次设计读入以后都用link命令执行一次链接。

注意:由于该命令以及以后提到的大部分命令均对当前设计(current_design)进行操作,所以在执行该命令前应正确设置current_design变量。

dc_shell-xg-t> current_design PRGRM_CNT_TOP dc_shell-xg-t> link
查看core_slow库
1.工艺库(technology library)的名字有可能和文件名不同。

用以下命令列举出DC内存中的
库名以及对应的文件名。

dc_shell-xg-t> list_libs z DC内存中有哪些库?
ssc_core_slow, gtech和standard.sldb。

z目标库(target libray)对应的工艺库名又是什么?
ssc_core_slow,和文件名core_slow.db不同。

2.用以下任一命令生成ssc_core_slow库的报告。

dc_shell-xg-t> report_lib ssc_core_slow 或者
dc_shell-xg-t> view report_lib ssc_core_slow 在报告的上端,我们可以得到库的单位。

找出时间单位和电容负载单位分别是多少。

约束PRGRM_CNT_TOP
1.reset设计。

命令reset_design将清除设计原有的约束。

dc_shell-xg-t> reset_design 2.用命令all_inputs和all_outputs查看所有的输入端口和输出端口。

dc_shell-xg-t> all_inputs dc_shell-xg-t> all_outputs 3.生成一个频率为250Mhz的时钟my_clk,连接到时钟端口Clk。

dc_shell-xg-t> get_ports –help dc_shell-xg-t> create_clock –period 4 \ -name my_clk [get_ports Clk] 命令在一行写不下,可以换行,行与行间用“\”连接。

4.设置时钟歪斜为0.25ns。

dc_shell-xg-t> get_clocks –help dc_shell-xg-t> set_clock_uncertainty 0.25 \ [get_clocks my_clk] 5.约束输入端口的时序。

因为本实验中所有输出都由寄存器输出,由图2.5可知,最大输
入延迟则为最坏情况下的T clk-q,最小输入延迟则为最好情况下的T clk-q。

图2.5 输入路径的约束
dc_shell-xg-t> set_input_delay -max 1.7 -clock my_clk \ [remove_from_collection [all_inputs] [get_ports Clk]] dc_shell-xg-t> set_input_delay -min 0.2 -clock my_clk \ [remove_from_collection [all_inputs] [get_ports Clk]] 命令remove_from_collection将它的第二个参数(argument)从第一个参数中滤去。

6.设计规则约束(Design Rule Constraints):用set_max_transition命令设定除Clk端口外所
有输入端口的最大转换时间。

dc_shell-xg-t> set_max_transition 0.25 \ [remove_from_collection [all_inputs] [get_ports Clk]] 7.约束输出端口的时序。

既然所有输出都由寄存器输出,那么由图2.6可知,最大输出延
迟应该为(T period-T clk-q,max),最小输出延迟为(T T,min-T hold)。

dc_shell-xg-t> set_output_delay –max 2.3 \ –clock my_clk [all_outputs] dc_shell-xg-t> set_output_delay –min -0.3 \ –clock my_clk [all_outputs] 8.生成一份时钟报告。

确认时钟周期是4,时钟歪斜是0.25,时钟源是Clk。

dc_shell-xg-t> report_clock –skew –attributes 9.生成一份所有端口的报告。

因为报告较长,我们可以用view功能。

确认除Clk端口外,
所有端口的Max Rise and Fall和Min Rise and Fall都已设置好,并且关联时钟为my_clk,除Clk端口外的其它所有输入端口最大转换时间是0.25。

dc_shell-xg-t> view report_port –verbose 另外,我们还可以查看单独一个端口上的约束,如Clk端口。

dc_shell-xg-t> report_port –verbose Clk
图2.6 输出路径的约束
设置PRGRM_CNT_TOP的环境属性
1.工作条件(Operation Conditions):本实验将用库文件core_slow.db中默认的工作条件。

所以不需要执行任何命令。

如果你想更改工作条件,可以用命令set_operation_conditions 来指向库中其它的工作条件模型。

另外,用以下命令可以知道库中默认的工作条件。

dc_shell-xg-t> get_attribute ssc_core_slow \ default_operating_conditions 2.互连线负载模型(Wire Load Model):DC将基于你的电路面积自动选择互连线负载模型。

如果你想指定互连线负载模型,可以用命令set_wire_load_model。

查看ssc_core_slow库,回答以下问题。

dc_shell-xg-t> view report_lib ssc_core_slow z文件core_slow.db中定义了几个互连线负载模型?
7个,分别是5KGATES, 10KGATES, 20KGATES, 40KGATES, 80KGATES, 160KGATES, 320KGATES。

z如果电路面积是200000的话,DC将会选择哪种互连线负载模型?
40KGATES。

z互连线负载模型中电阻的单位是什么?
1千欧姆。

3.设置端口环境:用set_driving_cell命令来指定驱动非时钟输入端口的单元输出pin。

dc_shell-xg-t> set_driving_cell –library ssc_core_slow \ –lib_cell fdef1a1 –pin Q \ [remove_from_collection [all_inputs] [get_ports Clk]] 或者
dc_shell-xg-t> set_driving_cell –library ssc_core_slow \
-lib_cell fdef1a1 –pin Q [all_inputs] dc_shell-xg-t> remove_driving_cell [get_ports Clk] 确认Clk端口没有驱动单元
dc_shell-xg-t> report_port –verbose Clk 4.报告驱动单元的属性:用以下命令显示驱动单元管脚(Pin)的所有属性。

dc_shell-xg-t>report_attribute \ [get_lib_pins ssc_core_slow/fdef1a1/*] z dfef1a1有哪些管脚?
D, E, CLK和Q。

5.限制输入端口的电容值。

dc_shell-xg-t> set_max_capacitance \ [expr [load_of ssc_core_slow/and2a1/A]*5] \ [remove_from_collection [all_inputs] [get_ports Clk]] 6.指定最坏情况下的输出电容。

dc_shell-xg-t> set_load \ [expr [load_of ssc_core_slow/and2a1/A]*15] [all_outputs] 7.生成一份设计报告。

确认设计PRGRM_CNT_TOP工作条件模型是slow_125_1.62,互
连线负载模型是5KGATES(在不知道电路面积的情况下,5KGATES是默认的互连线负载模型)。

dc_shell-xg-t> view report_design 8.生成一份详细的端口报告。

确认所有输出端口管脚负载(Pin Load)是0.03,fdef1a1寄存
器驱动除Clk端口外的所有输入端口。

dc_shell-xg-t> view report__port –verbose 编译和保存设计
1.保存所有设计约束和环境属性。

dc_shell-xg-t> write_script –output scripts/pc_w.tcl 浏览新生成的文件pc_w.tcl,它应该包含你给设计PRGRM_CNT_TOP设置的所有约束和属性。

unix% more scripts/pc_w.tcl 2.编译设计PRGRM_CNT_TOP。

dc_shell-xg-t> compile 3.生成一份约束报告。

查看有没有时序违背(Timing Violation)或其它违背。

如果有,我
们暂且不管它,留待实验3去调试。

dc_shell-xg-t> report_constraint –all 4.层次化保存设计PRGRM_CNT_TOP。

dc_shell-xg-t> write –format ddc –hierarchy –output mapped/PC.ddc 5.退出Design Compiler。

dc_shell-xg-t> quit
实验3 时序报告和调试
实验准备
本次实验的主要任务是:
z理解命令report_timing生成的不同时序报告。

z解决建立时间违背(setup time violation)的问题。

z解决保持时间违背(hold time violation)的问题。

本次实验的电路示意图如图3.1所示,时序面积约束和环境属性如表3.1所示。

图3.1 实验3电路示意图
表3.1 PRGRM_CNT_TOP时序面积约束和环境属性
时钟频率(Clock Frequency) 250Mhz(4ns) 50%占空比
时钟歪斜(Clock Skew) 0.25ns
输入端口(最坏情况输入延迟) T clk-q=1.7ns
输出端口(最坏情况输出延迟) 所有输出端口寄存器输出
面积目标(Area Goal) 无
电源和温度变化(V oltage and Temperature
1.8V+/-0.18V, 0。

C to 125。

C Variation)
输入端口的驱动寄存器(Clk端口除外) cell “fdef1a1”, pin”Q”
互连线负载模型(Wire Load Model) 自动选择(Auto Wire Load Model)
互连线负载模式(Wire Load Mode) enclosed
每个输入端口允许的最大电容(Clk端口除外) 5 “and2a1” cells, pin “A”
每个输出端口能驱动的block数目 3
每个输出端口负载5×3 ”and2a1” cells, pin “A”
输入端口的最大转换时间(Clk端口除外) 0.25ns
输入端口(最好情况输入延时) T clk-q=0.2ns
输出端口(最好情况输出延时) 寄存器最小保持时间=0.5ns
外在逻辑最小延迟T T=0.2ns
约束和编译PRGRM_CNT_TOP
1.用脚本文件约束和编译PRGRM_CNT_TOP。

instruction_lab3.tcl是脚本运行文件。

unix% cd risc_design
unix% dc_shell-xg-t –f scripts/instruction_lab3.tcl \ | tee –i instruction_lab3.log tee是一个标准的UNIX程序,它将其它程序的结果输出到文件和终端窗口(terminal window)。

2.检查instruction_lab
3.log,确认文件中没有error。

dc_shell-xg-t> sh grep –i error instruction_lab3.log grep也是一个标准的UNIX程序,它的作用在整个文本文件中寻找特定字符串,并将所有出现该字符串的行打印。

在dc_shell环境下运行UNIX命令,前面加sh。

3.生成一份详细的端口报告。

确认PRGRM_CNT_TOP的时序约束和环境属性设置与表
3.1一致。

dc_shell-xg-t> view report_port –verbose 4.生成一份设计报告。

确认设计PRGRM_CNT_TOP的属性设置与表3.1一致。

dc_shell-xg-t> view report_design 理解时序报告
DC将电路分解成不同的信号时序路径(Timing Path),每条路径都有一个起点和一个终点。

起点是电路的输入端口或电路中寄存器的时钟管脚,终点是电路的输出端口或时序器件(sequential devices)中除时钟管脚外的其它输入管脚。

时序路径又根据控制它们终点的时钟分成不同的路径组(path group),默认的路径组(the default path group)包含所有不受时钟约束的路径。

图3.2是路径分组的示意图。

图3.2 路径分组示意图
1.检查有没有未约束的时序路径(timing path)。

dc_shell-xg-t> check_timing 2.查看有几个路径组(path group)。

dc_shell-xg-t> report_path_group 3.生成一个默认的时序报告,生成的报告如图3.3所示。

时序报告由4个部分组成:路径
信息部分(Path Information Section),路径延时部分(Path Delay Section),路径要求部分(Path Required Section),总结部分(Summary Section)。

dc_shell-xg-t> report_timing
Path Information Section
Path Delay Section
Individual Contribution
to Path Delay
Running Total of the Path Delay
Signal Transition
Total Delay
Path Required Section
from library
Data must be valid by this time
Summary Section
图3.3 生成的时序报告
回答以下问题。

z报告是关于建立时间的还是关于保持时间的?
报告是关于建立时间的。

从报告上部的“Path Type”可以看出来。

“max”表示建立时间,“min”表示保持时间。

z报告中路径的起点(Startpoint)和终点(Endpoint)分别是哪个端口或管脚?
起点:Crnt_Instrn[21](一个输入端口)。

终点:I_PRGRM_CNT/PCint_reg[0]/D(内部寄存器的一输入端)。

z报告是在哪种工作条件(operation conditions)下生成的?
slow_125_1.62。

z报告是符合(meet)还是违背(violate)它的约束条件?
违背。

从报告底部的“VIOLATED”可以看出来,并且“slack”是负值。

对于建立时间而言,slack=data required time-data arrival time,如图3.4所示。

其中data required time 等于时钟周期减去库建立时间和时钟歪斜,data arrival time为路径所消耗最大延时。

对于保持时间而言,slack=data arrival time-data required time,其中data required time等于路径终点保持时间要求(hold time requirement)加时钟歪斜,data arrival time为路径消耗的最小延时。

slack为正值,表示路径符合时序约束,slack为负值,表示路径违背时序约束。

图3.4 建立时间slack图示
z Clk端的时钟周期是多少?
4ns。

z“input external delay”是多少?这个数据是从哪里来的?
“input external delay”是1ns,它由约束脚本文件instruction_cons.tcl中的命令set_input_delay设置。

z电路的分块(design’s partitioning)有没有分解一条组合路径(combinational path)?
有。

路径从一个输入端口开始,经过I_PRGRM_DECODE和I_PRGRM_CNT的组合逻辑,最后终止在I_PRGRM_CNT中的一个寄存器输入管脚。

这条路径包含了I_PRGRM_DECODE和I_PRGRM_CNT的组合逻辑,被这两个电路块(Block)所分解。

z捕获寄存器(capture register)建立时间要求(setup time requirement)是多少?
0.24ns。

从“library setup time”可以看出来。

z“clock uncertainty”是多少?这个数据代表什么?
0.25ns。

它表示时钟分支的歪斜,由命令set_clock_uncertainty设置。

4.生成一份带输入管脚的时序报告,有效数字6位。

dc_shell-xg-t> report_timing –input_pins –significant_digits 6 z这份报告和默认的报告有什么区别?
这份报告将路径延时分解成一段段管脚对管脚(pin-to-pin)的延时,它将线网延时(net delay)和单元延时(cell delay)分开显示。

5.生成一份显示线网名称(net names)和扇出(fanout)的时序报告。

dc_shell-xg-t> report_timing –nets z每条线网的延时(delay)是多少?为什么?
0。

命令report_timing –nets只显示线网的名称和扇出,所以Incr列总是显0。

z“Fanout”列表示什么?
线网的扇出数。

6.生成一份关于保持时间的时序报告?
dc_shell-xg-t> report_timing –delay min z报告中路径的起点和终点分别是哪个端口或管脚?
起点:I_PRGRM_FSM/Current_State_reg[2]/CLK(内部寄存器的时钟输入端)。

终点:Current_State[2](输出端口)。

z报告是符合还是违背它的约束条件?
违背。

从报告底部的“VIOLATED”可以看出来,并且“slack”是负值。

z报告是在哪种工作条件下生成的?用它来计算保持时间合适吗?
slow_125_1.62。

版图前的保持时间计算用最坏情况工作条件(worst-case operating conditions)slow_125_1.62_WCT更合适。

z路径终点保持时间要求(hold time requirement)是多少?
0.3ns。

从“output external delay”可以看出来。

它由命令set_output_delay –min设定。

z通过发射寄存器(launching register)的延时是多少?它满足保持时间约束吗?
0.43ns。

至少0.55ns才能满足保持时间约束。

7.生成显示10条最坏建立时间路径(worst setup timing paths)的时序报告?
dc_shell-xg-t> report_timing –max_paths 10 8.显示所有违背时序的路径(violating timing paths)。

dc_shell-xg-t> report_constraints –all_violators 解决setup time violations的问题
在任务2中,我们知道了最大建立时间违背的路径包含了I_PRGRM_DECODE和I_PRGRM_CNT的组合逻辑,被这两个电路块(Block)所分解。

我们现在将I_PRGRM_DECODE和I_PRGRM_CNT组合(group)到一个新的层次。

group以后的电路块名字(design name)为NEW_PC,实例名(instance name)为I_NEW_PC。

然后再在I_NEW_PC 中取消组(ungroup),关于组(group)和取消组的概念分别如图3.5和图3.6所示。

1. 组合(group) I_PRGRM_DECODE 和I_PRGRM_CNT 。

组合成的新的设计实体名为
NEW_PC ,实例名为I_NEW_PC 。

dc_shell-xg-t> group –design_name NEW_PC –cell_name I_NEW_PC \ {I_PRGRM_DECODE I_PRGRM_CNT}
2. 报告设计的层次。

dc_shell-xg-t> report_hierarchy –noleaf
图3.5 group 示意图
图3.6 ungroup 示意图
3.在设计NEW_PC中ungroup2级以下的层次。

dc_shell-xg-t> ungroup –start_level 2 I_NEW_PC 4.报告设计的层次,发现I_PRGRM_DECODE和I_PRGRM_CNT不见了。

dc_shell-xg-t> report_hierarchy –noleaf
5.编译设计PRGRM_CNT_TOP。

dc_shell-xg-t> current_design PRGRM_CNT_TOP dc_shell-xg-t> compile 6.生成关于建立时间的报告。

发现没有建立时间违背。

dc_shell-xg-t> report_timing –delay max 7.显示所有的约束违背。

发现有11条路径违背保持时间约束。

dc_shell-xg-t> report_constraint –all_violators 解决hold time violations的问题
此节只是给大家介绍解决hold time violations的方法。

在实际的流程中,在生成版图之前我们只解决比较大的建立时间违背或减小它的违背程度,小的建立时间违背在生成版图的过程中会解决。

1.执行下列命令解决hold time violations的问题。

dc_shell-xg-t> set_fix_hold [all_clocks] dc_shell-xg-t> compile –incremental_mapping 2.用命令report_constraint –all_violators报告所有约束违背。

报告显示“This design has no
violated constraints.”。

dc_shell-xg-t> report_constraint –all_violators 保存
1.层次化保存PRGRM_CNT_TOP到文件夹/mapped。

dc_shell-xg-t> write –format ddc –hierarchy \ –output mapped/instruction_lab3.ddc 2.保存电路的verilog网表。

dc_shell-xg-t> write –format.ddc –hierarchy \ –output mapped/instruction_lab3.v 3.保存用于反标注(back-annotation)的标准延时文件。

dc_shell-xg-t> write_sdf scripts/PRGRM_CNT_TOP.sdf 4.退出DC。

dc_shell-xg-t> quit。

相关文档
最新文档