我正在尝试构建一个用于内存验证的分层测试平台。我在驱动程序和监视器端显示read_data(内存数据)。问题是监视器仅在循环开始时被触发。但是我想在read_write = 0时触发监视器。为什么显示器没有考虑所有情况? 在环境类中,我调用驱动程序,监视器和生成器的run方法。 链接:http://www.edaplayground.com/x/389q
答案 0 :(得分:1)
您的代码存在一些问题。首先,您可能希望在监视器类中使用forever
循环。现在在run()方法中写入的方式是等待2个时钟周期,然后等待read_write == 0
,然后结束。
另一个问题是您在分层引用中使用modport名称monitor
。 modport不是范围,它是在声明虚拟接口变量时使用的访问列表。
最后,当使用clocking
块时,你应该只使用clocking bock事件进行同步,而不是使用 raw 信号。
class monitor;
virtual intf.monitor vintf;
function new(virtual intf.monitor vintf);
this.vintf=vintf;
endfunction
task run();
forever
@(vintf.mo) // No ; here. You would get stuck in an infinite loop
begin
$display("--------MONITOR STARTS--------");
@(vintf.mo iff (vintf.mo.read_write==0))
begin
$display("--------MONITOR READDATA--------");
$display(vintf.mo.read_data);
$display(vintf.mo.address);
end
end
endtask
endclass