使用后門方式測量時鐘頻率的需求來源更多是SOC驗證的場景,由于SOC的規(guī)模較大,一次編譯時間成本較高,在N個小時級別。如果采用前門方式,比如編寫測量頻率的module或者interface,一旦有新的測量需求則就需要TB重新連接時鐘信號,重新編譯環(huán)境。
此前的一篇文章,提出了一個問題:如何后門準確地捕獲到信號地跳變沿?
如何捕獲后門路徑信號的跳變?
如果無法精確捕獲到信號地跳變沿,那么也就無法"精確地"測量出時鐘地頻率。容易想到的辦法,是可以使用如下的方法進行測量:
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可能并不一致。
那怎么解決測不準的問題?
第一次意識到這個問題,作者也曾一度陷入苦思冥想,始終找不到完美的解決辦法。曾經(jīng)也想過用#1step來進行step級別的delay,但也由于仿真器的差異、環(huán)境結構的差異,表現(xiàn)不夠穩(wěn)定。雖然已過去了近一年的時間,工作也換了新的公司,還好對此的思考沒有停止。
最近終于開發(fā)出了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
第一個參數(shù)為字符串類型的時鐘信號的后門路徑,第二個參數(shù)即為返回的時鐘頻率,單位為MHz。
clock_probe_pkg也是目前作者能找到的"完美"解決方案。雖然這個需求非常小眾,可能也不一定能完全滿足需求,可能后續(xù)還會更好的解決方案,但這個嘗試的過程,作者覺得仍然是有意義的嘗試,因為:
真理存在于尋求過程之中。
審核編輯:湯梓紅
-
soc
+關注
關注
38文章
4107瀏覽量
217790 -
信號
+關注
關注
11文章
2773瀏覽量
76547 -
時鐘頻率
+關注
關注
0文章
49瀏覽量
20310 -
代碼
+關注
關注
30文章
4728瀏覽量
68250 -
高電平
+關注
關注
6文章
144瀏覽量
21307
原文標題:耗時一年,終于測準了時鐘頻率
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論