监控同步

时间:2017-09-29 02:28:49

标签: system-verilog

我正在尝试构建一个用于内存验证的分层测试平台。我在驱动程序和监视器端显示read_data(内存数据)。问题是监视器仅在循环开始时被触发。但是我想在read_write = 0时触发监视器。为什么显示器没有考虑所有情况? 在环境类中,我调用驱动程序,监视器和生成器的run方法。 链接:http://www.edaplayground.com/x/389q

1 个答案:

答案 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