Модуль Checker, описанный в файле Checker.sv, используется только во втором варианте тестового окружения. Этот модуль выполняет функции класса Scoreboard – сравнивает транзакции, полученные от тестируемых схем, используя для этого параметризированное SystemVerilog утверждение:

property p_equal(old_sig, new_sig);
    @(posedge clock) disable iff (!active)
    old_sig == new_sig;
endproperty

Это свойство вызывается для каждой пары сравниваемых сигналов:

ap_result: assert property(p_equal(old_result, new_result));

Для того, чтобы свойство не выполнялось во время сброса и исполнения метода Environment::wait_for_end(), в модуль включен initial-блок, в котором вырабатывается сигнал разрешения выполнения свойства active:

bit active;

initial begin
    active <= 1'b0;
    @(posedge clock);
    active <= 1'b1;
    repeat (`NUM_OF_TRANS + 1) @(posedge clock);
    active <= 1'b0;
end

Теперь проверка свойства будет осуществляться только пока драйвер посылает транзакции. Как видите, здесь используется та же константа NUM_OF_TRANS, что и в классе Driver. Поэтому в модуль включается файл Globals.sv, в котором объявлена эта константа.
Объявляется модуль Checker в модуле верхнего уровня иерархии tb_top. Выходные сигналы тестируемых модулей могут передаваться по отдельности:

module tb_top();

...
...
...

Checker sva_checker (
    .clock(clock),
    .old_result (output_intf[0].result),
    .new_result (output_intf[1].result)
);

endmodule : tb_top


module Checker (
    input wire clock,
    input wire [3:0] old_result,
    input wire [3:0] new_result
);

...

ap_result: assert property(p_equal(old_result, new_result));

endmodule			

или в интерфейсе:

module tb_top();

...
...
...

Checker sva_checker (
    .clock(clock),
    .old_intf(output_intf[0]),
    .new_intf(output_intf[1])
);

endmodule : tb_top


module Checker (
    input wire clock,
    output_interface	old_intf,
    output_interface	new_intf
);

...

ap_result: assert property(p_equal(old_intf.result, new_intf.result));

endmodule		

Передача сигналов посредством интерфейса, конечно, более удобна, особенно при большом количестве проверяемых сигналов, НО при симуляции варианта с интерфейсами в VCS почему-то не удается посмотреть результат выполнения утверждений на диаграмме. Те, кто смогут решить эту проблему, прошу писать на aavetoshkin@systemverilog.ruThis e-mail address is being protected from spambots. You need JavaScript enabled to view it .
В остальном вариант 2 тестового окружения отличается только тем, что там убраны классы Receiver и Scoreboard и все, что с ними связано (объявления и вызовы методов в классе Environment, метод compare() в классе Transaction).
Код модуля Checker:

`ifndef _CHECKER_
`define _CHECKER_

`include "Globals.sv"

module Checker (
    input wire clock,
    //output_interface	old_intf,
    //output_interface	new_intf
    input wire [3:0] old_result,
    input wire [3:0] new_result
);

bit active;

initial begin
    active <= 1'b0;
    @(posedge clock);
    active <= 1'b1;
    repeat (`NUM_OF_TRANS + 1) @(posedge clock);
    active <= 1'b0;
end

//---------------------------------------------------
// Properties
//---------------------------------------------------
property p_equal(old_sig, new_sig);
    @(posedge clock) disable iff (!active)
    old_sig == new_sig;
endproperty

//ap_result: assert property(p_equal(old_intf.result, new_intf.result));
ap_result: assert property(p_equal(old_result, new_result));

endmodule

`endif