Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

VMM 1.1:vmm_ms_scenarioクラスの例題(その3)

Verification Engineerの戯言

my_atm_cell_scenarioクラスmy_cpu_scenarioクラスは、次のようになっています。
 class my_atm_cell_scenario extends atm_cell_scenario;
    local bit [7:0] id;

    function new(bit [7:0] id);
        super.new();
        this.id = id;
        this.define_scenario("MY CELL SCENARIO", 1);
    endfunction

    function void post_randomize();
        foreach (this.items[i])
            items[i].gfc = this.id;
    endfunction
endclass: my_atm_cell_scenario

class my_cpu_scenario extends cpu_scenario;
    function new();
        super.new();
        this.define_scenario("MY CPU SCENARIO", 1);
    endfunction

    constraint op_direct {
      foreach(items[i]) {
        items[i].addr_mode == cpu::OP_IMMEDIATE |
        items[i].addr_mode == cpu::OP_DIRECT;
      }
    }
endclass: my_cpu_scenario

my_atm_cell_scenarioクラスは、atm_cell_scenarioクラスを継承します。
atm_cell_scenarioクラスは、atm_cellクラスから`vmm_scenario_gen( atm_cell, "ATM Cell" )
生成します。
class atm_cell extends vmm_data;

  rand bit [ 3:0] gfc;
  rand bit [ 7:0] vpi;
  rand bit [15:0] vci;
  rand bit [ 2:0] pt; 
  rand bit        clp;
  rand bit [ 7:0] hec;
  rand bit [ 7:0] payload[48];
  
  constraint hec_valid {
    hec == 8'h00;   // mask field for HEC, 1s indicate bad position
  }

  constraint test; 

  `vmm_data_member_begin(atm_cell)
     `vmm_data_member_scalar(gfc, DO_ALL)
     `vmm_data_member_scalar(vpi, DO_ALL)
     `vmm_data_member_scalar(vci, DO_ALL)
     `vmm_data_member_scalar(pt,  DO_ALL)
     `vmm_data_member_scalar(clp, DO_ALL)
     `vmm_data_member_scalar(hec, DO_ALL)
     `vmm_data_member_scalar_array(payload, DO_ALL)
  `vmm_data_member_end(atm_cell)

endclass // atm_cell

`vmm_channel(atm_cell)
`vmm_scenario_gen(atm_cell, "ATM Cell")

また、my_cpu_scenarioクラスは、cpu_scenarioクラスを継承します。
cpu_scenarioクラスは、、cpuクラスから`vmm_scenario_gen( cpu, "CPU INSN" )
生成します。
class cpu extends vmm_data;
   typedef enum {OP_DIRECT, OP_IMMEDIATE,
                 JMP_RELATIVE, JMP_ABSOLUTE, JMP_INDIRECT,
                 IMPLICIT, OTHER} addr_mode_t;
   rand addr_mode_t addr_mode;

   `vmm_data_member_begin(cpu)
      `vmm_data_member_enum(addr_mode, vmm_data::DO_ALL);
   `vmm_data_member_end(cpu)
endclass
`vmm_channel(cpu)
`vmm_scenario_gen(cpu, "CPU INSN")

my_atm_cell_scenarioクラスでアクセスしているitems[i]は、atm_cellクラスインスタンスで、
my_cpu_scenarioクラスでアクセスしているitems[i]は、cpuクラスインスタンスです。

検証、Verification、SystemVerilog、VMM、Verification Methodology Manual