sv的dvfs的时钟实现

在cpu的验证中,需要进行dvfs的验证,也就是在仿真过程中,时钟周期不再是固定的周期,而且时钟也不是一直有效。

在这种情况下,对于时钟的生成,就不能用简单的时钟生成代码来实现:

reg clk;
initial begin
  clk = 0;
  forever  #HALF_PERIOD clk = ~clk;
end 

此时要用稍微复杂的时钟代码生成:

module test(); 
reg clk;          //dvfs output clk
int  half_period;  //clk half period
int  dvfs_period;   //dvfs_disable half period
reg  dvfs_disable;
initial begin
   dvfs_disable = 1;
   clk = 0;
   while(1) begin
    fork 
     // generate clk
     begin
        half_period = $urandom_range(5,30);
        while(1) begin
           #half_period   clk = 1;
           #half_period   clk = 0;
           if ( !dvfs_disable ) 
               break;
        end
      end
      // generate dvfs_disable
      begin
         dvfs_period = $urandom_range(300,600);
         #dvfs_period  dvfs_disable=0;
         #dvfs_period  dvfs_disable=1;
      end
    join
   end
  end
endmodule 

在一个while1无限循环中,有一个fork join代码块,里面包含两部分并行执行代码,一部分是生成时钟,另外一个生成dvfs_disable。

时钟在产生之前,首先使用随机函数,得到随机的半周期值。时钟在产生完一个周期后,要判断此时是否dvfs_disable为0,为0,表示时钟要关掉,此时就退出时钟产生代码块。于是时钟就停留在低电平。

而dvfs_disable,根据随机的周期值,而进行翻转。为0,表示时钟关闭,为1,表示时钟不关闭。

仿真的波形如下所示:

当dfvs_disable为高,表示时钟有输出,此时clk正常输出。当dvfs_disable为低,表示时钟关闭,此时clk输出为0。

第一次输出的时钟半周期为16,第二次输出的时钟半周期为30。符合dvfs的要求。

更多相关阅读

IES low-power中的set_sim_control命令
UVM使用双顶层的用法
cadence indago征程(六) eswd工具配置与仿真

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

发表评论

邮箱地址不会被公开。 必填项已用*标注

相关