quick.gif

space2.gif

space2.gif

space2.gif

space2.gif

space2.gif

space2.gif

space2.gif

   

space.gif

   

space.gif

  ../images/main/bullet_green_ball.gif vmm_env

Till now we have seen bits and pieces of various components of a verification

enviroment. Now we need to put all the components together. For this purpose

vmm provides vmm_env base class. Which provides set of methods which have well

defined purpose. In any verification env, there are set of operations that

need to be done in certain sequence as listed below

   

space.gif

  • Randomize the test configuration : Randomize various testbench configuration, Example, how many ports of ethernet switch is enabled, How many BFM's needed to connected, What is depth of packet memory.
  • Create various components of testbench :In this stage, various testbench class's constructor is called, vmm_channel are connected. Basically memory allocation of various components of testbench is done.
  • Reset the DUT : In this stage DUT is reset.
  • configure the DUT : In this state various DUT configuration is performed.
  • start various components of testbench:In this state various components are started, like packet generator is started to generate packets, checkers, bfm and monitors are started.
  • wait for testbench to complete :Wait for the testbench to complete the generation, collection and checking.
  • stop all components of testbench :In this stage all the components are stoped. This is not a must have state
  • report final statics of testbench :In this stage scoreboard, error and warning counters are checked.
   

space.gif

Above steps are provided by vmm_env with following methods. Each method is be explicitly called or all of them can be called in automatic sequence by calling run() method of vmm_env

   

space.gif

  • gen_cfg() : Randomize tesbench configuration
  • build() : Create instances of various testbench components
  • reset_dut() : Reset the DUT
  • cfg_dut() : Do configuration of DUT
  • start() : Start all the testbench components
  • wait_for_end() : For all the testbench components to complete
  • stop() : Stop all the testbench components
  • report() : Report error, warning and final simulation pass/fail status
   

space.gif

   

space.gif

  ../images/main/bulllet_4dots_orange.gif vmm_env Methods
   

space.gif


  1 virtual protected task power_on_reset();
  2 virtual task hw_reset();
  3 virtual task power_up();
  4 task pre_test();
  5 virtual function void gen_cfg();
  6 virtual function void build();
  7 virtual task reset_dut();
  8 virtual task cfg_dut();
  9 virtual task start();
 10 virtual task wait_for_end();
 11 virtual task stop();
 12 virtual task cleanup();
 13 virtual task restart(bit reconfig = 0);
 14 virtual task restart_test();
 15 virtual task report();
 16 task run();
You could download file vmm_env_methods.sv here
   

space.gif

  ../images/main/bulllet_4dots_orange.gif Example : vmm_env
   

