下面我发布了邮箱的完整代码。它有一个类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
答案 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邮箱部分。 :)