7. Класс Transaction
В классе 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

Комментарии (0)