背景
SOC系统顶层验证的时候,会关注各个时钟信号的频率。
如果一一查看波形,然后用计算器计算频率。缺点很多,不是好的做法。
搞一个模板,以后可以用。
算法
假设待测时钟信号为clk_dut
;期望计算出clk_dut
的频率为freq_dut
。怎么搞?
解:
利用已知时钟clk_1G
为1000MHz,计算仿真时间内该频率下的计数器值;根据待测时钟clk_dut
下的计数器值与clk_1G
下的计数器值的比值,就可以得出freq_dut
答案。
公式:
仿真时间(复位释放之后的仿真时间)=`freq_dut`*`counter_dut`=`freq_clk_1G`*`counter_1G`
注意:
- 要在
clk_dut
和clk_1G
对应的复位信号全部释放之后,才开始计数。 - 如果是PLL的话,还要注意PLL处于锁定lock状态后,才开始计数。
源代码
`timescale 1ns/10ps
//
reg clk_dut;
reg [63:0] counter_dut;
initial begin
clk_dut=1'b0;
end
always #5 clk_dut = ~clk_dut;
always @(posedge clk_dut or negedge rstn) begin
if(~rstn) counter_dut=64'h0;
else counter_dut = counter_dut + 1'b1;
end
reg clk_1G;
reg [63:0] counter_1G; //bit-width is 64;prevent counter_1G overflow
initial begin
clk_1G=1'b0;
end
always #1 clk_1G = ~clk_1G;
always @(posedge clk_1G or negedge rstn) begin
if(~rstn) counter_1G=64'h0;
else counter_1G = counter_1G + 1'b1;
end
//
assign freq_dut = 1000/(counter_1G/counter_dut);//unit is MHz