目录
一、前言
二、配置选项概览图
三、配置选项
3.1 Options
3.1.1 report
3.1.2 path limits
3.1.3 path display
3.2 Advanced
3.2.1 report
3.2.3 miscellaneous
3.3 Timer Settings
3.4 共有部分
四、工程示例
4.1 工程设计代码
4.2 约束文件
4.3 Options
4.3.1 Report
4.3.2 path limits
4.4 Advanced
4.4.1 report
4.4.2 file output
4.4.3 miscellaneous
4.4.4 Timer Settings
五、参考资料
一、前言
在Vivado初步跑通综合与实现流程后,就需要时序报告关注时序效果,时序报告的生成需要单独执行流程Report_timing_summary。在运行report timing summary时,可以进行相关的配置选项设置,使得筛选出自己需要的报告,有时配置不恰当,会导致无法查看到需要的路径,本文结合实际的工程例子进行详细的说明配置选项相关功能。
二、配置选项概览图
下图是report timing summary中所有配置选项的结构图
三、配置选项
下面,将对配置选项逐项进行解释。
3.1 Options
3.1.1 report
path delay type: 设置运行分析的类型,可设为min,max,min_max,综合阶段和实现阶段默认max和min都会分析,如果选择min,则只进行hold和removal分析
report unconstrained paths:该选项默认勾选,对无约束的路径进行报告,当使用tcl命令report_timing_summary时是不会打开该配置
report datasheet:生成设计的datasheet信息,datasheet主要是输入端口与相关时钟的setup/hold关系,以及从时钟到输出端口的max/min时延,还有输入输出总线的偏斜信息。 内容和在“Reports->Timing->Report datasheet”中的内容一致,等效tcl命令中添加-datasheet
3.1.2 path limits
maximum number of paths per clock or path group:控制每个时钟组或路径组的最大数目,等效的tcl命令为-max_paths
maximum number of worst paths per endpoint:控制每个路径终点的最大路径数,该值一定是小于或等于maximum number of paths per clock or path group的值,等效的tcl命令为-nworst
3.1.3 path display
display paths with slack less than:通过路径的slack值进行过滤,不影响summary表的内容
significant digits:控制报告中数字显示的精度,默认是3位小数
3.2 Advanced
3.2.1 report
report from cells:指定报告的时序路径都经过设置的cells,该cells可以是起点,终点或中间部分
show input pins in path:勾选后会显示时序路径上每个单元的输入引脚
report number of routable nets:勾选后只报告布线成功net的
report unique pins勾选后,对于每一组引脚(起点和终点)仅展示一条时序路径
export to file:默认的时序报告结果是写入时序窗口中,可以指定导出到指定的文件,写入时可以指定时覆盖overwrite或追加append写入
interactive report file:以赛灵思RPX格式写入指定名称的文件中,RPX文件是一个包含所有报告信息的交互式报告,可以被重载入内存中
3.2.3 miscellaneous
ignore command errors:直接执行命令,会忽略命令中的错误也不会返回错误信息,等效的tcl命令为-quiet
suspend message limits during command execution:暂时性的忽略任何信息显示限制的设置,返回所有信息,等效的tcl命令为-verbose
3.3 Timer Settings
interconnect:用于控制net的时延值的计算方式,可以是评估的cell间的布线距离,实际的布线或者时序分析时移除net的时延。默认情况下,综合后阶段是用估算的net延时值,实现阶段后是用实际的net时延。可以设置值:actual,estimated,none
estimated:对于未布局的单元cells,走线时延值是用最可能的布局情况下的值,会考虑driver和load以及扇出;对于已经布局的cells,走线时延是基于driver和load的距离以及扇出
actual:对于已经布线的net,走线时延是和实际硬件走线的时延一致
none:不考虑走线时延,等效走线时延值为0
speed grade:设置器件的速度等级,通常情况下该值和工程创建时设置的速度一致,也可以不需要重新运行综合和实现,直接改变速度等级进行时序分析,等效的tcl命令为 set_speed_grade
multi-corner configuration:指定fast/slow corner(可以理解为芯片运行的外部环境的好坏)下分析的路径时延类型,可以为none,min,max,min_max
disable flight delays:勾选后时序分析不会考虑I/O端口的封装时延,该配置项并非report_timing_summary的参数,因此勾选或不勾选report_timing_summary命令无变化,属于config_timing_analysis命令的参数
3.4 共有部分
command:根据当前配置选项的情况自动生成对应的tcl命令
pen in a New Tab:勾选后在一个新的tab中显示结果,原先的tab标签结果保留,不勾选则会覆盖原有的结果
open in Timing Analysis Layout:勾选后时序分析中以“Timing Analysis”的布局方式呈现结果
四、工程示例
4.1 工程设计代码
示例设计中涵盖了各种时序约束的场景
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/01/14 14:19:29
// Design Name:
// Module Name: all_timing
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module all_timing(CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,CLKFBOUT,clk1,clk2,rst,d1,d2,S,i_bus,o_bus,bus_clk2,out_syn,out_asyn,and_out,o_case,out_sense,sel);
input CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,clk1,clk2,rst,d1,d2,S;
input [4:0] i_bus;
output reg [4:0] o_bus,bus_clk2;
output out_syn,out_asyn,and_out,CLKFBOUT;
output out_sense;
input [1:0] sel;
reg ff1,ff2,ff_asyn,ff_syn,ff_and;
reg ff_case;
output reg o_case;
reg [4:0] bus;
wire sum12,and_c,CLKOUT0,CLKOUT1;
wire [4:0] bus_c;
wire o_bufgmux,ffcase_n;
reg mux,ff_sense,ff2_sense;
wire mux_n;
PLLE2_ADV #(
.BANDWIDTH("OPTIMIZED"), // OPTIMIZED, HIGH, LOW
.CLKFBOUT_MULT(8), // Multiply value for all CLKOUT, (2-64)
.CLKFBOUT_PHASE(0.0), // Phase offset in degrees of CLKFB, (-360.000-360.000).
// CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz).
.CLKIN1_PERIOD(0.0),
.CLKIN2_PERIOD(0.0),
// CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128)
.CLKOUT0_DIVIDE(1),
.CLKOUT1_DIVIDE(2),
.CLKOUT2_DIVIDE(4),
.CLKOUT3_DIVIDE(5),
.CLKOUT4_DIVIDE(1),
.CLKOUT5_DIVIDE(1),
// CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999).
.CLKOUT0_DUTY_CYCLE(0.4),
.CLKOUT1_DUTY_CYCLE(0.5),
.CLKOUT2_DUTY_CYCLE(0.5),
.CLKOUT3_DUTY_CYCLE(0.5),
.CLKOUT4_DUTY_CYCLE(0.5),
.CLKOUT5_DUTY_CYCLE(0.5),
// CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000).
.CLKOUT0_PHASE(0.0),
.CLKOUT1_PHASE(0.0),
.CLKOUT2_PHASE(0.0),
.CLKOUT3_PHASE(0.0),
.CLKOUT4_PHASE(0.0),
.CLKOUT5_PHASE(0.0),
.COMPENSATION("ZHOLD"), // ZHOLD, BUF_IN, EXTERNAL, INTERNAL
.DIVCLK_DIVIDE(1), // Master division value (1-56)
// REF_JITTER: Reference input jitter in UI (0.000-0.999).
.REF_JITTER1(0.0),
.REF_JITTER2(0.0),
.STARTUP_WAIT("FALSE") // Delay DONE until PLL Locks, ("TRUE"/"FALSE")
)
PLLE2_ADV_inst (
// Clock Outputs: 1-bit (each) output: User configurable clock outputs
.CLKOUT0(CLKOUT0), // 1-bit output: CLKOUT0
.CLKOUT1(CLKOUT1), // 1-bit output: CLKOUT1
.CLKOUT2(CLKOUT2), // 1-bit output: CLKOUT2
// Feedback Clocks: 1-bit (each) output: Clock feedback ports
.CLKFBOUT(CLKFBOUT), // 1-bit output: Feedback clock
// Clock Inputs: 1-bit (each) input: Clock inputs
.CLKIN1(CLKIN1), // 1-bit input: Primary clock
.CLKIN2(CLKIN2), // 1-bit input: Secondary clock
// Control Ports: 1-bit (each) input: PLL control ports
.CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2
.RST(rst), // 1-bit input: Reset
// Feedback Clocks: 1-bit (each) input: Clock feedback ports
.CLKFBIN(CLKFBIN) // 1-bit input: Feedback clock
);
// End of PLLE2_ADV_inst instantiation
always@(posedge CLKOUT0,negedge rst)
if(!rst)
begin
ff1<=1'b0;
ff2<=1'b0;
end
else begin
ff1<=d1;
ff2<=d2;
end
assign sum12=ff1+ff2;
always@(posedge CLKOUT1,negedge rst)
if(!rst)
ff_syn<=1'b0;
else begin
ff_syn<=sum12;
end
assign out_syn=ff_syn;
always@(posedge clk1,negedge rst)
if(!rst)
ff_asyn<=1'b0;
else begin
ff_asyn<=sum12;
end
assign out_asyn=ff_asyn;
assign and_c=ff_asyn&d1;
always@(posedge clk1,negedge rst)
if(!rst)
ff_and<=1'b0;
else begin
ff_and<=and_c;
end
assign and_out=ff_and;
always@(posedge clk1,negedge rst)
if(!rst)
bus<=5'b0;
else begin
bus<=i_bus+1'b1;
end
assign bus_c=bus+d2;
always@(*)
begin
o_bus=bus;
end
always@(posedge clk2,negedge rst)
if(!rst)
bus_clk2<=5'b0;
else begin
bus_clk2<=bus_c+d1;
end
//set_case_analysis
BUFGMUX #(
)
BUFGMUX_inst (
.O(o_bufgmux), // 1-bit output: Clock output
.I0(CLKIN1), // 1-bit input: Clock input (S=0)
.I1(CLKIN2), // 1-bit input: Clock input (S=1)
.S(S) // 1-bit input: Clock select
);
always@(posedge o_bufgmux,negedge rst)
if(!rst)
ff_case<=1'b0;
else begin
ff_case<=d1;
end
assign ffcase_n=!ff_case;
always@(posedge o_bufgmux,negedge rst)
if(!rst)
o_case<=1'b0;
else begin
o_case<=ffcase_n;
end
//set_clock_sense
//set_clock_sense
always@(sel)
begin
case(sel)
2'b00:mux<=clk1;
2'b01:mux<=clk2;
2'b10:mux<=CLKIN1;
2'b11:mux<=CLKIN2;
endcase
end
assign mux_n=mux;
always@(posedge mux_n)
begin
if(!rst)
ff_sense<=1'b0;
else
ff_sense<=d1;
end
always@(posedge mux_n)
begin
if(!rst)
ff2_sense<=1'b0;
else
ff2_sense<=ff_sense;
end
assign out_sense=ff2_sense;
endmodule
4.2 约束文件
//创建主时钟和生成时钟
create_clock -period 10.000 -name clkin1 -waveform {0.000 5.000} -add [get_ports CLKIN1]
create_clock -period 5.000 -name clkin2 -waveform {0.000 2.500} -add [get_nets CLKIN2]
create_clock -period 4.000 -name clk2 -waveform {0.000 2.000} -add [get_ports clk2]
create_clock -period 4.000 -name clk1 -waveform {0.000 2.000} -add [get_ports clk1]
create_generated_clock -name gen_clk -source [get_pins PLLE2_ADV_inst/CLKOUT1] -multiply_by 2 -add -master_clock clkin2 [get_pins PLLE2_ADV_inst/CLKOUT0]
set_input_jitter [get_clocks clk2] 0.500
set_clock_latency -clock [get_clocks clk2] 0.333 [get_pins {bus_reg[1]/D}]
set_system_jitter 0.009
set_clock_uncertainty 0.500 [get_clocks clk1]
//设置时钟组和总线偏斜
set_clock_groups -name clkin1_group -asynchronous -group [get_clocks clkin1]
set_bus_skew -from [get_cells {{bus_reg[0]} {bus_reg[1]} {bus_reg[2]} {bus_reg[3]} {bus_reg[4]}}] -to [get_cells {{bus_clk2_reg[0]} {bus_clk2_reg[1]} {bus_clk2_reg[2]} {bus_clk2_reg[3]} {bus_clk2_reg[4]}}] 0.550
set_input_delay -clock [get_clocks clk1] 1.111 [get_ports {d1 d2 {i_bus[0]} {i_bus[1]} {i_bus[2]} {i_bus[3]} {i_bus[4]} rst}]
set_output_delay -clock [get_clocks clk2] 0.222 [get_ports {and_out {o_bus[0]} {o_bus[1]} {o_bus[2]} {o_bus[3]} {o_bus[4]} out_asyn out_syn}]
//设置时序例外分析
set_false_path -setup -from [get_pins {bus_reg[2]/C}] -to [get_pins {bus_clk2_reg[4]/D}]
set_max_delay -from [get_pins {bus_reg[1]/C}] 2.000
set_min_delay -from [get_pins {bus_reg[0]/C}] 0.500
set_external_delay -from [get_ports CLKFBOUT] -to [get_ports CLKFBIN] 0.444
set_multicycle_path -from [get_pins {bus_reg[0]/C}] -to [get_pins {bus_clk2_reg[2]/D}] 2
set_disable_timing [get_cells {bus_reg[3]}]
//设置时序断言
set_case_analysis 1 [get_ports S]
set_data_check -from [get_pins {bus_reg[2]/C}] -to [get_pins {bus_reg[2]/Q}] 0.333 -clock [get_clocks clk2]
set_clock_sense -positive -clocks [get_clocks clk1] [get_pins ff_asyn_reg/C]
group_path -name {group_path} -weight 1.000 -from [get_ports {d1 d2}]
4.3 Options
4.3.1 Report
path delay type设置为max,只报告setup路径
path delay type设置为min,只报告hold路径
report unconstrained paths勾选后,在报告Unconstrained paths会有相关无约束的路经,不勾选该栏内容为空
report datasheet勾选后,左侧会有Datasheet标签,右侧为对应IO datasheet内容
4.3.2 path limits
maximum number of paths per clock or path group设置为4,maximum number of worst paths per endpoint设置为2,即相同时钟组的最大数目为5,一个终点显示的最大worst数目为2
同步时钟路径,相同to的路径数最多为2条,相同时钟组的路径数最多为5条
跨时钟路径,相同to的路径数最多为2条,相同时钟组的路径数最多为5条
display paths with slack less than 设置为-0.2ns,则报告只显示slack小于-0.2ns路径
significant digits设置为2,即所有数值包括slack值和路径延时值只显示2为小数
4.4 Advanced
4.4.1 report
report from cells设置[get_cells ff1_reg],报告中只有包含单元ff1_reg的路径
show input pins in path勾选后,在每条路径的Netlist resource中都会显示cell单元的输入引脚
report number of routable nets
report unique pins勾选后,对于From和to组成的一组时序路径,只会显示一条
4.4.2 file output
export to file默认文件是名称为timing_report的txt文件
保存结果
interactive report file导出文件默认为timing_report.rpx,因为是实现阶段,所以默认路径为impl_1
保存结果
4.4.3 miscellaneous
ignore command errors参数运行成功后
suspend message limits during command execution勾选后任何多余信息也都会打印,如下图未添加参数-verbose
添加参数-verbose,报告开头多了info、warning类的信息
4.4.4 Timer Settings
interconnect设置为不同值estimated和actual,none主要是时序分析模型数据的差异,最终是相同路径的slack值存在差异。
estimated的结果
actual的结果
设为none时
multi-corner configuration中如果两个都设为none,则无时序路径,本配置可用于fast corner、slow corner的路径过滤
fast coner设置max时,则只有fast corner下的setup路径
disable flight delays设置在tcl console使用config_timing_analysis命令,如下图执行完config_timing_analysis -disable_flight_delays true后再执行report_timing_summary
查看结果 disable flight delays为true,设置成功
command容易理解,即自动显示配置项对应的tcl命令
open in a New Tab勾选后每次在执行一次分析会新生成一个tab标签页,原先的标签结果保留
open in Timing Analysis Layout,假设勾选前布局为默认布局,timing窗口位置如下图
勾选该配置后执行时序分析,Timing窗口位置和Power窗口并列
五、参考资料
用户手册《ug906-vivado-design-analysis.pdf》
《ug835-vivado-tcl-commands-en-us-2023.1.pdf》