Описание интерфейсов, программного блока testcase и модуля tb_top
Описание интерфейсов
В файле Interface.sv объявлены входной и выходной интерфейсы:
- Оба интерфейса имеют тактовый сигнал в качестве входного.
- Все сигналы интерфейсов объявлены, как logic. Допускается объявление сигналов входного интерфейса типа bit, т.к. в большинстве случаев не требуется посылать на тестируемую схему тестовые сигналы в неопределенном состоянии.
- Оба интерфейса содержат тактирующий блок (clocking block), в котором указываются направления сигналов. Несмотря на то, что сигналы входного интерфейса являются входными для тестируемой схемы, они объявляются как output, т.к. относительно тестового окружения они являются выходными. Аналогично и для выходного интерфейса. Его сигналы для тестового окружения являются входными. Тактирующий блок является средством синхронизации, которое позволяет в некоторых случаях избежать состязания сигналов.
- Для указания направления сигналов используется конструкция modport.
- `ifndef _INTERFACE_
- `define _INTERFACE_
- //---------------------------------------------------
- // Input interface
- //---------------------------------------------------
- interface input_interface(input bit clock);
- logic [3:0] a, b, c, d;
- clocking cb @(posedge clock);
- output a;
- output b;
- output c;
- output d;
- endclocking
- modport input_prt(clocking cb, input clock);
- endinterface
- //---------------------------------------------------
- // Output interface
- //---------------------------------------------------
- interface output_interface(input bit clock);
- logic [3:0] result;
- clocking cb @(posedge clock);
- input result;
- endclocking
- modport output_prt(clocking cb, input clock);
- endinterface
- `endif
Описание программного блока testcase
Программный блок описан в файле testcase.sv. Он отделяет тестовое окружение от RTL-описания и является некой входной точкой для выполнения тестовой программы. В него в качестве аргументов передаются описанные выше интерфейсы. В initial-блоке создается экземпляр класса Environment и вызывается метод run(), который запускает симуляцию. Final-блок исполняется в самом конце симуляции. Описание программного блока регулярно и не требует изменений при конфигурировании тестового окружения.
- `ifndef _TESTCASE_
- `define _TESTCASE_
- `include "Environment.sv"
- program testcase(
- input_interface.input_prt input_intf,
- output_interface.output_prt output_intf[2]
- );
- Environment env;
- initial begin
- $display(" Start of program block testcase");
- env = new(input_intf, output_intf);
- env.run();
- end
- final
- $display(" End of program block testcase");
- endprogram
- `endif
Описание модуля tb_top
В модуле верхнего уровня иерархии tb_top описывается генерация тактового сигнала, объявляются интерфейсы, программный блок и тестируемые модули. Согласно схеме верификации необходимо 2 выходных интерфейса, поэтому объявляется массив из 2-х экземпляров интерфейса output_interface. Обратите внимание, что при объявлении выходных интерфейсов указывается их действительное количество (interface output_intf[2](clock);), а при обращении к сигналам индексация интерфейсов начинается с нуля (output_intf[0].result и output_intf[1].result).
- `ifndef _TB_TOP_
- `define _TB_TOP_
- `include "Interface.sv"
- module tb_top();
- //---------------------------------------------------
- // Объявление и генерация тактового сигнала
- //---------------------------------------------------
- bit clock;
- initial
- forever #10 clock = ~clock;
- //---------------------------------------------------
- // Объявление входного интерфейса
- //---------------------------------------------------
- input_interface input_intf(clock);
- //---------------------------------------------------
- // Объявление двух экземпляров выходного интерфейса
- //---------------------------------------------------
- output_interface output_intf[2](clock);
- //---------------------------------------------------
- // Объявление программного блока testcase
- //---------------------------------------------------
- testcase TC (input_intf, output_intf);
- //---------------------------------------------------
- // Объявление тестируемых схем
- //---------------------------------------------------
- old_scheme old_scheme_dut(
- .a(input_intf.a),
- .b(input_intf.b),
- .c(input_intf.c),
- .d(input_intf.d),
- .result(output_intf[0].result)
- );
- new_scheme new_scheme_dut(
- .a(input_intf.a),
- .b(input_intf.b),
- .c(input_intf.c),
- .d(input_intf.d),
- .result(output_intf[1].result)
- );
- endmodule : tb_top
- `endif