版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/moon9999/article/details/77179085
primetime是进行静态时序分析(STA)的工具,根据设计者给出的时序约束来对电路进行分析观察设计是否满足时序要求。
pt能够提供以下检查:
建立时间和保持时间检查;
时钟脉冲宽度的检查;
时钟门的检查;
未约束的时钟端点;
组合反馈回路等。
需要注意的是pt的输入文件是门级网表,一般先要通过dc将RTL级电路转化为门级网表之后作为pt的输入。
实例:
需要仿真的电路:fifo.v
module fifo(datain, rd, wr, rst, clk, dataout, full, empty);
input [7:0] datain;
input rd, wr, rst, clk;
output [7:0] dataout;
output full, empty;
wire [7:0] dataout;
reg full_in, empty_in;
reg [7:0] mem [15:0];
reg [3:0] rp, wp;
assign full = full_in;
assign empty = empty_in;
// memory read out
assign dataout = mem[rp];
// memory write in
always@(posedge clk) begin
if(wr && ~full_in) mem[wp]<=datain;
end
// memory write pointer increment
always@(posedge clk or negedge rst) begin
if(!rst) wp<=0;
else begin
if(wr && ~full_in) wp<= wp+1'b1;
end
end
// memory read pointer increment
always@(posedge clk or negedge rst)begin
if(!rst) rp <= 0;
else begin
if(rd && ~empty_in) rp <= rp + 1'b1;
end
end
// Full signal generate
always@(posedge clk or negedge rst) begin
if(!rst) full_in <= 1'b0;
else begin
if( (~rd && wr)&&((wp==rp-1)||(rp==4'h0&&wp==4'hf)))
full_in <= 1'b1;
else if(full_in && rd) full_in <= 1'b0;
end
end
// Empty signal generate
always@(posedge clk or negedge rst) begin
if(!rst) empty_in <= 1'b1;
else begin
if((rd&&~wr)&&(rp==wp-1 || (rp==4'hf&&wp==4'h0)))
empty_in<=1'b1;
else if(empty_in && wr) empty_in<=1'b0;
end
end
endmodule
set synopsys_dc_setup_file 0
if { $synopsys_dc_setup_file == 0} {
set target_library [ list /home/tshell/lib/TSMC90/fast.db]
set link_library "* $target_library"}
define_design_lib WORK -path "work"
analyze -library WORK -format verilog fifo.v
elaborate -architecture verilog -library WORK fifo
check_design
create_clock clk -name ideal_clock1 -period 20
set_input_delay 8.0 [remove_from_collection [all_inputs] clk] -clock ideal_clock1
set_output_delay 8.0 [all_outputs] -clock ideal_clock1
set_max_area 0
compile -map_effort medium -area_effort medium
report_area > synth_area.rpt
report_cell > synth_cells.rpt
report_qor > synth_qor.rpt
report_resources > synth_resoutces.rpt
report_timing -max_paths 10 > synth_timing.rpt
write_sdc fifo.sdc
write -f ddc -hierarchy -output fifo.ddc
write -hierarchy -format verilog -output fifo.v
在将fifo.v文件和dc.tcl文件放好后,右键打开终端,先后输入
dc_shell
source dc.tcl
完成dc综合,此时fifo.v已经转化问门级网表
接下来进行pt时序分析
右键打开终端,输入
pt_shell
和dc一样,指定库的路径
set target_library [ list /home/tshell/lib/TSMC90/fast.db]
set link_library "* $target_library"}
read_verilog fifo.v
指定顶层文件
current_design fifo
读入时序约束文件sdc文件
source fifo.sdc
之后可以看分析结果,设计中主要四种路径时序比较典型:
输入到寄存器
寄存器到寄存器
寄存器到输出
输入到输出
输入如下指令查看时序
report_timing -from [all_inputs] -to [all_registers -data_pins] > timing.rpt
report_timing -from [all_register -clock_pins] -to [all_registers -data_pins] >> timing.rpt
report_timing -from [all_registers -clock_pins] -to [all_outputs] >> timing.rpt
report_timing -from [all_inputs] -to [all_outputs] >> timing.rpt
之后打开timing.rpt查看结果。
注:
report_timing -from [all_inputs] -to [all_registers -data_pins] > timing.rpt
是缺省下的输出,如果想进行特定条件下的输出,需要加入参数
如要输出寄存器到寄存器的保持时间最小的10条路径,可以修改指令
report_timing -from [all_register -clock_pins] -to [all_registers -data_pins] -max_paths 10 -slack_lesser_than 200 -delay_type min > timing.rpt
以上是通过指令行完成,也可以把指令写成tcl脚本来运行。
set target_library [ list /home/tshell/lib/TSMC90/fast.db]
set link_library "* $target_library"
read_verilog fifo.v
current_design fifo
link_design fifo
source fifo.sdc
report_timing -from [all_inputs] -to [all_registers -data_pins] > timing.rpt
report_timing -from [all_register -clock_pins] -to [all_registers -data_pins] >> timing.rpt
report_timing -from [all_registers -clock_pins] -to [all_outputs] >> timing.rpt
report_timing -from [all_inputs] -to [all_outputs] >> timing.rpt
保存后,输入
pt_shell
source dc.tcl
即可