开始
先建立目录并将PrimeTime本身所带的一个例子拷到新建的目录下,在下面的内容中将要用到这个例子。
mkdir primetime
cd primetime
cp –r $SYNOPSYS/doc/pt/tutorial .
cd tutorial
运行PrimeTime:
pt_shell
后面的 命令都是在这个shell之下运行的
1. 编译时序模型 (
这1 节中的操作并非对所有的设计都是必需的)
1.1编译 Stamp Model
Stamp model 是针对于复杂模块--例如 DSP核心或者 RAM--而建立的静态时序模型。它一般是为晶体管级的设计而创建的,在设计中没有门级的网表。
一个 Stamp model 包括两个源文件:
1).mod 文件,包含对 pin-to-pin 的 arc 的描述(不包括延时)。
2).data 文件,包括.mod 文件中描述的每一个 arc 的延迟数据。
例如,对于 AM2910 设计中的 Y 模块(见图 2-2),编译其 Stamp model:
compile_stamp_model -model_file Y.mod -data_file Y.data -output Y
其中 Y.mod 和 Y.data 是源文件,编译后生成了两个.db 文件:Y_lib.db 和 Y.db。
其中 Y_lib.db 是一个库文件,其中包括一个被称为 core 的单元;而 Y.db 是一个
设计文件,是 Y_lib.db 中的单元 core 的例化。正是由于它们之间的这种关系,为
了在链接时能够正确地例化 Y.db,库 Y_lib.db 必须要加入到链接路径(link_path)中去。
1.2
编译快速时序模型
对于设计中的某些未完工的模块--比如说,该模块的 HDL,或者完整的
stamp model 没有完成--你可以创建一个快速时序模型来进行分析。快速时序模
型是一个临时性的模型,可以提供进行时序分析而需要的时序信息。实际上,快速
时序模型是包含一系列 pt_shell 命令的文件,而不是语言。这样比使用 Stamp mo
-del 的语言去写一个模型花费的时间更少。
例如为 AM2910 中的 STACK 模块创建一个快速时序模型:
source -echo stack.qtm.pt
report_qtm_model;
save_qtm_model -output STACK -format db
其中 stack.qtm.pt 是一个脚文件,描述了建立快速时序模型所需要的所有
pt_shell 命令,所以在这里直接 source 就可以了。它的具体内容参见附录[1]。
创建好之后,用 save_qtm_model 命令把该模型保存为.db 格式的文件。同其
他类型的模型一样,PrimeTime 也创建了两个.db 文件,STACK_lib.db 和 STACK
.db。
进入正题:
作一些基本的环境设置和准备工作
设置查找路径:
set search_path "."
这里“.”代表
当前目录
设置链接路径:
set link_path "* pt_lib.db STACK_lib.db Y_lib.db"
读入设计文件:
read_db AM2910.db
(还支持read_verilog
read_edif
read_vhdl 等)
链接顶层设计:
link_design AM2910
(显示当前已载入的设计: pt_shell>list_designs 得到当前载入单元的信息: pt_shell>report_cell)
设置操作条件和线上负载/端口驱动 负载等
set_operating_conditions -library pt_lib -min BCCOM -max WCCOM
set_wire_load_mode top
set_wire_load_model -library pt_lib -name 05x05 -min
set_wire_load_model -library pt_lib -name 20x20 -max
set_driving_cell -lib_cell IV -library pt_lib [all_inputs]
set_capacitance 0.5 [all_outputs]
对所有的输出端设置50pf的电容负载。
对有关时钟的参数进行设置
create_clock -period 30 [get_ports CLOCK]
set clock [get_clock CLOCK]
set_clock_uncertainty 0.5 $clock
set_clock_latency -min 3.5 $clock
set_clock_latency -max 5.5 $clock
set_clock_transition -min 0.25 $clock
set_clock_transition -max 0.3 $clock
当然也可以这样设置:
create_clock -period 30 -waveform [0 15] clk
set_clock_uncertainty 0.5 [get_clocks clk]
set_clock_latency -min 3.5 [get_clocks clk]
set_clock_latency -max 5.5 [get_clocks clk]
set_clock_transition -min 0.25 [get_clocks clk]
set_clock_transition -max 0.3 [get_clocks clk]
设置时钟-门校验(clock-gating checks)
设定时钟-门的建立和保持时间的数值,以及最小的脉冲宽度。
set_clock_gating_check -setup 0.5 -hold 0.1 $clock
set_min_pulse_width 2.0 $clock
在开始静态时序分析之前,注意要执行下面的指令进行检查:
check_timing
该命令会检查该设计的结构和约束,给出可能存在的时序问题,如果存在问题的话
则给出 errors 或者 warnings。
设置端口延迟并检验时序
对于所有与时钟相关的端口,都要设置输入、输出的延迟。
set_input_delay 0.0 [all_inputs] -clock $clock
set_output_delay 2.0 [get_port INTERRUPT_DRIVER_ENABLE]
-clock $clock
set_output_delay 1.25 [get_port MAPPING_ROM_ENABLE]
-clock $clock
set_output_delay 0.5 [get_port OVERFLOW]
-clock $clock
set_output_delay 1.0 [get_port PIPELINE_ENABLE]
-clock $clock
set_output_delay 1.0 [get_port Y_OUTPUT]
-clock $clock
或者最简单的:(相当于时序约束)
set_input_delay 15.0 -clock clk
[all_inputs]
set_output_delay 15.0 -clock clk
[all_inputs]
保存以上的设置
使用 write_script 命令将所作的设置保存到一个脚文件中,这样在下一次运行的时候可以直接通过该文件来完成所有的设置。
该命令可以生成三种格式的文件:
write_script -format dctc1 -output AM2910.tc1
write_script -format dcsh -output AM2910.dcsh
write_script -format ptsh -output AM2910.pt
运行基本的分析:
如果在命令中加入-verbose 参数,将在 report 中得到更详细的细节。如果加入-all_violators 参数,在 report 中会列出对于每一项约束,设计中违反最严重的端点。
得到基于路径的时序分析
report_timing
在没有任何命令参数时,在 report 中列出的是对于每个 path group,该设计中最长的最大路径。如果需要的是该设计中最短的最小路径的话,可以在命令中加上-delay min 参数。
或者加一些参数
report_timing -to [all_outputs]
当然在分析前也可以添加时序例外后,再进行约束报告和时序分析。
注意: 读写SDF
对于起初的静态时序分析,估计网络的延时信息是基于一个连线负载模式。 实际上延时是与设计中单元和网络的布局布线有关的。
一个布局器或一个布线器提供更详细和更精确的延时信息,可以用来提供给PrimeTime作更精确的分析。这个过程被称作反标(back-annotation)。反标信息经常是以标准延时格式Standard Delay Format(SDF)提供的。
所以, 在布局布线后,现在的网表中已经包括了实际的时钟数信息。所以上面关于
对有关时钟的参数进行设置
create_clock -period 30 -waveform [0 15] clk
set_clock_uncertainty 0.5 [get_clocks clk]
set_clock_latency -min 3.5 [get_clocks clk]
set_clock_latency -max 5.5 [get_clocks clk]
set_clock_transition -min 0.25 [get_clocks clk]
set_clock_transition -max 0.3 [get_clocks clk]
这一段,,在布局布线后可以直接改为
create_clock -period 30 -waveform [0 15] clk
set_propagated_clock [get_clocks clk]
set_propagated_clock 命令可以根据时钟数,自动计算时钟信号到达终点的延时和偏移。