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

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

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

`ifndef _TRANSACTION_
`define _TRANSACTION_

class Transaction;

static int errors = 0;
static bit stop = 0;

rand bit [3:0] a;
rand bit [3:0] b;
rand bit [3:0] c;
rand bit [3:0] d;

bit [3:0] result;

// Display transaction's inputs
virtual function void display_inputs();
    $display(" Transaction inputs: a = %h, b = %h, c = %h, d = %h ", a, b, c, d);
endfunction : display_inputs

// Display transaction's outputs
virtual function string display_outputs();
    $swrite(display_outputs, "result = %h", result);
endfunction : display_outputs

// Compare transactions
virtual function bit compare(Transaction trans);

compare = 1;

if (trans == null) begin
    $display(" ** ERROR ** : trans : received a null object ");
    compare = 0;
end else begin
    if(trans.result !== this.result) begin
        $display(" ** ERROR **: trans : result did not match");
        compare = 0;
    end
end

endfunction : compare

endclass

`endif