Класс Driver

Класс Driver

Класс Driver описан в файле Driver.sv. Основным методом этого класса является метод start(), который вызывается в методе Environment::start(). Этот метод запускает генерацию случайных тестовых воздействий. С помощью вызова встроенной в каждой класс виртуальной функции randomize() переменные класса Transaction, объявленные как rand или randc, заполняются случайными значениями:

  1. task start();
  2. Transaction trans = new trans_e;
  3.  
  4. repeat(`NUM_OF_TRANS) begin
  5. if ( trans.randomize) begin
  6. trans.display_inputs();
  7. drive(trans);
  8. cov.sample(trans);
  9. end else begin
  10. $display (" %0d Driver : **ERROR: randomization failed",$time);
  11. trans.errors++;
  12. end
  13. end
  14.  
  15. @(posedge input_intf.clock);
  16. trans.stop = 1;
  17. endtask : start

Если при генерации случайных значений произошла ошибка, то выводится соответствующее сообщение и к вектору ошибок прибавляется 1. Если все нормально, то сгенерированная транзакция выводится на экран:

  1. trans.display_inputs();

Далее вызывается метод drive:

  1. drive(trans);

, который выдает сгенерированную транзакцию в соответствии с протоколом передачи:

  1. @(posedge input_intf.clock);
  2. input_intf.cb.a <= trans.a;
  3. input_intf.cb.b <= trans.b;
  4. input_intf.cb.c <= trans.c;
  5. input_intf.cb.d <= trans.d;

В нашем случае протокол передачи очень прост и все сгенерированные значения выдаются в одном такте, но при желании, изменив метод drive(), можно реализовать более сложные протоколы передачи.
После того, как мы послали транзакцию, вызывается метод Coverage::sample(), который собирает информацию о посланных транзакциях.
Драйвер повторяет эту последовательность действий число раз, которое задано константой NUM_OF_TRANS. Для удобства эта константа объявлена в файле Globals.sv:

  1. `define NUM_OF_TRANS 100

После завершения генерации всех транзакций драйвер устанавливает сигнал остановки генерации тестовых воздействий:

  1. trans.stop = 1;

Код класса Driver:

  1. `ifndef _DRIVER_
  2. `define _DRIVER_
  3.  
  4. `include "Globals.sv"
  5.  
  6. class Driver;
  7.  
  8. virtual input_interface.input_prt input_intf;
  9. Transaction trans_e;
  10. Coverage cov = new();
  11.  
  12. // Constructor
  13. function new(virtual input_interface.input_prt input_intf_new);
  14. this.input_intf = input_intf_new;
  15. trans_e = new();
  16. endfunction : new
  17.  
  18. task drive(Transaction trans);
  19.  
  20. @(posedge input_intf.clock);
  21. input_intf.cb.a <= trans.a;
  22. input_intf.cb.b <= trans.b;
  23. input_intf.cb.c <= trans.c;
  24. input_intf.cb.d <= trans.d;
  25.  
  26. endtask : drive
  27.  
  28. // Start method
  29. task start();
  30. Transaction trans = new trans_e;
  31.  
  32. repeat(`NUM_OF_TRANS) begin
  33. if (trans.randomize) begin
  34. trans.display_inputs();
  35. drive(trans);
  36. cov.sample(trans);
  37. end else begin
  38. $display (" %0d Driver : **ERROR: randomization failed",$time);
  39. trans.errors++;
  40. end
  41. end
  42.  
  43. @(posedge input_intf.clock);
  44. trans.stop = 1;
  45. endtask : start
  46.  
  47. endclass
  48.  
  49. `endif

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

Share this post