系统verilog-邮箱

时间:2015-11-09 06:27:29

标签: system-verilog

下面我发布了邮箱的完整代码。它有一个类Generator,类Driver,还有一个顶级代码。我的问题是在下面的代码中,在类生成器中,如何使用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

1 个答案:

答案 0 :(得分:1)

邮箱是一种媒介,用于在两个街区之间进行通信。

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

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

有关详细信息,请参阅SV LRM中的 15.4邮箱部分。 :)

相关问题