我是 SV 验证新手,作为面向对象测试平台的第一次尝试,我正在尝试验证一个简单的时钟生成器设计。 在给定一定的配置和时钟输入的情况下,我想不断监视宏的多个时钟输出。为此,我需要能够测量多个时钟信号的频率。
理想情况下,我为我的
checker
课程想到了这样的事情:
freq_meter
任务每个
freq_meter
任务将执行以下操作:
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。
更改任务freq_meter(参考逻辑clk,输出真实频率); 输出应该是真实的,因为它是频率,它应该可以解决您的问题