※ testbench.sv
`timescale 1ns/1ns

`include "uvm_macros.svh"
`include "pipe_pkg.sv"

module tb_top;
  import uvm_pkg::*;
  import pipe_pkg::*;

  // Clock, Reset generation
  reg r_rstn;
  reg r_clk = 0;
  
  always #10 r_clk = ~r_clk;

  initial begin
    #10 r_rstn = 0;
    #30 r_rstn = 1;
  end

  
  // Instantiate DUT 
  pipe dut (
    .i_clk(r_clk),
    .i_rstn(r_rstn),
    .i_en(),
    .i_cf(),
    .i_data0(),
    .i_data1(),
    .o_data0(),
    .o_data1()
  );

  // Instantiate interface module
  `include "intf_insts.sv"
  
  initial begin
    // Set interface into uvm_config_db
    uvm_config_db#(virtual pipe_if)::set(null, "uvm_test_top.tb.pipe_env.pipe_agent*", "vif", pipe_intf);  
    uvm_config_db#(virtual pipe_if)::set(null, "uvm_test_top.tb.vseqr*", "vif", pipe_intf);
    
    run_test("pipe_basic_test_c");
  end

  // Dump waves
  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(0, tb_top);
  end

  //initial begin
  //  #1us $finish;
  //end  
  
endmodule

 

 

※ intf_insts.sv
pipe_if  pipe_intf();

assign pipe_intf.CLK = r_clk;
assign pipe_intf.RSTN = r_rstn;

assign dut.i_en = pipe_intf.I_ENABLE;
assign dut.i_cf = pipe_intf.I_CF;
assign dut.i_data0 = pipe_intf.I_DATA_IN0;
assign dut.i_data1 = pipe_intf.I_DATA_IN1;

assign pipe_intf.O_DATA_OUT0 = dut.o_data0;
assign pipe_intf.O_DATA_OUT1 = dut.o_data1;

reg r_o_en;
reg [1:0] r_o_cf;

always @(posedge r_clk) begin
  r_o_en <= pipe_intf.I_ENABLE;
  r_o_cf <= pipe_intf.I_CF;
end

assign pipe_intf.O_ENABLE = r_o_en;
assign pipe_intf.O_CF = r_o_cf;