verilog $time 基于时钟周期

verilog $time based clock period

我正在生成 PLL 仿真模型。我可以使用 $time 找到输入参考时钟周期,并将周期与 pll 分频器相除以生成 pll 输出时钟。如下所示,但模拟器在波形上没有显示任何内容,虽然没有语法错误。这种方法有什么问题?

 time prev_t, periodd;
 reg clk = 0;

  always @(posedge CLK_PLL_IN) begin
    periodd = $time - prev_t;
    prev_t  = $time;
  end 

  always #(periodd/pll_div) clk = ~clk;


periodd 的初始值为 0,因此如果第二个 always 块在第一个之前开始,您将进入零延迟循环。我还建议使用 realtime$realtime 而不是 time$time,以防 periodd/pll_div 的派系部分小于时间尺度。

realtime prev_t, periodd=0;
reg clk = 0;

  always @(posedge CLK_PLL_IN) begin
    periodd = $time - prev_t;
    prev_t  = $time;
  end 

  initial wait(periodd >0)
      forever #(periodd/pll_div) clk = ~clk;