【问题标题】:How can I set 200MHz system clock?如何设置 200MHz 系统时钟?
【发布时间】:2020-05-29 19:25:12
【问题描述】:

我正在尝试这样设置系统时钟:

`timescale 5 ns/1 ns

然后:

initial begin 
    forever #0.5 clk = ~clk;
end

但是,我收到了错误 Unexpected char '5'?为什么? “5”有什么问题?例如 10 个有效。

另一种有效但不优雅的方式:

 `timescale 1 ns/1 ns

initial begin 
    forever #2.5 clk = ~clk;
end

有人有更好的解决方案吗?

【问题讨论】:

  • 你认为“不优雅”的方式是你应该(并且每个人都这样做)的方式。除了@toolic 说的,你实际上会得到一个 166MHz 的时钟。

标签: verilog system-verilog


【解决方案1】:

`timescale 指令中的5 ns 的问题在于,根据 IEEE 标准,它是非法语法。只允许 1、10 和 100。

但是,您的其他代码示例也存在问题:

`timescale 1 ns/1 ns
forever #2.5 clk = ~clk;

这不会产生 200MHz 时钟。它产生一个 166MHz 的时钟。您指定了 1ns 的时间精度,这意味着分数延迟将被四舍五入。在这种情况下。 2.5 向上取整为 3,这意味着您最终得到的周期为 6ns,而不是 5ns。您可以通过将以下代码添加到您的测试平台来看到这一点:

initial $monitor($realtime, "\tclk=%b", clk);

然后你会看到clk的周期是6ns:

0   clk=0
3   clk=1
6   clk=0
9   clk=1
12  clk=0
15  clk=1

实现 200MHz 时钟的一种方法是使用 100ps 的精度:

`timescale 1 ns / 100 ps
forever #2.5 clk = ~clk;

【讨论】:

    【解决方案2】:

    来自 IEEE 1800-2017,第 22.7 节:

    time_unit 参数指定时间的测量单位和 延误。 time_precision 参数指定延迟值如何 在用于模拟之前四舍五入。 time_precision 参数 应至少与 time_unit 参数一样精确;这不可以 指定比 time_unit 更长的时间单位。 这些参数中的整数指定了一个数量级 价值的大小;有效整数为 1、10 和 100。

    我认为您误解了 timescale 指令的用途。它用于指定模拟的时间单位时间精度,而不是用于指定时钟周期。


    顺便说一句:您可以从 IEEE 免费下载 IEEE 1800-2017。 (Accelera 付费。)我建议你这样做。可读性很强。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2014-05-07
      • 2014-10-09
      相关资源
      最近更新 更多