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

В файле 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