PrimeTime 时序分析流程和方法 下载本文

内容发布更新时间 : 2024/5/22 4:02:17星期一 下面是文章的全部内容请认真阅读。

PrimeTime 时序分析流程和方法

PrimeTime是Synopsys的一个单点的全芯片、门级静态时序分析器。它能分析大规模、同步、数字ASICS的时序。PrimeTime工作在设计的门级层次,并且和Synopsys其它工具整合得很紧密。

基本特点和功能: 时序检查方面:

建立和保持时序的检查(Setup and hold checks)

重新覆盖和去除检查(Recovery and removal checks) 时钟脉冲宽度检查(Clock pulse width checks) 时钟门锁检查(Clock-gating checks) 设计检查方面: 没有时钟端的寄存器

没有时序约束的结束点(endpoint)

主从时钟分离(Master-slave clock separation) 有多哥时钟的寄存器

对层次敏感的时钟(Level-sensitive clocking)

组合电路的反馈环(Combinational feedback loops)

设计规则检查,包括最大电容(maximum capacitance)、最大传输时间(maximum transition)和最大扇出(maximum fanout)

PrimeTime 时序分析流程和方法: 在时序分析之前需要做的步骤: 1、 建立设计环境

- 建立搜索路径(search path)和链接路径(link path) - 读入设计和库 - 链接顶层设计

- 建立运作条件、连线负载模型、端口负载、驱动和传输时间 2、 说明时序声明(约束)

- 定义时钟周期、波形、不确定性(uncertainty)和滞后时间(latency) - 说明输入、输出端口的延时

3、 说明时序例外情况(timing exceptions) - 多周期路径(multicycle paths) - 不合法路径(false paths)

- 说明最大和最小延时、路径分割(path segmentation)和失效弧(disabled arcs) 4、 进行分析和生成报告 - 检查时序 - 生成约束报告 - 生成路径时序报告 开始

先建立目录并将PrimeTime本身所带的一个例子拷到新建的目录下,在下面的内容中将要用到这个例子。 mkdir primetime

cd primetime

cp –r $SYNOPSYS/doc/pt/tutorial . cd tutorial

确认目录中有以下这些文件:

AM2910.db The design .db for the top-level of the design CONTROL.db The design .db for the CONTROL block REGCNT.db The design .db for the REGCNT block UPC.db The design .db for the UPC block Y.data The Stamp data file for the Y block Y.mod The Stamp model file for the Y block Y_lib.db The library .db for the Y block

STACK_lib.db The library .db for the STACK block pt_lib.db The technology library .db

stack.qtm.pt The quick timing model script for the stack block optimize.dcsh The dc_shell optimization script

timing.dcsh An example DC shell timing script for translation tutorial.pt The complete PrimeTime tutorial script for your reference.

例子是一个AM2910微处理器,如图所示模块图。

运行PrimeTime: pt_shell

定义搜索路径和链接路径: pt_shell>set search_path “.”

Pt_shell>set link_path “* pt_lib.db STACK_lib.db Y_lib.db” * pt_lib.db STACK_lib.db Y_lib.db

读入设计:

PrimeTime支持以下设计格式:

. Synopsys database files (.db) (Use the read_db command) . Verilog netlist files (Use the read_verilog command)

. Electronic Design Interchange Format (EDIF) netlist files (Use the read_edif command.) . VHDL netlist files (Use the read_vhdl command.) 读入AM2910的顶层设计文件: pt_shell> read_db AM2910.db

Loading db file '/u/joe/primetime/tutorial/AM2910.db' 1

链接设计:

pt_shell> link_design AM2910

Loading db file '/u/joe/primetime/tutorial/pt_lib.db'

Loading db file '/u/joe/primetime/tutorial/STACK_lib.db' Loading db file '/u/joe/primetime/tutorial/Y_lib.db' Linking design AM2010 ...

Loading db file '/u/joe/primetime/tutorial/STACK.db' ...

Designs used to link AM2910:

CONTROL, REGCNT, STACK, UPC, Y Libraries used to link AM2910: STACK_lib, Y_lib, pt_lib

Design 'AM2910' was successfully linked

显示当前已载入的设计: pt_shell>list_designs

得到当前载入单元的信息: pt_shell>report_cell

编译一个标记模型(Stamp Model):

标记模型是一个诸如像DSP或RAMS那样复杂模块的静态时序模型。 标记模型与.lib模型共存,而不能代替它们。

- 建立标记模型是用在晶体管层次的设计上,在这个层次上没有门级网表。

- 标记模型语言是一种源代码语言,被编译成Synopsys的.db文件格式,可以被PrimeTime或Design Compiler使用。

- 标记模型包含引脚到引脚的时序弧、建立和保持时间数据、模式信息、引脚的电容和驱动能力等等。标记模型还能保存属性(面积等等)。 - 三态输出、锁存器和内部生成的时钟都可以被建模。 一个标记模型包括两种源代码文件格式: - .mod文件

