12. Модуль 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 почему-то не удается посмотреть результат выполнения утверждений на диаграмме. Те, кто смогут решить эту проблему, прошу писать на
This 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

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