Объявленный в файле Receiver.sv класс Receiver также, как и драйвер, содержит метод start():
task start(); Transaction trans = new(); while (!trans.stop) begin receive(trans); rcvr2sb.put(trans); end endtask : start
Пока не пришел сигнал stop, который выставляет Driver, повторяется следующая последовательность действий:
1) Принимается транзакция:
receive(trans);
2) Принятая транзакция кладется в почтовый ящик:
rcvr2sb.put(trans);
Аналогично методу Driver::drive() в методе receive() прием транзакции можно конфигурировать в зависимости от принципа работы тестируемой схемы.
`ifndef _RECEIVER_ `define _RECEIVER_ class Receiver; virtual output_interface.output_prt output_intf; mailbox #(Transaction) rcvr2sb; // Constructor function new( virtual output_interface.output_prt output_intf_new, mailbox #(Transaction) rcvr2sb ); this.output_intf = output_intf_new ; if(rcvr2sb == null) begin $display(" **ERROR: rcvr2sb is null"); $finish; end else this.rcvr2sb = rcvr2sb; endfunction : new task receive(Transaction trans); @(posedge output_intf.clock); trans.result = output_intf.cb.result; endtask // Start method task start(); Transaction trans = new(); while (!trans.stop) begin receive(trans); rcvr2sb.put(trans); end endtask : start endclass `endif
Из описанных в классе Receiver методов при конфигурировании изменяется только метод receive().