最近有个小任务,需要把原来SoC中的PLL替换一下,然后就想仿真看一下能不能用。
因为仿真时用的是行为模型,它有一个参考时钟采集频率的模块,后面会拿来计算一个周期多长。
如下所示:
real current;
real clkref_cycle;
initial begin
current<=0.0000;
clkref_cycle<=10000.0000;
end
always @ (posedge clkref) begin
current<= $time;
clkref_cycle<= $time - current;
end
然后是(cycle/反馈分频系数N)跟固定值比大小。
如果<a,则为固定值x;
如果a< 且<b,则保持原值;
如果>b,则为固定值y。
得到的这个结果就是某个时钟的时钟周期。
而$time是用来返回当前系统时间的,64位整数的形式,常用于仿真时,与"`timescale 时间单位/时间精度"中的"时间单位"有关系。
第一次修改,我就直接修改了时间单位,从原来的1ns改为了1ps,以及相应的时钟周期25M
和操作延时,然后分频系数与模型自带的仿真tb里一致,是4倍频,其余都保持与自带的一致。
结果是:变成了分频,而且lock信号为不定态。
追查原因是等待时间控制没有给定,所以造成 X态,导致lock信号变为X态。
第二次修改,修改了给定时间控制。
结果是:l