Класс Receiver

Класс Receiver

Объявленный в файле Receiver.sv класс Receiver также, как и драйвер, содержит метод start():

  1. task start();
  2. Transaction trans = new();
  3.  
  4. while (!trans.stop) begin
  5. receive(trans);
  6. rcvr2sb.put(trans);
  7. end
  8.  
  9. endtask : start

Пока не пришел сигнал stop, который выставляет Driver, повторяется следующая последовательность действий:
1) Принимается транзакция:

  1. receive(trans);

2) Принятая транзакция кладется в почтовый ящик:

  1. rcvr2sb.put(trans);

Аналогично методу Driver::drive() в методе receive() прием транзакции можно конфигурировать в зависимости от принципа работы тестируемой схемы.
 SystemVerilog-описание  класса Receiver:

  1. `ifndef _RECEIVER_
  2. `define _RECEIVER_
  3.  
  4. class Receiver;
  5.  
  6. virtual output_interface.output_prt output_intf;
  7. mailbox #(Transaction) rcvr2sb;
  8.  
  9. // Constructor
  10. function new(
  11. virtual output_interface.output_prt output_intf_new,
  12. mailbox #(Transaction) rcvr2sb
  13. );
  14. this.output_intf = output_intf_new ;
  15. if(rcvr2sb == null) begin
  16. $display(" **ERROR: rcvr2sb is null");
  17. $finish;
  18. end else
  19. this.rcvr2sb = rcvr2sb;
  20.  
  21. endfunction : new
  22.  
  23. task receive(Transaction trans);
  24.  
  25. @(posedge output_intf.clock);
  26. trans.result = output_intf.cb.result;
  27.  
  28. endtask
  29.  
  30. // Start method
  31. task start();
  32. Transaction trans = new();
  33.  
  34. while (!trans.stop) begin
  35. receive(trans);
  36. rcvr2sb.put(trans);
  37. end
  38.  
  39. endtask : start
  40.  
  41. endclass
  42.  
  43. `endif

Из описанных в классе Receiver методов при конфигурировании изменяется только метод receive().

Share this post