Класс Receiver
Объявленный в файле 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().