为什么,是“再说”,因为前面写的有篇博客叫ModelSim难以察觉的问题
废话少说,进入正题:
前些天仿真PLL时,发现PLL没有时钟输出,但是示波器一测,反而有输出,这真是个怪事!!
难道是ModelSim出问题了?我傻傻的想到。
于是,开始分析问题,我例化PLL时,设置的时钟输入是50M。而TestBeach中是这么写的:
CLK = 0; forever #5 CLK = ~CLK;
这句话就是产生一个时钟,#5也就是时钟的一个延时,
所谓RTL仿真是在理想的情况下进行的,一般情况下这里写几真的无所谓。
但是对于PLL而言却是有所谓了!
CLK = 0; forever #5 CLK = ~CLK; 这样写的话就是一个周期10ns,时钟就是100M
而我例化PLL时设置的时钟输入是50M,这两者明显不匹配,这显然让ModelSim很为难啊!于是给出一个警告,PLL就不产生波形了。
好了问题找到了:仿真涉及到PLL时,TestBeach产生的时钟,必须去匹配PLL,不然不产生波形!
于是乎:
CLK = 0; forever #10 CLK = ~CLK;
这样波形就出来了:
我们还发现,PLL起振,大约在20NS(意外的收获,嘿嘿)
再说一点,有的时候我写时钟时会写成这样(笔误造成的)
CLK = 0; forever CLK = ~CLK;
也就是把那个延时忽略掉了,这样的话,你基本是看不到波形了,
因为,ModelSim基本上已经卡死了!
如果有一天,你发现你的ModelSim无缘无故卡死,请看下你的TestBeach
是不是把这个重要的延时写漏了~~