Класс Transaction

Класс Transaction

В классе Transaction, описанном в файле Transaction.sv, объявляются данные, которые посылаются на тестируемые схемы и принимаются от них. Для реализации механизма генерации случайных тестовых воздействий все посылаемые на тестируемые схемы сигналы объявляются типами rand bit или randc bit. Принимаемые сигналы объявляются, как bit. Также в классе описаны методы для вывода данных и сравнения выходов тестируемых схем:

  • display_inputs() – выводит входные сигналы (вызывается драйвером);
  • display_outputs() – выводит выходные сигналы (вызывается блоком сравнения). В этом методе вызывается функция $swrite, которая записывает входные данные в строку. Благодаря этому функцию display_outputs() можно вызывать внутри системного вызова $display(), как это сделано в классе Scoreboard.
  • compare() – сравнивает транзакции, принятые от старой и новой схемы (вызывается блоком сравнения). Содержимое этой функции меняется в зависимости от количества сравниваемых сигналов. Для каждого проверяемого выходного сигнала необходимо вставить в функцию следующий фрагмент:
    1. if(trans.signal_name !== this.signal_name) begin
    2. $display(" ** ERROR **: trans : signal_name did not match");
    3. compare = 0;
    4. end
    ,где вместо signal_name указывается имя сигнала для проверки.

Помимо этого в классе Transaction объявлены вспомогательные переменные: вектор ошибок (errors) и сигнал остановки генерации тестовых воздействий (stop). К типам этих переменных добавлен идентификатор static, что делает эти переменные общими для всех экземпляров класса Transaction. Это некий аналог разделяемой памяти, который позволяет избежать использования глобальных переменных. В нашем случае, в каком бы классе не произошла ошибка, всякий раз увеличивается на 1 общий для всех классов вектор ошибок errors. Это облегчает анализ результатов симуляции. Еще одна статическая переменная stop выступает в роли синхронизирующего сигнала. Эта переменная устанавливается драйвером в ‘1’, когда тот сгенерировал и послал все транзакции, а классы приемника и блока сравнения мгновенно фиксируют это изменение и завершают свою работу.

  1. `ifndef _TRANSACTION_
  2. `define _TRANSACTION_
  3.  
  4. class Transaction;
  5.  
  6. static int errors = 0;
  7. static bit stop = 0;
  8.  
  9. rand bit [3:0] a;
  10. rand bit [3:0] b;
  11. rand bit [3:0] c;
  12. rand bit [3:0] d;
  13.  
  14. bit [3:0] result;
  15.  
  16. // Display transaction's inputs
  17. virtual function void display_inputs();
  18. $display(" Transaction inputs: a = %h, b = %h, c = %h, d = %h ", a, b, c, d);
  19. endfunction : display_inputs
  20.  
  21. // Display transaction's outputs
  22. virtual function string display_outputs();
  23. $swrite(display_outputs, "result = %h", result);
  24. endfunction : display_outputs
  25.  
  26. // Compare transactions
  27. virtual function bit compare(Transaction trans);
  28.  
  29. compare = 1;
  30.  
  31. if (trans == null) begin
  32. $display(" ** ERROR ** : trans : received a null object ");
  33. compare = 0;
  34. end else begin
  35. if(trans.result !== this.result) begin
  36. $display(" ** ERROR **: trans : result did not match");
  37. compare = 0;
  38. end
  39. end
  40.  
  41. endfunction : compare
  42.  
  43. endclass
  44.  
  45. `endif

Share this post