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

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

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

理想情况下,我为我的

checker
课程想到了这样的事情:

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

每个

freq_meter
任务将执行以下操作:

  • 从虚拟接口接收clk信号
  • 开始时间测量
  • 数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 system-verilog verification
2个回答
0
投票

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

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

注意:正如评论中所指出的,只有当

clkgen_vif.clk_out_N
是变量而不是网络时,这才有效。我的假设是它们在
logic
界面中被定义为
clkgen_if


编辑:我在 EDAPlayground(link)上创建了一个工作示例。我还将输出参数更改为

int
而不是
logic
,因为频率测量仅返回 0 或 1。


0
投票

更改任务freq_meter(参考逻辑clk,输出真实频率); 输出应该是真实的,因为它是频率,它应该可以解决您的问题

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