Класс Transaction
В классе Transaction, описанном в файле Transaction.sv, объявляются данные, которые посылаются на тестируемые схемы и принимаются от них. Для реализации механизма генерации случайных тестовых воздействий все посылаемые на тестируемые схемы сигналы объявляются типами rand bit или randc bit. Принимаемые сигналы объявляются, как bit. Также в классе описаны методы для вывода данных и сравнения выходов тестируемых схем:
- display_inputs() – выводит входные сигналы (вызывается драйвером);
- display_outputs() – выводит выходные сигналы (вызывается блоком сравнения). В этом методе вызывается функция $swrite, которая записывает входные данные в строку. Благодаря этому функцию display_outputs() можно вызывать внутри системного вызова $display(), как это сделано в классе Scoreboard.
- compare() – сравнивает транзакции, принятые от старой и новой схемы (вызывается блоком сравнения). Содержимое этой функции меняется в зависимости от количества сравниваемых сигналов. Для каждого проверяемого выходного сигнала необходимо вставить в функцию следующий фрагмент:
,где вместо signal_name указывается имя сигнала для проверки.- if(trans.signal_name !== this.signal_name) begin
- $display(" ** ERROR **: trans : signal_name did not match");
- compare = 0;
- end
Помимо этого в классе 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