`timescale 1ns/1ps // Design Code module ADDER(  input clk,  input [7:0] a,  input [7:0] b,  input bIsPos,  output reg [8:0] result );  always @ (posedge clk) begin  if (bIsPos) begin   result <= a + b;  end else begin  result <= a - b;  end  end endmodule: ADDER interface adder_if(  input bit clk,  input [7:0] a,  input [7:0] b,  input bIsPos,  input [8:0] result );  clocking cb @(posedge clk);  output a;  output b;  output bIsPos;  input result;  endclocking : cb endinterface: adder_if bind ADDER adder_if my_adder_if(  .clk(clk),  .a(a),  .b(b),  .bIsPos(bIsPos),  .result(result) ); // Testbench Code import uvm_pkg::*; `include "uvm_macros.svh" class testbench_env extends uvm_env;  virtual adder_if m_if;  function new(string name, uvm_component parent = null);  super.new(name, parent);  endfunction    function void connect_phase(uvm_phase phase);  assert(uvm_resource_db#(virtual adder_if)::read_by_name(get_full_name(), "adder_if", m_if));  endfunction: connect_phase  task run_phase(uvm_phase phase);  phase.raise_objection(this);  `uvm_info(get_name(), "Starting test!", UVM_HIGH);  begin  int a = 8'h4, b = 8'h5;  @(m_if.cb);  m_if.cb.a <= a;  m_if.cb.b <= b;  m_if.cb.bIsPos <= 1'b1;  repeat(2) @(m_if.cb);  `uvm_info(get_name(), $sformatf("%0d + %0d = %0d", a, b, m_if.cb.result), UVM_LOW);  end  `uvm_info(get_name(), "Ending test!", UVM_HIGH);  phase.drop_objection(this);  endtask: run_phase endclass module top;  bit clk;  env environment;  ADDER dut(.clk (clk));  initial begin  environment = new("testbench_env");  uvm_resource_db#(virtual adder_if)::set("env", "adder_if", dut.my_adder_if);  clk = 0;  run_test();  end  // Clock generation   initial begin  forever begin  #(1) clk = ~clk;  end  end   endmodule