文章目录
1-前言
IC后仿中出现了一个Timing violation问题, 在此做出分析,并给出解决方案。
2-问题描述与分析
IC后仿中发生Timing violation问题:
后仿log:
"/home/xx/xx.v", 15691: Timing violation in tb_top.xx\cc_dly_reg[0]
$setuphold( posedge CK &&& (ENABLE_NOT_SE == 1'b1):314047001.763ns, negedge D &&& (ENABLE_NOT_SE == 1'b1):314047001.596ns, limits: (0.409ns,0.017ns) );
后仿fsdb:
信号说明:
cc_rx
: dut的input,cc_rx由testbench按intf.cb1驱动给dut;cc_dly[0]
: 某一D触发器的输出;dut_clk
/tb_clk
: Testbench产生的时钟,一个给dut,一个给tb;clk
: dut的input, dut_clk与clk相连;
现象:dut 在 clk上升沿采集cc_rx信号,cc_rx在黄线处变化同时不满足Setup time约束,cc_dly[0]产生x态。
3-解决方案与验证
解决方案:在tb中保持dut_clk
/tb_clk
边沿对齐,代码如下:
parameter DUTPERIOD = 166.6; //6M 166.66ns
parameter TBPERIOD = 100; //100ns
//===gen input and connect signal
initial begin
dut_clk = 1;
forever begin
#(DUTPERIOD/2) dut_clk = ~dut_clk;
end
end
initial begin
tb_clk = 1;
forever begin
#(DUTPERIOD/4) tb_clk = ~tb_clk;
//#(TBPERIOD/2) tb_clk = ~tb_clk;
end
end
验证dut_clk
/tb_clk
边沿是否对齐:
前访为理想状态,两个clk边沿完全对齐;
后仿文件中加入了延时,存在偏差(10.6ns);
eg : tb 运用clocking block在posedge tb_clk #1ns信号驱动给dut,就是保证建立保持时间的一种方法。
eg : tb 运用clocking block在posedge tb_clk #1ns信号驱动给dut,就是保证建立保持时间的一种方法。 ↩︎