微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC后端设计交流 > 关于后仿真问题?

关于后仿真问题?

时间:10-02 整理:3721RD 点击:
大家好,我用DC逻辑综合完成后,没有时序违例,但是,当我用modelsim对综合后的.v网表进行后仿真时,有很多保持时间违例,都是500ps,这是怎么回事啊,应该怎样修改呢?谢谢

1,你有没有用sdf反标?
2,你检查一下standard cell的.v文件,看看里面的timing check语句里面有没有默认的hold time值?
3,找一下500ps这个数字可能从哪里来,然后根据这个debug一下。是不是你的clock cycle?

yohuang兄,你好,
1、我用过sdf反标了。
2、你说的stand_cell的.v文件,我找到了,并且找到了违例的地方,就是下面这些:
// timing checks
$setuphold(posedge CK, posedge RN, tsetup$RN$CK ,thold$RN$CK , NOTIFIER);
$width(negedge RN, tminpwl$RN, 0, NOTIFIER);
$setuphold(posedge CK &&& (SandRandSEb == 1), posedge D, tsetup$D$CK,thold$D$CK, NOTIFIER);
$setuphold(posedge CK &&& (SandRandSEb == 1), negedge D, tsetup$D$CK,thold$D$CK, NOTIFIER);
$setuphold(posedge CK &&& (SandRandSE == 1), posedge SI, tsetup$SI$CK, thold$SI$CK , NOTIFIER);
$setuphold(posedge CK &&& (SandRandSE == 1), negedge SI, tsetup$SI$CK, thold$SI$CK , NOTIFIER);
$setuphold(posedge CK &&& (SandR == 1), posedge SE, tsetup$SE$CK, thold$SE$CK , NOTIFIER);
$setuphold(posedge CK &&& (SandR == 1), negedge SE, tsetup$SE$CK, thold$SE$CK , NOTIFIER);
$width(negedge CK &&& (SandR == 1), tminpwl$CK, 0, NOTIFIER);
$width(posedge CK &&& (SandR == 1), tminpwh$CK, 0, NOTIFIER);
endspecify
endmodule // SDFFRX1
`endcelldefine

但是,我看不懂这些,他们都是什么意思啊?
3、时序仿真报告的部分内容如下:
# ** Error: /export/home/st5/h.264/sim/tsmc18.v(19720): $hold( posedge CK &&& (SandRandSEb == 1):64245 ns, posedge D:64245 ns, 500 ps );
#Time: 64245 nsIteration: 2Instance: :me_tb:ME_and_MC_u:sad_4x4_gen:h_1x4_sad_u5:sum9_reg_reg_2_
# ** Error: /export/home/st5/h.264/sim/tsmc18.v(19720): $hold( posedge CK &&& (SandRandSEb == 1):64245 ns, posedge D:64245 ns, 500 ps );
#Time: 64245 nsIteration: 2Instance: :me_tb:ME_and_MC_u:sad_4x4_gen:h_1x4_sad_u5:sum6_reg_reg_3_
# ** Error: /export/home/st5/h.264/sim/tsmc18.v(19720): $hold( posedge CK &&& (SandRandSEb == 1):64245 ns, posedge D:64245 ns, 500 ps );
#Time: 64245 nsIteration: 2Instance: :me_tb:ME_and_MC_u:sad_4x4_gen:h_1x4_sad_u5:sum3_reg_reg_0_
# ** Error: /export/home/st5/h.264/sim/tsmc18.v(19720): $hold( posedge CK &&& (SandRandSEb == 1):64245 ns, posedge D:64245 ns, 500 ps );
#Time: 64245 nsIteration: 2Instance: :me_tb:ME_and_MC_u:sad_4x4_gen:h_1x4_sad_u5:sum1_reg_reg_1_
上面这些内容中,“19720”表示的是stand_cell的.v文件的第19720行,可以看出,都是同一stand_cell的违例,我看过了,这个stand_cell是SDFFRX1。
但是,该如何解决这些违例呢?
谢谢! 2# yohuang

很明显我们可以看到ck rising edge (当SandRandSEb == 1时)是在64245ns发生的,而数据D的变化也是在64245ns发生的,可能违反了holdtime的要求。我怀疑你的sdf文件是不是正确,或者有没有成功反标?你在生成.sdf文件的时候.lib(.db)文件用对了没有? 看看.sdf文件中这个违例的cell的timing check部分hold time是多少?是不是和.v里面默认的是一样的,如果是,就可能是没有反标对

继续关注。

关注中

yohuang兄,你好。下面是.sdf文件中对一个SDFFRX1的延迟描述,你觉得该如何分析呢?谢谢了。
(CELL
(CELLTYPE "SDFFRX1")
(INSTANCE sad_4x4_gen/h_1x4_sad_u0/sum9_reg_reg_2_)
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (1.017:1.017:1.017) (0.669:0.669:0.669))
(IOPATH (negedge RN) Q () (0.573:0.573:0.573))
(IOPATH (posedge CK) QN (0.273:0.273:0.273) (0.353:0.353:0.353))
(IOPATH (negedge RN) QN (0.178:0.178:0.178) ())
)
)
(TIMINGCHECK
(WIDTH (posedge CK) (0.129:0.129:0.129))
(WIDTH (negedge CK) (0.221:0.221:0.221))
(SETUP (posedge D) (posedge CK) (0.131:0.132:0.132))
(SETUP (negedge D) (posedge CK) (0.393:0.394:0.394))
(HOLD (posedge D) (posedge CK) (-0.110:-0.110:-0.110))
(HOLD (negedge D) (posedge CK) (-0.287:-0.289:-0.289))
(SETUP (posedge RN) (posedge CK) (0.053:0.053:0.053))
(HOLD (posedge RN) (posedge CK) (-0.034:-0.034:-0.034))
(WIDTH (negedge RN) (0.192:0.192:0.192))
)
)
4# yohuang

综合后即使出现hold违例也没有必要看,因为是假的,在CTS之后才开始关注hold违例

设置:
timescale 1ns/10ps
试试看。

高手过招啊

看看你的reset 信号 和clock信号之间的关系吧,我也出现了这个问题,不要让reset和CLOCK 同一个边沿,你可以试一试,估计是tesetbench有问题啊!

综合后后仿,出现hold违例,关系不大,有些时候就算PR后后仿,出现这些问题也不要紧,只要功能正确且PT检查没问题就OK了

而且要注意下,报错的都是库中.v文件的错误,所以我一直觉得这是仿真的精度问题导致的

很明显是复位挂了

应该是你综合时设置的HOLD UNCERTAITY太小了,所以看不到HOLD违规

DC综合后的网表仿真还不是后仿,这时的时序是假的,因为没有进行延时反标,用的是仿真库里面的延时信息,这个是不准确的。
你看下仿真波,此时数据变化和时钟沿是否在同一时刻。如果是可以把仿真库里面时序器件和其它逻辑器件的延时改一下,比如其它组合逻辑延时改为0,寄存器等时序器件延时改为0.2.

我一看到500ps我就知道sdf没有反标上去。坑爹的.v文件里面的setup等时间检查就1ns和0.5ns2种。你用的也是tsmc?

500ps的保持时间违例完全不需要管,在全局布线完后运行保持时间修正的脚本就好了。

########很明显我们可以看到ck rising edge (当SandRandSEb == 1时)是在64245ns发生的,而数据D的变化也是在64245ns发生的,可能违反了holdtime的要求。我怀疑你的sdf文件是不是正确,或者有没有成功反标?你在生成.sdf文件的时候.lib(.db)文件用对了没有? 看看.sdf文件中这个违例的cell的timing check部分hold time是多少?是不是和.v里面默认的是一样的,如果是,就可能是没有反标对#########
以上是小编关于Modelsim后仿出现的HOLDtime违背的解答之一我也出现了这个问题,.sdf文件中的那个有问题的cell的hold time 是
##(HLOD (posedge D)(posedge CK )(-0.090:-0.114:-0.114))
(HLOD (posedge D)(posedge CK )(0.023:-0.037:-0.037))。###
库文件 关于这个cell的是$hold(posedge CK, posedge RB, 7.54:10.62:18.24, flag);
根据小编说的两个不一样就是反标对了是么~那我该怎么办呢~求小编解惑啊

您好,我也遇到相同的问题了,请问该如何解决啊?

综合后一般不需要表sdf仿真,这个问题可能是由于你的clock上有buffer 引起了clock 沿的错位导致。综合的时候clock是理想的不能插入buffer。如果clock 上一个器件都没有反标不反标都不会有hold。

学习啦!

关注~

看不懂

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top