问题所在
最近在使用黑金的AXU3EG板卡对着正点原子ZYNQ7020的例程进行移植学习。但在编写tb代码以及使用modelsim进行仿真时出了问题,发现我的实际波形与正点的对不上,仔细测量一下波形发现,我的系统时钟是6ns周期,而不是理想中的5ns周期,这才想到,正点的板子用的是50M单端时钟,也就是20ns的时钟周期,一半也就是10ns,而黑金的板子用的是200M的差分时钟,也就是5ns的时钟周期,一半也就是2.5ns(虽然我在编写tb代码时只用了其中一级),而正是这个小数出了问题!
我开始时编写的tb代码中:
`timescale 1ns / 1ns //仿真单位/仿真精度
...
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#200
sys_rst_n <= 1'b1;
end
always begin
#2.5
sys_clk <= ~sys_clk;
end
...
时钟的翻转是我自己臆想的2.5ns翻一次,而实际上,由于仿真单位和仿真精度都是定义的1ns,也就是说,我对于时钟的翻转,最后会给优化为四舍五入的#3,即3ns,也就导致最后的时钟为6ns的周期。
问题的解决
知道了问题的所在,解决起来就轻松了,只需要把仿真单位和仿真精度再提高一些就行了,而在ns后面的单位是ps,它们之间的进制也是1000,修改代码如下:
`timescale 100ps / 100ps //仿真单位/仿真精度
...
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#2000
sys_rst_n <= 1'b1;
end
always begin
#25
sys_clk <= ~sys_clk;
end
...
这里需要注意,不仅仅是只改变最上面的仿真单位和精度,下面使用#的所有延时都要同步的进行修改。
然后继续进行仿真,发现由于修改了仿真单位和精度,最后的坐标轴变成了以ps为单位,这会把所有数都显得很大,不太美观,如下图所示:
这时,我们只需要右键点击坐标轴,选择“Grid, Timeline & Cursor Control…”。
再把Time units改回ns即可。
这时再测量系统时钟,就是预期的5ns时钟周期了。