Модуль Checker
Модуль 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 почему-то не удается посмотреть результат выполнения утверждений на диаграмме.
В остальном вариант 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