通常如果你的设计在较低时钟频率时通过了仿真,但是在较高时钟频率时却失败了,你的第一个问题应该是你的设计在某个较高时钟频率时是否达到了时序约束的要求。
然而这里我们将举这样一个例子,就是对于某个较高时钟频率你已经检查了静态时序分析(STA),而且时序约束也是正确的。
这种情况是什么引起的较高时钟频率仿真失败呢?
可能的原因就是仿真方式、设计本身或者testbench设置方式有问题。
然而在较低时钟频率通过了仿真这个事实就排除了设计/testbench/仿真在设置上的问题。
排除了上面两项,下一个可能就是脉冲拒绝(reject)或者脉冲错误。
“脉冲拒绝(reject)”和“脉冲错误”是Verilog仿真中的概念。
这些概念说的是脉冲的持续时间小于某个值(pulse_r)就不会通过某个电路元件。
当然脉冲持续时间大于pulse_r,但是如果小于另一个值pulse_e尽管会通过,但是在仿真中显示的是“x”。
这个持续时间是以通过某元器件延迟的百分比来表示的。
比如通过某元件的延迟是1ns。
0.5ns的脉冲表示为50%的持续时间。
现在假设设计采用的频率是200MHz。
对应的周期就是5ns。
那么一半就是2.5ns。
在仿真中时钟每隔2.5ns变化一次,也就是时钟脉冲的宽度是2.5ns。
让我们假设内部时钟网络某一脉冲宽度是2.8ns(也就是大于2.5ns)。
分析结果,pulse-duraTIon(脉冲持续时间)《100%。
这个脉冲可能就会被“拒绝(rejected)”,也就是说尽管时钟信号能够到达某个具体网络的输入端,但是却不能从这个网络输出。
因此尽管STA分析显示200MHz很合适,但是仿真却不能通过。
设计其他模块将不能获得时钟脉冲。
解决这个仿真问题的方法是在仿真设置中修改脉冲拒绝和错误(reject/error)限制。
例如在ModelSim中我们可以设置:
+transport_path_delays +transport_int_delays +pulse_r/0 +pulse_e/0
后续操作还有:
1.将pulse-rejecTIon限制修改为0。(不会拒绝任何一个脉冲)
2.将pulse-error限制修改为0。(脉冲宽度低于某个值时不会显示输出为“x”)
同时要将interconnect延迟模式修改为transport,其实是修改了脉冲滤波选项。
最后的问题是我们做这么多的修改就是为了能通过仿真测试吗?
在真正的硅片中的实际情况是怎样的?
在硅片中大部分内部互连线在每隔几皮秒后就会设置一个repeater(中继器)。
因此几纳秒的脉冲会顺利通过(合适的延迟),这不会存在问题。
具体出现问题的情形可能是这样的:
1.频率增加(脉冲宽度更小了)
2.器件尺寸增加(某个路径的内部延迟可能变大了,导致内部延迟时间大于脉冲达到的传输时间)