系统verilog-邮箱

system verilog- Mail Box

下面我贴出了邮箱的完整代码。它有一个 class 生成器、class 驱动程序和一个顶级代码。我的问题是在下面的代码中,在 Class Generator 中,如何使用 Transation tr 和 mailbox mbx?另外,在函数new中如何使用mbx?

program mailbox_example(bus_if.TB bus...);
  class Generator;   // Class Generator
    Transaction tr;
    mailbox mbx;

    function new (mailbox mbx);
      this.mbx=mbx;
    endfunction

    task run;
      repeat (10) begin
        tr=new;
        assert(tr.randomize);
        mbx.put(tr); //send out transaction
      end
    endtask
  endclass

  class Driver;  //Class Driver
    Transaction tr;
    mailbox mbx;

    function new(mailbox mbx);
      this.mbx=mbx;
    endfunction

    task run;
      repeat(10) begin
        mbx.get(tr);
        @(posedge busif.cb.ack);
        bus.cb.kind<=tr.kind;
        ...
      end
    endtask
  endclass

  mailbox mbx;  //Top level
  Generator gen;
  Driver drv;
  initial begin
    mbx=new;
    gen=new(mbx);
    drv=new(mbx);
    fork
      gen.run();
      drv.run();
    join
  end
endprogram

邮箱是一种媒介,用于两个块之间的通信。

为什么邮箱在构造函数中..??
要在驱动器和发电机等两个模块之间进行通信,它们之间应该有一个公共邮箱(例如使用公共电缆将信息从 DTH 天线传输到机顶盒)。
为了在驱动程序和生成器之间共享一个公共邮箱,邮箱在顶级块(例如 Env)中实例化,并且它的句柄通过构造函数传递给驱动程序和生成器。

事务和邮箱如何使用?
邮箱具有存储和获取事务的默认方法,如 put()、try_put()、get()、try_get()、peek() 和 try_peek()。在生成器中,使用 put() 或 try_put() 方法将交易存储到邮箱中。在驱动程序中,使用 get()、try_get()、peek() 或 try_peek() 方法检索事务。

请参阅 SV LRM 中的第 15.4 邮箱 部分了解更多详细信息。 :)