5. Описание интерфейсов, программного блока 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

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