时钟反转循环

问题描述 投票:0回答:2

我看到这段代码是在测试台中编写的。但是,我不明白为什么我们需要这样做。时钟周期为2.034ns。这段代码不是我写的。写这篇文章的人不在。

`timescale 1ps/1ps
 module tb();
  initial begin
    #0
    forever begin
      for (int x=0; x<95; x++) begin
        #(1017) clk_491p52 = ~clk_491p52;
        #(1017) clk_491p52 = ~clk_491p52;
        #(1017) clk_491p52 = ~clk_491p52;
        #(1018) clk_491p52 = ~clk_491p52;
      end
      #(1017) clk_491p52 = ~clk_491p52;
      #(1018) clk_491p52 = ~clk_491p52;
      #(1017) clk_491p52 = ~clk_491p52;
      #(1018) clk_491p52 = ~clk_491p52;
    end
  end
endmodule

为什么我们要用这种特定的模式来反转时钟?难道我们就不能这样吗?

initial clk_491p52=0;
always #(2034/2) clk_491p52=~clk_491p52;
verilog system-verilog clock
2个回答
0
投票

您展示的 2 个代码示例之间存在差异。

带有

always
块的示例产生 50% 的占空比。

带有

forever
的示例不会 产生 50% 的占空比。

always
块中,每个半周期为1017ps

forever
块中,一些半周期为1017ps,而其他半周期为1018ps:1017与1018

这一切都假设

clk_491p52
被声明为单个位信号。


always
块是生成简单测试平台时钟的传统方法。然而,使用
forever
块的人一定已经看到需要创建更复杂的时钟波形。


0
投票

看起来编写代码的人超出了对精确频率进行建模的范围。时钟名称是

clk_491p52
,这意味着 491.52 MHz 时钟。这相当于 2.03450520833ns 的周期

当您从 Verilog 代码计算平均周期时,它也是 2.03450520833ns:

( (1.017ns+1.017ns+1.017ns+1.018ns)*95 + (1.017ns+1.018ns+1.017ns+1.018ns) )/96/2

时间刻度设置为 1ps,这不足以完美地模拟时钟频率。 Verilog 支持的最小时间尺度是 1fs,它仍然太大,无法完美地模拟时钟频率。此人实施的解决方法是将四舍五入到 1ps,并定期添加额外的 1ps 以补偿舍入。这与用于确定闰年的舍入概念相同(1 年 = ~365.2425 天)。

是否需要这种精度取决于设计要求。时钟规格可能是 491.52 MHz,但 ~491.642 MHz 会有所不同吗?这取决于要求。

© www.soinside.com 2019 - 2024. All rights reserved.