space.gif


   1 `include "vmm.sv"
   2 
   3 // Note : This is not exact representation of AHB data class
   4 // All data class needs to extend from vmm_data
   5 class ahb_data extends vmm_data;
   6   vmm_log log;
   7   // Declare all the fields
   8   rand bit [31:0] addr;
   9   rand bit [31:0] data [16];
  10   rand bit [3:0]  beats;
  11 
  12   // Make sure all variables have init value 
  13   function new(vmm_log log = null);
  14     int i;
  15     super.new(log);
  16     this.log  = log;
  17     this.addr       = 0;
  18     for (i = 0; i < 16; i ++) begin
  19       this.data[1] = 0;
  20     end
  21     this.beats     = 1;
  22   endfunction
  23   virtual function vmm_data copy(vmm_data to = null);
  24      ahb_data cpy;
  25      int i;
  26      if (to == null) begin
  27        cpy = new (log);
  28      end else begin
  29        if ( ! ($cast(cpy,to))) begin
  30          `vmm_fatal(log,"Object is not of type ahb_data");
  31        end
  32      end
  33     cpy.addr = this.addr;
  34     for (i = 0; i < 16; i ++) begin
  35       cpy.data[i] = this.data[1];
  36     end
  37     copy         = cpy;
  38   endfunction
  39 
  40 
  41   // Print message
  42   function void display(string prefix = "");
  43     if (is_valid()) begin
  44      `vmm_debug(log,$psprintf("%s",psdisplay(prefix)));
  45     end else begin
  46      `vmm_error(log,$psprintf("%s",psdisplay(prefix)));
  47     end
  48   endfunction
  49 
  50   // Return the string members and their values
  51   virtual function string psdisplay(string prefix = "");
  52     string msg;
  53     int i;
  54     msg = $psprintf("   %s\n", prefix);
  55     msg = $psprintf("%s ADDRESS       : 32'h%x\n",msg,addr);
  56     msg = $psprintf("%s BEATS         : %0d\n",msg,beats);
  57 
  58     for (i = 0; i < beats; i++) begin
  59       msg = $psprintf("%s DATA[%2d]      : 32'h%x\n",msg,i,data[i]);
  60     end
  61     psdisplay = msg;
  62   endfunction
  63 endclass
  64 
  65 // We need to add below line to construct vmm_channel for object ahb_data
  66 `vmm_channel(ahb_data)
  67 `vmm_atomic_gen(ahb_data,"ATOMIC GEN")
  68 
  69 // This class sinks transactions
  70 class sink extends vmm_xactor;
  71   ahb_data_channel fifo;
  72   vmm_log log;
  73   
  74   function new(vmm_log log, string name, ahb_data_channel fifo);
  75     super.new(name,name);
  76     this.log = log;
  77     this.fifo = fifo;
  78   endfunction
  79 
  80   virtual task main();
  81      ahb_data d;
  82      super.main();
  83      while (1) begin
  84        wait_if_stopped_or_empty(fifo);
  85        fifo.get(d);
  86        // Indicate we are processing the object
  87        d.notify.indicate(vmm_data::STARTED);
  88         #10 ;
  89        // Indicate we done with processing the object
  90        $display("Indicating done processing");
  91        d.notify.indicate(vmm_data::ENDED);
  92      end
  93   endtask
  94 endclass
  95 
  96 class my_env extends vmm_env;
  97   vmm_log             log ;
  98   ahb_data_channel    fifo;
  99   ahb_data_atomic_gen src ;
 100   sink                snk ;
 101 
 102   function new();
 103     super.new("my_env");
 104     log = new("my_env","env");
 105   endfunction
 106 
 107   virtual function void gen_cfg();
 108     super.gen_cfg();
 109     `vmm_warning(this.log,"gen_cfg not implemented for this example");
 110   endfunction
 111   
 112   virtual function void build();
 113     super.build();
 114     fifo = new ("CHANNEL","FIFO");
 115     src  = new("SOURCE",-1,fifo);
 116     snk  = new(log,"SINK",fifo);
 117   endfunction
 118   
 119   virtual task reset_dut();
 120     super.reset_dut();
 121     `vmm_warning(this.log,"reset_dut not implemented for this example");
 122   endtask
 123   
 124   virtual task cfg_dut();
 125     super.cfg_dut();
 126     `vmm_warning(this.log,"cfg_dut not implemented for this example");
 127   endtask
 128   
 129   virtual task start();
 130     super.start();
 131     src.stop_after_n_insts = 2;
 132     snk.start_xactor();
 133     src.start_xactor();
 134   endtask
 135   
 136   virtual task wait_for_end();
 137     super.wait_for_end();
 138     // Wait for source to end
 139     src.notify.wait_for(ahb_data_atomic_gen::DONE);
 140     `vmm_note(this.log,"Generator is done with generation");
 141   endtask
 142   
 143   virtual task stop();
 144     super.stop();
 145      #100 ;
 146     snk.stop_xactor();
 147     src.stop_xactor();
 148   endtask
 149   
 150   virtual task report();
 151     super.report();
 152     `vmm_note(this.log,"Generator is done with generation");
 153   endtask
 154 
 155 endclass
 156 
 157 program test();
 158 
 159   my_env env = new();
 160 
 161   initial begin
 162      env.run();
 163       #100 ;
 164   end
 165 
 166 endprogram
You could download file vmm_env_ex.sv here
   

space.gif

  ../images/main/bulllet_4dots_orange.gif Simulation Log : vmm_env
   

space.gif

 WARNING[FAILURE] on my_env(env) at                    0:
     gen_cfg not implemented for this example
 WARNING[FAILURE] on my_env(env) at                    0:
     reset_dut not implemented for this example
 WARNING[FAILURE] on my_env(env) at                    0:
     cfg_dut not implemented for this example
 Indicating done processing
 Normal[NOTE] on my_env(env) at                   10:
     Generator is done with generation
 Indicating done processing
 Simulation PASSED on /./ (/./) at                  110
  (3 warnings, 0 demoted errors & 0 demoted warnings)
 Normal[NOTE] on my_env(env) at                  110:
     Generator is done with generation
   

space.gif

   

space.gif

   

space.gif

   

space.gif

space2.gif

space2.gif

space2.gif

space2.gif

space2.gif

  

Copyright © 1998-2014

Deepak Kumar Tala - All rights reserved

Do you have any Comment? mail me at:deepak@asic-world.com