仅包含引脚到引脚的弧的描述(没有延时数据)。 - .data文件

包含.mod文件中每条弧的延时数据。

标记模型可以有多个.data文件来描述不同运作条件下的时序。 两种文件格式都需要编译成一个.db模型。

编译AM2910中Y模块的标记模型(标记源代码文件是Y.mod和Y.data): pt_shell> compile_stamp_model -model_file Y.mod \\ -data_file Y.data -output Y

Wrote model library core to ?./Y_lib.db? Wrote model to ?./Y.db?

PrimeTime生成两个.db文件:

Y_lib.db:一个库文件,包含一个单元(cell)。这个单元叫做核(core)。 Y.db:一个设计文件,引用Y_lib.db中的单元核。

编译一个快速时序模型(Quick Timing Model):

可以为设计中还没有完成的模块建立一个快速时序模型,以使得完整的时序分析能够进行。通常的情形是:

- 模块的HDL代码还没有完成时

- 为了划分设计,在评估阶段为实际设计进行时序预测、约束估计时 - 模块的标记模型还没有完成时

一个快速时序模型是一组PrimeTime命令,而不是一种语言。为了方便和文档化可以将它们写在一个脚本文件中,然后保存为.db的格式。在PrimeTime和Design Compile中快速时序模型很有用处。

还可以将快速时序模型保存为标记模型,这是开始一个复杂标记模型的一种便利的方法。 例子中STACK模块的快速时序模型脚本文件是stack.qtm.pt,建立这个模型: pt_shell> source -echo stack.qtm.pt ...

pt_shell> report_qtm_model; ...

pt_shell> save_qtm_model -output STACK -format db Wrote model library core to './STACK_lib.db' Wrote model to './STACK.db'

进行时序分析 配置运作环境

读入并链接AM2910设计: pt_shell> set search_path \

pt_shell> set link_path \pt_shell> read_db AM2910.db pt_shell> link_design AM2910

链接了AM2910会导致其它已经链接的设计变为不链接的状态。在内存里只允许有一个链接的设计。当一个设计不链接,所有时序信息将被去除,并会出现警告,这和Design Compiler不同。如果需要保存所标注的信息,可以在链接一个新的设计之前用write_script命令。如果以后重新链接这个设计,只要运行这个脚本就可以了。

建立运作条件和连线负载模型:

PrimeTime在生成建立时序报告(setup timing reports)时使用最大(Maximum)运作条件和连线负载模型;在生成保持时序报告(hold timing reports)时使用最小(Minimum)运作条件和连线负载模型。

pt_shell> set_operating_conditions -library pt_lib -min BCCOM -max WCCOM pt_shell> set_wire_load_mode top

pt_shell> set_wire_load_model -library pt_lib -name 05x05 -min pt_shell> set_wire_load_model -library pt_lib -name 20x20 –max

如果运作条件在两个不同的库中,用set_min_library命令来在最大库和最小库中建立联系。 得到一张库的列表: pt_shell> list_libraries

Library Registry:

STACK_lib /home/gray/primetime/tutorial/ STACK_lib.db:STACK_lib

Y_lib /home/gray/primetime/tutorial/Y_lib.db:Y_lib * pt_lib /home/gray/primetime/tutorial/ pt_lib.db:pt_lib

得到一个库的详细信息: pt_shell>report_lib pt_lib

基本声明:

pt_shell> create_clock -period 30 [get_ports CLOCK] pt_shell> set clock [get_clock CLOCK] pt_shell> set_clock_uncertainty 0.5 $clock pt_shell> set_clock_latency -min 3.5 $clock pt_shell> set_clock_latency -max 5.5 $clock pt_shell> set_clock_transition -min 0.25 $clock pt_shell> set_clock_transition -max 0.3 $clock

时钟门锁检查(Clock-Gating Checks):

pt_shell> set_clock_gating_check -setup 0.5 -hold 0.1 $clock pt_shell> set_min_pulse_width 2.0 $clock

如果设计被反标过,PrimeTime用SDF的建立和保持时间值,以及时钟脉冲宽度说明。

得到一个时序摘要: pt_shell>report_design …

pt_shell>report_reference …

检查时序声明和设计的结构:

在进行时序分析之前运行check_timing命令是关键。这个命令能够检查到所有可能的时序问题。

在这个例子中将会出现警告,原因是存在没有约束条件的端口。

运行时序分析

设置端口延时并检查时序:

pt_shell> set_input_delay 0.0 [all_inputs] -clock $clock

pt_shell> set_output_delay 2.0 [get_port INTERRUPT_DRIVER_ENABLE] -clock $clock pt_shell> set_output_delay 1.25 [get_port MAPPING_ROM_ENABLE] -clock $clock pt_shell> set_output_delay 0.5 [get_port OVERFLOW] -clock $clock

pt_shell> set_output_delay 1.0 [get_port PIPELINE_ENABLE] -clock $clock pt_shell> set_output_delay 1.0 [get_port Y_OUTPUT] -clock $clock