使用后门方式测量时钟频率的需求来源更多是SOC验证的场景,由于SOC的规模较大,一次编译时间成本较高,在N个小时级别。如果采用前门方式,比如编写测量频率的module或者interface,一旦有新的测量需求则就需要TB重新连接时钟信号,重新编译环境。
此前的一篇文章,提出了一个问题:如何后门准确地捕获到信号地跳变沿?
如何捕获后门路径信号的跳变?
如果无法精确捕获到信号地跳变沿,那么也就无法"精确地"测量出时钟地频率。容易想到的办法,是可以使用如下的方法进行测量:
bitdut_value=1 //step1:找到信号低电平 while(dut_value)begin hdl_read("xxx",dut_value) #N end //step2:找到高电平,作为测量的第一个上升沿时刻 bitdut_value=0 //找到信号低电平 while(!dut_value)begin hdl_read("xxx",dut_value) #N end //step3:找到低电平,作为下降沿 ... //step4:找到高电平,作为测量的第二个上升沿。记录此时的仿真时间,减去step2的仿真时间,得到时钟周期 ...
上述的代码需要考虑如下问题:
时钟频率,时钟频率的大小决定了两次后门读取的间隔,即上述代码中的#N,这也是后门方式测不准的来源。
timescale,dut信号的timescale和后门测量所在的scope的timescale可能并不一致。
那怎么解决测不准的问题?
第一次意识到这个问题,作者也曾一度陷入苦思冥想,始终找不到完美的解决办法。曾经也想过用#1step来进行step级别的delay,但也由于仿真器的差异、环境结构的差异,表现不够稳定。虽然已过去了近一年的时间,工作也换了新的公司,还好对此的思考没有停止。
最近终于开发出了clock_probe_pkg,一个可以使用后门方式,精确测量时钟频率的package。
请看下面的demo:
`timescale1ps/1ps moduletb; importclock_probe_pkg::*; regclk1,clk2,clk3; initialbegin clk1=0; clk2=0; clk3=0; fork foreverbegin#11;clk1=~clk1;end foreverbegin#17;clk2=~clk2;end foreverbegin#19;clk3=~clk3;end join_none end initialbegin realfreq1,freq2,freq3; #100; get_clock_freq("tb.clk1",freq1); get_clock_freq("tb.clk2",freq2); get_clock_freq("tb.clk3",freq3); $display("freq1=%f,freq2=%f,freq3=%f",freq1,freq2,freq3); $finish(); end endmodule
仿真结果如下:
clock_probe_pkg:getclockhier:tb,2 clock_probe_pkg:getclockscopetimeunit:-12 clock_probe_pkg:@110.000000tb.clk1=0,0 clock_probe_pkg:@121.000000tb.clk1=1,1 clock_probe_pkg:@132.000000tb.clk1=0,2 probeclockfreqdone,freq=45454.545455@0 clock_probe_pkg:getclockhier:tb,2 clock_probe_pkg:getclockscopetimeunit:-12 clock_probe_pkg:@153.000000tb.clk2=1,0 clock_probe_pkg:@170.000000tb.clk2=0,1 clock_probe_pkg:@187.000000tb.clk2=1,2 probeclockfreqdone,freq=29411.764706@0 clock_probe_pkg:getclockhier:tb,2 clock_probe_pkg:getclockscopetimeunit:-12 clock_probe_pkg:@209.000000tb.clk3=1,0 clock_probe_pkg:@228.000000tb.clk3=0,1 clock_probe_pkg:@247.000000tb.clk3=1,2 probeclockfreqdone,freq=26315.789474@0 freq1=45454.545455,freq2=29411.764706,freq3=26315.789474 $finishcalledfromfile"testbench.sv",line26. $finishatsimulationtime266
clock_probe_pkg可以自动识别时钟信号所在scope的timescale,而且仅有一个接口,方便使用。get_clock_freq:
taskget_clock_freq(stringpath,outputrealx_freq); ... endtask
第一个参数为字符串类型的时钟信号的后门路径,第二个参数即为返回的时钟频率,单位为MHz。
clock_probe_pkg也是目前作者能找到的"完美"解决方案。虽然这个需求非常小众,可能也不一定能完全满足需求,可能后续还会更好的解决方案,但这个尝试的过程,作者觉得仍然是有意义的尝试,因为:
真理存在于寻求过程之中。
审核编辑:汤梓红
-
soc
+关注
关注
38文章
4113浏览量
217838 -
信号
+关注
关注
11文章
2774浏览量
76559 -
时钟频率
+关注
关注
0文章
49浏览量
20311 -
代码
+关注
关注
30文章
4733浏览量
68277 -
高电平
+关注
关注
6文章
144浏览量
21313
原文标题:耗时一年,终于测准了时钟频率
文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论