微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 System Verilog 中测量时钟频率的任务通过参考传递时钟信号

如何解决在 System Verilog 中测量时钟频率的任务通过参考传递时钟信号

我是 SV 验证的新手,作为面向对象测试平台的第一次尝试,我正在尝试验证一个简单的时钟发生器设计。 给定一定的配置和时钟输入,我想不断监视宏的多个时钟输出。为此,我需要能够测量多个时钟信号的频率。

理想情况下,我为我的 checker 类想到了这样的事情:

  • 获取触发器并检索配置详细信息
  • 为我需要测量的每个输出时钟启动一个 freq_meter 任务

每个 freq_meter 任务将执行以下操作:

  • 从虚拟接口接收时钟信号
  • 开始时间测量
  • 计数 N 个时钟姿势
  • 返回评估的频率
class checker_monitor;
  virtual clkgen_if clkgen_vif;

  task run();
    // launch freq measure
    fork
      freq_meter(clkgen_vif.clk_out_1);
      freq_meter(clkgen_vif.clk_out_2);
      freq_meter(clkgen_vif.clk_out_3);
    join
    // check that returned frequencies are correct
  endtask

  task freq_meter(input logic clk,output logic freq);
    time_start = $time;
    repeat(N+1) @ (posedge clk);
    time_end = $time;

    period = (time_end - time_start)/N;
    freq = 1/period;
  endtask : freq_meter

对这样的问题有什么建议吗?我现在被困在通过引用来自虚拟接口的任务传递时钟信号。

最好,

教唆

解决方法

将任务的输入参数更改为参考参数,如下面的代码片段所示。

task freq_meter(ref logic clk,output int freq);

注意:正如评论中指出的那样,这仅在 clkgen_vif.clk_out_N 是变量而不是网络时才有效。我的假设是它们在 logic 接口中被定义为 clkgen_if


编辑:我在 EDAPlayground(link) 上创建了一个工作示例。我还将输出参数更改为 int 而不是 logic,因为频率测量只会返回 0 或 1。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。