PrimeTime 时序分析流程和方法.docx
《PrimeTime 时序分析流程和方法.docx》由会员分享,可在线阅读,更多相关《PrimeTime 时序分析流程和方法.docx(11页珍藏版)》请在冰豆网上搜索。
PrimeTime时序分析流程和方法
PrimeTime时序分析流程和方法
PrimeTime是Synopsys的一个单点的全芯片、门级静态时序分析器。
它能分析大规模、同步、数字ASICS的时序。
PrimeTime工作在设计的门级层次,并且和Synopsys其它工具整合得很紧密。
基本特点和功能:
时序检查方面:
建立和保持时序的检查(Setupandholdchecks)
重新覆盖和去除检查(Recoveryandremovalchecks)
时钟脉冲宽度检查(Clockpulsewidthchecks)
时钟门锁检查(Clock-gatingchecks)
设计检查方面:
没有时钟端的寄存器
没有时序约束的结束点(endpoint)
主从时钟分离(Master-slaveclockseparation)
有多哥时钟的寄存器
对层次敏感的时钟(Level-sensitiveclocking)
组合电路的反馈环(Combinationalfeedbackloops)
设计规则检查,包括最大电容(maximumcapacitance)、最大传输时间(maximumtransition)和最大扇出(maximumfanout)
PrimeTime时序分析流程和方法:
在时序分析之前需要做的步骤:
1、 建立设计环境
- 建立搜索路径(searchpath)和链接路径(linkpath)
- 读入设计和库
- 链接顶层设计
- 建立运作条件、连线负载模型、端口负载、驱动和传输时间
2、 说明时序声明(约束)
- 定义时钟周期、波形、不确定性(uncertainty)和滞后时间(latency)
- 说明输入、输出端口的延时
3、 说明时序例外情况(timingexceptions)
- 多周期路径(multicyclepaths)
- 不合法路径(falsepaths)
- 说明最大和最小延时、路径分割(pathsegmentation)和失效弧(disabledarcs)
4、 进行分析和生成报告
- 检查时序
- 生成约束报告
- 生成路径时序报告
开始
先建立目录并将PrimeTime本身所带的一个例子拷到新建的目录下,在下面的内容中将要用到这个例子。
mkdirprimetime
cdprimetime
cp–r$SYNOPSYS/doc/pt/tutorial.
cdtutorial
确认目录中有以下这些文件:
AM2910.db Thedesign.dbforthetop-levelofthedesign
CONTROL.db Thedesign.dbfortheCONTROLblock
REGCNT.db Thedesign.dbfortheREGCNTblock
UPC.db Thedesign.dbfortheUPCblock
Y.data TheStampdatafilefortheYblock
Y.mod TheStampmodelfilefortheYblock
Y_lib.db Thelibrary.dbfortheYblock
STACK_lib.db Thelibrary.dbfortheSTACKblock
pt_lib.db Thetechnologylibrary.db
stack.qtm.pt Thequicktimingmodelscriptforthestackblock
optimize.dcsh Thedc_shelloptimizationscript
timing.dcsh AnexampleDCshelltimingscriptfortranslation
tutorial.pt ThecompletePrimeTimetutorialscriptforyour
reference.
例子是一个AM2910微处理器,如图所示模块图。
运行PrimeTime:
pt_shell
定义搜索路径和链接路径:
pt_shell>setsearch_path“.”
Pt_shell>setlink_path“*pt_lib.dbSTACK_lib.dbY_lib.db”
*pt_lib.dbSTACK_lib.dbY_lib.db
读入设计:
PrimeTime支持以下设计格式:
.Synopsysdatabasefiles(.db)(Usetheread_dbcommand)
.Verilognetlistfiles(Usetheread_verilogcommand)
.ElectronicDesignInterchangeFormat(EDIF)netlistfiles(Usetheread_edifcommand.)
.VHDLnetlistfiles(Usetheread_vhdlcommand.)
读入AM2910的顶层设计文件:
pt_shell>read_dbAM2910.db
Loadingdbfile'/u/joe/primetime/tutorial/AM2910.db'
1
链接设计:
pt_shell>link_designAM2910
Loadingdbfile'/u/joe/primetime/tutorial/pt_lib.db'
Loadingdbfile'/u/joe/primetime/tutorial/STACK_lib.db'
Loadingdbfile'/u/joe/primetime/tutorial/Y_lib.db'
LinkingdesignAM2010...
Loadingdbfile'/u/joe/primetime/tutorial/STACK.db'
...
DesignsusedtolinkAM2910:
CONTROL,REGCNT,STACK,UPC,Y
LibrariesusedtolinkAM2910:
STACK_lib,Y_lib,pt_lib
Design'AM2910'wassuccessfullylinked
显示当前已载入的设计:
pt_shell>list_designs
得到当前载入单元的信息:
pt_shell>report_cell
编译一个标记模型(StampModel):
标记模型是一个诸如像DSP或RAMS那样复杂模块的静态时序模型。
标记模型与.lib模型共存,而不能代替它们。
- 建立标记模型是用在晶体管层次的设计上,在这个层次上没有门级网表。
- 标记模型语言是一种源代码语言,被编译成Synopsys的.db文件格式,可以被PrimeTime或DesignCompiler使用。
- 标记模型包含引脚到引脚的时序弧、建立和保持时间数据、模式信息、引脚的电容和驱动能力等等。
标记模型还能保存属性(面积等等)。
- 三态输出、锁存器和内部生成的时钟都可以被建模。
一个标记模型包括两种源代码文件格式:
- .mod文件
仅包含引脚到引脚的弧的描述(没有延时数据)。
- .data文件
包含.mod文件中每条弧的延时数据。
标记模型可以有多个.data文件来描述不同运作条件下的时序。
两种文件格式都需要编译成一个.db模型。
编译AM2910中Y模块的标记模型(标记源代码文件是Y.mod和Y.data):
pt_shell>compile_stamp_model-model_fileY.mod\
-data_fileY.data-outputY
Wrotemodellibrarycoreto‘./Y_lib.db’
Wrotemodelto‘./Y.db’
PrimeTime生成两个.db文件:
Y_lib.db:
一个库文件,包含一个单元(cell)。
这个单元叫做核(core)。
Y.db:
一个设计文件,引用Y_lib.db中的单元核。
编译一个快速时序模型(QuickTimingModel):
可以为设计中还没有完成的模块建立一个快速时序模型,以使得完整的时序分析能够进行。
通常的情形是:
- 模块的HDL代码还没有完成时
- 为了划分设计,在评估阶段为实际设计进行时序预测、约束估计时
- 模块的标记模型还没有完成时
一个快速时序模型是一组PrimeTime命令,而不是一种语言。
为了方便和文档化可以将它们写在一个脚本文件中,然后保存为.db的格式。
在PrimeTime和DesignCompile中快速时序模型很有用处。
还可以将快速时序模型保存为标记模型,这是开始一个复杂标记模型的一种便利的方法。
例子中STACK模块的快速时序模型脚本文件是stack.qtm.pt,建立这个模型:
pt_shell>source-echostack.qtm.pt
...
pt_shell>report_qtm_model;
...
pt_shell>save_qtm_model-outputSTACK-formatdb
Wrotemodellibrarycoreto'./STACK_lib.db'
Wrotemodelto'./STACK.db'
进行时序分析
配置运作环境
读入并链接AM2910设计:
pt_shell>setsearch_path"."
pt_shell>setlink_path"*pt_lib.dbSTACK_lib.dbY_lib.db"
pt_shell>read_dbAM2910.db
pt_shell>link_designAM2910
链接了AM2910会导致其它已经链接的设计变为不链接的状态。
在内存里只允许有一个链接的设计。
当一个设计不链接,所有时序信息将被去除,并会出现警告,这和DesignCompiler不同。
如果需要保存所标注的信息,可以在链接一个新的设计之前用write_script命令。
如果以后重新链接这个设计,只要运行这个脚本就可以了。
建立运作条件和连线负载模型:
PrimeTime在生成建立时序报告(setuptimingreports)时使用最大(Maximum)运作条件和连线负载模型;在生成保持时序报告(holdtimingreports)时使用最小(Minimum)运作条件和连线负载模型。
pt_shell>set_operating_conditions-librarypt_lib-minBCCOM-maxWCCOM
pt_shell>set_wire_load_modetop
pt_shell>set_wire_load_model-librarypt_lib-name05x05-min
pt_shell>set_wire_load_model-librarypt_lib-name20x20–max
如果运作条件在两个不同的库中,用set_min_library命令来在最大库和最小库中建立联系。
得到一张库的列表:
pt_shell>list_libraries
LibraryRegistry:
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_libpt_lib
基本声明:
pt_shell>create_clock-period30[get_portsCLOCK]
pt_shell>setclock[get_clockCLOCK]
pt_shell>set_clock_uncertainty0.5$clock
pt_shell>set_clock_latency-min3.5$clock
pt_shell>set_clock_latency-max5.5$clock
pt_shell>set_clock_transition-min0.25$clock
pt_shell>set_clock_transition-max0.3$clock
时钟门锁检查(Clock-GatingChecks):
pt_shell>set_clock_gating_check-setup0.5-hold0.1$clock
pt_shell>set_min_pulse_width2.0$clock
如果设计被反标过,PrimeTime用SDF的建立和保持时间值,以及时钟脉冲宽度说明。
得到一个时序摘要:
pt_shell>report_design
…
pt_shell>report_reference
…
检查时序声明和设计的结构:
在进行时序分析之前运行check_timing命令是关键。
这个命令能够检查到所有可能的时序问题。
在这个例子中将会出现警告,原因是存在没有约束条件的端口。
运行时序分析
设置端口延时并检查时序:
pt_shell>set_input_delay0.0[all_inputs]-clock$clock
pt_shell>set_output_delay2.0[get_portINTERRUPT_DRIVER_ENABLE]-clock$clock
pt_shell>set_output_delay1.25[get_portMAPPING_ROM_ENABLE]-clock$clock
pt_shell>set_output_delay0.5[get_portOVERFLOW]-clock$clock
pt_shell>set_output_delay1.0[get_portPIPELINE_ENABLE]-clock$clock
pt_shell>set_output_delay1.0[get_portY_OUTPUT]-clock$clock
pt_shell>set_driving_cell-lib_cellIV-librarypt_lib[all_inputs]
pt_shell>set_capacitance0.5[all_outputs]
pt_shell>check_timing
保存设置:
将所设置的时序信息保存为脚本文件可以确保在接下去的运行中保留一个时序环境的复本。
使用write_script命令,这个命令将以下这些信息保存到一个命令文件中:
Clocks Names,waveforms,latency,anduncertainty
Exceptions Falseandmulticyclepaths,minimumandmaximum
delays,andpathgroups
Delays Inputandoutputdelays,alldelayannotations,and
timingchecks
Netandportattributes Capacitance,resistance,andfanout
Designenvironment Wireloadmodel,operationcondition,drive,drivingcell,
andtransition
Designrules Minimumandmaximumcapacitance,minimumand
maximumfanout,andminimumandmaximumtransition
write_script命令可以将脚本写成DesignCompiler格式(dcshordctclmode)或者PrimeTime格式(ptsh)。
不能用PrimeTime写一个被标注设计的.db文件,因为PrimeTime只能写时序模型的.db文件。
以脚本为主要方式是为了和DesignCompiler传递数据。
pt_shell>write_script-formatdctcl-outputAM2910.tcl
pt_shell>write_script-formatdcsh-outputAM2910.dcsh
pt_shell>write_script-formatptsh-outputAM2910.pt
运行基本的分析:
1. 得到AM2910的约束报告:
pt_shell>report_constraint
2.检查报告中的时序违规(timingviolations)和约束违规(constraintsviolations)
3. 到更多关于违规的信息:
pt_shell>report_constraint-all_violators
4. 检查这份报告:
这里有多少违规的结束点(endpoints)?
报告基于路径的时序信息:
pt_shell>report_timing
设置时序例外情况:
因为PrimeTime直到进行完整的时序升级(timingupdate)之前才检查时序例外情况的正确性,所以要运行report_exceptions以确定它们的正确性。
声明AM2910的时序例外情况。
设置一条两个时钟周期的路径,其中建立时间为2,保持时间为1:
pt_shell>set_false_path-fromU3/OUTPUT_reg/CP\
-toU2/OUTPUT_reg/D
pt_shell>set_multicycle_path-setup2-from\
INSTRUCTION-toU2/OUTPUT_reg
pt_shell>set_multicycle_path-hold1-from\
INSTRUCTION-toU2/OUTPUT_reg
pt_shell>update_timing
pt_shell>report_exceptions
pt_shell>report_exceptions-ignored
评估时序例外情况结果:
1. 得到另外一个约束报告并评估违规情况:
pt_shell>report_constraint–all_violators
2. 检查这份约束报告
3. 确信所设置的例外情况是否能够使得设计中的违规显现比以前更少。
设计中最差余量(theworstslack)是什么?
pt_shell>report_timing
4.检查这份详细的时序报告。
5.看其它的违规路径。
从这份约束报告中选择一个结束点,并键入:
pt_shell>report_timing-toendpoint
6.检查这份报告。
提取一个子设计的边界时序特性信息:
一个子设计的相关时序特性信息的提取是基于它相关的上级设计环境。
这些信息有
两个主要用途:
一个主要用途是PrimeTime将这些相关特性信息提供给DesignCompiler作为约束信息。
这是DC中从芯片级分析到模块级优化主要的纽带,与只是作分析的单点工具相比提供了更佳的整合性。
提取了相关特性信息之后,命令PrimeTime写一个包含子设计或模块时序信息的脚本。
在提取时序特性的同时,要注意:
1. 特性信息提取不能够预计子设计的时序状况;
2. 特性信息提取没有最大或最小这两种工作模式。
所以在做这步工作之前要设置单一的、正确的运作条件。
对于PrimeTime而言,相关时序信息允许作层次化的时序分析,并观察芯片层次的
时序约束;对于DesignCompiler而言,相关时序信息允许在综合或逻辑优化时设置时序约束。
在DesignCompiler中设置综合或优化约束的步骤是:
1. 在PrimeTime中读入顶层设计
2. 确认需要优化的子设计
3. 提取每一个子设计的特性信息
4. 为每一个子设计生成一个DesignCompiler的脚本
5. 将这些子设计读到DesignCompiler中
6. 将步骤4中生成的脚本引入进来
7. 进行模块级的优化
仅将需要优化的子设计读入到DC中去,这样DC运行起来可以效率高一些。
优化完这
些模块之后,再将它们读入到PrimeTime中去作新一轮的时序分析。
在这个例子中,从时序报告中可以看出模块U3(REGCNT)和U2(UPC)可以进一步优化,也许能消除一些违规情况。
因为要纠正建立时序违规,所以要配置最差情况的运行条件。
pt_shell>set_operating_conditions-librarypt_libWCCOM
pt_shell>characterize_context{U2U3}
pt_shell>write_contextU2-outputUPC.char.dcsh\
-formatdcsh
pt_shell>write_contextU3-outputREGCNT.char.dcsh\
-formatdcsh
pt_shell>write_script-formatptsh-outputAM2910.new.pt
%dc_shell
dc_shell>includeoptimize.dcsh
...
dc_shell>quit
pt_shell>read_db{REGCNT.opt.dbUPC.opt.db}
pt_shell>current_designAM2910
pt_shell>swap_cellU3{REGCNT.opt.db:
REGCNT}
pt_shell>swap_cellU2{UPC.opt.db:
UPC}
pt_shell>sourceAM2910.new.pt
pt_shell>check_ti