| |
看一例:
module gate(clk, gate, din, qout);
input clk,gate;
input [7:0] din;
output [7:0] qout;
reg [7:0] qout;
wire gclk;
//assign gclk = clk & gate;
always@(posedge gclk)
qout <= din;
reg gate_out;
always@(clk)
if(!clk)
gate_out <= gate;
assign gclk = clk & gate_out;
endmodule
DC综合脚本:
set lib $env(DC_LIB)
set target_library "slow.db"
set link_library "* $target_library"
set search_path ". ../src ../scripts $lib"
analyze -format verilog gate.v
elaborate gate
uniquify
link
check_design
create_clock -period 100 [get_ports clk]
set input_exp_clk [remove_from_collection [all_inputs] [get_ports clk]]
set_input_delay 60 -clock [get_clocks clk] $input_exp_clk
set_output_delay 30 -clock [get_clocks clk] [all_outputs ]
set_clock_gating_check -setup 3 -hold 0
compile
综合结束后,setup时序分析:
1. 门控逻辑AND2的setup分析:
report_timing -delay max -nets -from gate_out
上图中可以看到到达时间是从clk的下降沿计算的,
以及要求时间是从上升沿开始,同事考虑到clock_gating_check中的setup设置
1. setup的borrow time 分析
report_timing -delay max -nets -to gate_out_reg/D
有dc综合脚本的设置,以及上图report:
到达时间是60,由于clk脉冲宽度是50,为了保证输入端建立时间满足,需要向ednpoint borrow time,上图中可以看出,time borrowed from endpoint为10,使要求时间变成60,从而slack为0,满足时序要求。
现在综合脚本中加入
set_max_time_borrow 7 [get_clock clk]
从新查看setup 的borrow time分析:
report_timing -delay max -nets -to gate_out_reg/D