Code Browser Pages:
| //////////////////////////////////////////////// ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// ////s www.testbench.in s//// ////s s//// ////s VMM Tutorial s//// ////s gopi@testbench.in s//// ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// //////////////////////////////////////////////// `ifndef GUARD_ENV `define GUARD_ENV class Environment extends vmm_env; virtual mem_interface.MEM mem_intf ; virtual input_interface.IP input_intf ; virtual output_interface.OP output_intf[4] ; function new(virtual mem_interface.MEM mem_intf_new , virtual input_interface.IP input_intf_new , virtual output_interface.OP output_intf_new[4] ); super.new("Environemnt"); this.mem_intf = mem_intf_new ; this.input_intf = input_intf_new ; this.output_intf = output_intf_new ; `vmm_note(this.log, "Created env object"); endfunction : new virtual function void gen_cfg(); super.gen_cfg(); `vmm_note(this.log,"Start of gen_cfg() method "); `vmm_note(this.log,"End of gen_cfg() method "); endfunction virtual function void build(); super.build(); `vmm_note(this.log,"Start of build() method "); `vmm_note(this.log,"End of build() method "); endfunction virtual task reset_dut(); super.reset_dut(); `vmm_note(this.log,"Start of reset_dut() method "); mem_intf.cb.mem_data <= 0; mem_intf.cb.mem_add <= 0; mem_intf.cb.mem_en <= 0; mem_intf.cb.mem_rd_wr <= 0; input_intf.cb.data_in <= 0; input_intf.cb.data_status <= 0; output_intf[0].cb.read <= 0; output_intf[1].cb.read <= 0; output_intf[2].cb.read <= 0; output_intf[3].cb.read <= 0; // Reset the DUT input_intf.reset <= 1; repeat (4) @ input_intf.clock; input_intf.reset <= 0; `vmm_note(this.log,"End of reset_dut() method "); endtask virtual task cfg_dut(); super.cfg_dut(); `vmm_note(this.log,"Start of cfg_dut() method "); mem_intf.cb.mem_en <= 1; @(posedge mem_intf.clock); mem_intf.cb.mem_rd_wr <= 1; @(posedge mem_intf.clock); mem_intf.cb.mem_add <= 8'h0; mem_intf.cb.mem_data <= `P0; `vmm_note(this.log ,$psprintf(" Port 0 Address %h ",`P0)); @(posedge mem_intf.clock); mem_intf.cb.mem_add <= 8'h1; mem_intf.cb.mem_data <= `P1; `vmm_note(this.log ,$psprintf(" Port 1 Address %h ",`P1)); @(posedge mem_intf.clock); mem_intf.cb.mem_add <= 8'h2; mem_intf.cb.mem_data <= `P2; `vmm_note(this.log ,$psprintf(" Port 2 Address %h ",`P2)); @(posedge mem_intf.clock); mem_intf.cb.mem_add <= 8'h3; mem_intf.cb.mem_data <= `P3; `vmm_note(this.log ,$psprintf(" Port 3 Address %h ",`P3)); @(posedge mem_intf.clock); mem_intf.cb.mem_en <=0; mem_intf.cb.mem_rd_wr <= 0; mem_intf.cb.mem_add <= 0; mem_intf.cb.mem_data <= 0; `vmm_note(this.log,"End of cfg_dut() method "); endtask virtual task start(); super.start(); `vmm_note(this.log,"Start of start() method "); `vmm_note(this.log,"End of start() method "); endtask virtual task wait_for_end(); super.wait_for_end(); `vmm_note(this.log,"Start of wait_for_end() method "); repeat(10000) @(input_intf.clock); `vmm_note(this.log,"End of wait_for_end() method "); endtask virtual task stop(); super.stop(); `vmm_note(this.log,"Start of stop() method "); `vmm_note(this.log,"End of stop() method "); endtask virtual task cleanup(); super.cleanup(); `vmm_note(this.log,"Start of cleanup() method "); `vmm_note(this.log,"End of cleanup() method "); endtask virtual task report(); `vmm_note(this.log,"Start of report() method \n\n\n"); $display("---------------------------------------------------------------------"); super.report(); $display("---------------------------------------------------------------------"); $display("\n\n"); `vmm_note(this.log,"End of report() method"); endtask endclass `endif |