Описание интерфейсов, программного блока testcase и модуля tb_top

Описание интерфейсов, программного блока testcase и модуля tb_top

Описание интерфейсов

В файле Interface.sv объявлены входной и выходной интерфейсы:

  • Оба интерфейса имеют тактовый сигнал в качестве входного.
  • Все сигналы интерфейсов объявлены, как logic. Допускается объявление сигналов входного интерфейса типа bit, т.к. в большинстве случаев не требуется посылать на тестируемую схему тестовые сигналы в неопределенном состоянии.
  • Оба интерфейса содержат тактирующий блок (clocking block), в котором указываются направления сигналов. Несмотря на то, что сигналы входного интерфейса являются входными для тестируемой схемы, они объявляются как output, т.к. относительно тестового окружения они являются выходными. Аналогично и для выходного интерфейса. Его сигналы для тестового окружения являются входными. Тактирующий блок является средством синхронизации, которое позволяет в некоторых случаях избежать состязания сигналов.
  • Для указания направления сигналов используется конструкция modport.
  1. `ifndef _INTERFACE_
  2. `define _INTERFACE_
  3.  
  4. //---------------------------------------------------
  5. // Input interface
  6. //---------------------------------------------------
  7. interface input_interface(input bit clock);
  8.  
  9. logic [3:0] a, b, c, d;
  10.  
  11. clocking cb @(posedge clock);
  12. output a;
  13. output b;
  14. output c;
  15. output d;
  16. endclocking
  17.  
  18. modport input_prt(clocking cb, input clock);
  19.  
  20. endinterface
  21.  
  22. //---------------------------------------------------
  23. // Output interface
  24. //---------------------------------------------------
  25.  
  26. interface output_interface(input bit clock);
  27.  
  28. logic [3:0] result;
  29.  
  30. clocking cb @(posedge clock);
  31. input result;
  32. endclocking
  33.  
  34. modport output_prt(clocking cb, input clock);
  35.  
  36. endinterface
  37.  
  38. `endif

Описание программного блока testcase

Программный блок описан в файле testcase.sv. Он отделяет тестовое окружение от RTL-описания и является некой входной точкой для выполнения тестовой программы. В него в качестве аргументов передаются описанные выше интерфейсы. В initial-блоке создается экземпляр класса Environment и вызывается метод run(), который запускает симуляцию. Final-блок исполняется в самом конце симуляции. Описание программного блока регулярно и не требует изменений при конфигурировании тестового окружения.

  1. `ifndef _TESTCASE_
  2. `define _TESTCASE_
  3.  
  4. `include "Environment.sv"
  5.  
  6. program testcase(
  7. input_interface.input_prt input_intf,
  8. output_interface.output_prt output_intf[2]
  9. );
  10.  
  11. Environment env;
  12.  
  13. initial begin
  14. $display(" Start of program block testcase");
  15. env = new(input_intf, output_intf);
  16. env.run();
  17. end
  18.  
  19. final
  20. $display(" End of program block testcase");
  21.  
  22. endprogram
  23.  
  24. `endif

Описание модуля tb_top

В модуле верхнего уровня иерархии tb_top описывается генерация тактового сигнала, объявляются интерфейсы, программный блок и тестируемые модули. Согласно схеме верификации необходимо 2 выходных интерфейса, поэтому объявляется массив из 2-х экземпляров интерфейса output_interface. Обратите внимание, что при объявлении выходных интерфейсов указывается их действительное количество (interface output_intf[2](clock);), а при обращении к сигналам индексация интерфейсов начинается с нуля (output_intf[0].result и output_intf[1].result).

  1. `ifndef _TB_TOP_
  2. `define _TB_TOP_
  3.  
  4. `include "Interface.sv"
  5.  
  6. module tb_top();
  7.  
  8. //---------------------------------------------------
  9. // Объявление и генерация тактового сигнала
  10. //---------------------------------------------------
  11. bit clock;
  12.  
  13. initial
  14. forever #10 clock = ~clock;
  15.  
  16. //---------------------------------------------------
  17. // Объявление входного интерфейса
  18. //---------------------------------------------------
  19.  
  20. input_interface input_intf(clock);
  21.  
  22. //---------------------------------------------------
  23. // Объявление двух экземпляров выходного интерфейса
  24. //---------------------------------------------------
  25.  
  26. output_interface output_intf[2](clock);
  27.  
  28. //---------------------------------------------------
  29. // Объявление программного блока testcase
  30. //---------------------------------------------------
  31.  
  32. testcase TC (input_intf, output_intf);
  33.  
  34. //---------------------------------------------------
  35. // Объявление тестируемых схем
  36. //---------------------------------------------------
  37.  
  38. old_scheme old_scheme_dut(
  39. .a(input_intf.a),
  40. .b(input_intf.b),
  41. .c(input_intf.c),
  42. .d(input_intf.d),
  43. .result(output_intf[0].result)
  44. );
  45.  
  46. new_scheme new_scheme_dut(
  47. .a(input_intf.a),
  48. .b(input_intf.b),
  49. .c(input_intf.c),
  50. .d(input_intf.d),
  51. .result(output_intf[1].result)
  52. );
  53.  
  54. endmodule : tb_top
  55.  
  56. `endif

Share this post