为什么后仿时用的库文件包含延时信息?
`timescale 1ns/1ps
`celldefine
module AFHCINX2 ( S, CO, A, B, CIN);
output S, CO;
input A, B, CIN;
not I0 (ci, CIN);
xor I1 (S, A, B, ci);
and I2 (a_and_b, A, B);
and I3 (a_and_ci, A, ci);
and I4 (b_and_ci, B, ci);
orI5 (CO, a_and_b, a_and_ci, b_and_ci);
specify
specparam
tplh$A$S= 1.0,
tphl$A$S= 1.0,
tplh$A$CO= 1.0,
tphl$A$CO= 1.0,
tplh$B$S= 1.0,
tphl$B$S= 1.0,
tplh$B$CO= 1.0,
tphl$B$CO= 1.0,
tplh$CIN$S= 1.0,
tphl$CIN$S= 1.0,
tplh$CIN$CO= 1.0,
tphl$CIN$CO= 1.0;
if ((A == 1'b0 && B == 1'b0) || (A == 1'b1 && B == 1'b1))
(CIN *> S)= (tplh$CIN$S,tphl$CIN$S);
if ((A == 1'b0 && B == 1'b1) || (A == 1'b1 && B == 1'b0))
(CIN *> S)= (tplh$CIN$S,tphl$CIN$S);
if (B == 1'b0 && CIN == 1'b0)
(A*> S)= (tplh$A$S,tphl$A$S);
if (B == 1'b1 && CIN == 1'b1)
(A*> S)= (tplh$A$S,tphl$A$S);
if (B == 1'b0 && CIN == 1'b1)
(A*> S)= (tplh$A$S,tphl$A$S);
if (B == 1'b1 && CIN == 1'b0)
(A*> S)= (tplh$A$S,tphl$A$S);
if (A == 1'b0 && CIN == 1'b0)
(B*> S)= (tplh$B$S,tphl$B$S);
if (A == 1'b1 && CIN == 1'b1)
(B*> S)= (tplh$B$S,tphl$B$S);
if (A == 1'b0 && CIN == 1'b1)
(B*> S)= (tplh$B$S,tphl$B$S);
if (A == 1'b1 && CIN == 1'b0)
(B*> S)= (tplh$B$S,tphl$B$S);
if (B == 1'b1)
(A*> CO) = (tplh$A$CO,tphl$A$CO);
if (B == 1'b0)
(A*> CO) = (tplh$A$CO,tphl$A$CO);
if (A == 1'b1)
(B*> CO) = (tplh$B$CO,tphl$B$CO);
if (A == 1'b0)
(B*> CO) = (tplh$B$CO,tphl$B$CO);
(CIN *> CO) = (tplh$CIN$CO, tphl$CIN$CO);
endspecify
endmodule // AFHCINX2
`endcelldefine
有的单元还有时序检查的内容:
// timing checks
$width(posedge WW, tminpwh$WW, 0, NOTIFIER);
$period(posedge WW, tperiod$WW, NOTIFIER);
$setuphold(negedge WW, posedge WB, tsetup$WW$WB, thold$WW$WB, NOTIFIER);
$setuphold(negedge WW, negedge WB, tsetup$WW$WB, thold$WW$WB, NOTIFIER);
在不加载SDF文件的情况下,仿真结果中就已经有了延迟,如下所示
而我加载SDF之后,仿真时出现了好多保持时间违例,而在encounter中却没有报保持时间违例,
我的问题是,为什么要在库中定义延时信息?有什么作用?
顶一下,请教高人
后仿用的软件和ENCOUNTER的时序分析能力不同吧
1)library中的延时信息可以修改
2)back-annotated simulation中使用的是sdf中的delay信息,而不是library中的
的确如你所说,加载SDF之后延时是SDF中的,但是时序检查还是库中定义的,这样不就是覆盖了SDF中的时序检查函数了吗?
timing_check 是库中定义的,但是其使用的数值还是来自SDF,我不懂你的问题在什么地方?
所谓后仿,就是使用真实的delay,即SDF里面的delay信息来替代库中的信息进行仿真
看来你是不了解SDF的产生过程,SDF中的timing check信息一般是来源于dotdb,作为同一个库,simulation model和dotdb中的timing_check应该是相同的,当然也有不同的情况,那个不是我们要说的重点。
所以你说的覆盖并不存在,两者是匹配的
用modelsim仿真出现以下error
Error: /home/tian/work/modelsim/liang/encounter_back_end/source/csm18ic.v(9382): $hold( posedge CK &&& (rn_and_sn == 1):842005 ps, posedge D:842480 ps, 500 ps );
可见这里hold time检查的时间是500ps,即仿真库里定义的值:
thold$K$CK= 0.5
而不是检查SDF中的hold time,换句话说,仿真库里的$setuphold函数在起作用,受其影响,生成了error
而且这些error显示对于每个DFF都是检查了500ps的hold time,而SDF中检查的hold time每个DFF都不一样,也就是仿真库和SDF中的hold time产生了不一致
1)你确保你的SDF被正确反标了么?有没有没有反标的部分?
2)你报出来的那个log没有参考意义,要看具体出错的cell,然后在sdf中找到对应的cell看看哪里有问题
这是SDF的检查函数:
(TIMINGCHECK
(WIDTH (posedge CK) (0.211::0.211))
(WIDTH (negedge CK) (0.386::0.386))
(SETUPHOLD (posedge D) (posedge CK) (0.258::0.258) ())
(SETUPHOLD (negedge D) (posedge CK) (0.494::0.494) ())
(SETUPHOLD (posedge RN) (posedge CK) (0.243::0.243) ())
(SETUPHOLD (negedge RN) (posedge CK) (0.501::0.501) ())
原来是SDF中并没有检查hold time,这样就由库中的检查函数进行了检查,也就是说如果SDF中检查了某项时序,那么库中定义的检查函数就不起作用了,如果没有进行某项时序检查,就由库中的函数进行检查,SDF有高的优先级。
现在问题是,encounter生成的SDF为什么没有检查hold time?
setuphold就是同时check setup和hold,
对啊,第一个参数是setup time,第二个是hold time,可是后面第二个参数那的括号是空的啊
请问小编怎么做到不加sdf也能用modelsim跑出波形的呀?怎么设置的呀?