Модуль Checker

Модуль Checker

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

  1. property p_equal(old_sig, new_sig);
  2. @(posedge clock) disable iff (!active)
  3. old_sig == new_sig;
  4. endproperty

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

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

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

  1. bit active;
  2.  
  3. initial begin
  4. active <= 1'b0;
  5. @(posedge clock);
  6. active <= 1'b1;
  7. repeat (`NUM_OF_TRANS + 1) @(posedge clock);
  8. active <= 1'b0;
  9. end

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

  1. module tb_top();
  2.  
  3. ...
  4. ...
  5. ...
  6.  
  7. Checker sva_checker (
  8. .clock(clock),
  9. .old_result (output_intf[0].result),
  10. .new_result (output_intf[1].result)
  11. );
  12.  
  13. endmodule : tb_top
  14.  
  15.  
  16. module Checker (
  17. input wire clock,
  18. input wire [3:0] old_result,
  19. input wire [3:0] new_result
  20. );
  21.  
  22. ...
  23.  
  24. ap_result: assert property(p_equal(old_result, new_result));
  25.  
  26. endmodule

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

  1. module tb_top();
  2.  
  3. ...
  4. ...
  5. ...
  6.  
  7. Checker sva_checker (
  8. .clock(clock),
  9. .old_intf(output_intf[0]),
  10. .new_intf(output_intf[1])
  11. );
  12.  
  13. endmodule : tb_top
  14.  
  15.  
  16. module Checker (
  17. input wire clock,
  18. output_interface old_intf,
  19. output_interface new_intf
  20. );
  21.  
  22. ...
  23.  
  24. ap_result: assert property(p_equal(old_intf.result, new_intf.result));
  25.  
  26. endmodule

Передача сигналов посредством интерфейса, конечно, более удобна, особенно при большом количестве проверяемых сигналов, НО при симуляции варианта с интерфейсами в VCS почему-то не удается посмотреть результат выполнения утверждений на диаграмме. В остальном вариант 2 тестового окружения отличается только тем, что там убраны классы Receiver и Scoreboard и все, что с ними связано (объявления и вызовы методов в классе Environment, метод compare() в классе Transaction).
Код модуля Checker:

  1. `ifndef _CHECKER_
  2. `define _CHECKER_
  3.  
  4. `include "Globals.sv"
  5.  
  6. module Checker (
  7. input wire clock,
  8. //output_interface old_intf,
  9. //output_interface new_intf
  10. input wire [3:0] old_result,
  11. input wire [3:0] new_result
  12. );
  13.  
  14. bit active;
  15.  
  16. initial begin
  17. active <= 1'b0;
  18. @(posedge clock);
  19. active <= 1'b1;
  20. repeat (`NUM_OF_TRANS + 1) @(posedge clock);
  21. active <= 1'b0;
  22. end
  23.  
  24. //---------------------------------------------------
  25. // Properties
  26. //---------------------------------------------------
  27. property p_equal(old_sig, new_sig);
  28. @(posedge clock) disable iff (!active)
  29. old_sig == new_sig;
  30. endproperty
  31.  
  32. //ap_result: assert property(p_equal(old_intf.result, new_intf.result));
  33. ap_result: assert property(p_equal(old_result, new_result));
  34.  
  35. endmodule
  36.  
  37. `endif

Share this post