Vengineerの戯言

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

UVM 1.0 : examples/simple/sequence/basic_read_write_sequence (その2)


今回は、user_pkgパッケージ部のデータ定義の部分をみていきます。
基本となるデータ(bus_trans)をuvm_sequence_itemクラスを継承して定義しています。

bus_transクラスからbus_reqクラスbus_rspクラスを作っています。
bus_reqクラスbus_rspクラスには、new関数はありません。
その代わりに、clone関数を使います。
      typedef enum { BUS_READ, BUS_WRITE } bus_op_t;
      typedef enum { STATUS_OK, STATUS_NOT_OK } status_t;

      // シーケンスアイテムを継承してトランザクションのデータを定義
      class bus_trans extends uvm_sequence_item;
        bit [11:0] addr;  // アドレス
        bit [7:0] data;   // データ
        bus_op_t op;      // オペレーション(リード:BUS_READ,ライト:BUS_WRITE)

        function new();
          super.new();
        endfunction

        function uvm_object clone();      // 内容が同じモノを生成する
          bus_trans t; t = new();
          t.copy(this);
          return t;
        endfunction

        function void copy (bus_trans t); // 内容をコピーする
          super.copy(t);
          addr = t.addr;
          data = t.data;
          op   = t.op;
        endfunction

        function bit compare(bus_trans t);// 比較関数
          return ((op == t.op) && (addr == t.addr) && (data == t.data));
        endfunction

        function string convert2string(); // 表示関数
          string s;
          $sformat(s, "op %s: addr=%03x, data=%02x", op.name(), addr, data);
          return s;
        endfunction

      endclass

      // トランザクションの要求
      class bus_req extends bus_trans;

        // new関数はありません。その代わりに、clone関数を使います

        function uvm_object clone();      // 内容が同じモノを生成する
          bus_req t; t = new();
          t.copy(this);
          return t;
        endfunction
  
        function void copy (bus_req t);   // 内容をコピーする
          super.copy(t);
        endfunction

      endclass

      // トランザクションの応答
      class bus_rsp extends bus_trans;

        status_t status;  // ステータス(STATUS_OK, STATUS_NOT_OK)

        // new関数はありません。その代わりに、clone関数を使います

        function uvm_object clone();      // 内容が同じモノを生成する
          bus_rsp t; t = new();
          t.copy(this);
          return t;
        endfunction

        function void copy (bus_rsp t);   // 内容をコピーする
          super.copy(t);
          status = t.status;
        endfunction

        function void copy_req (bus_req t);
          super.copy(t);
        endfunction

        function string convert2string(); // 表示関数
          string s;
          $sformat(s, "op %s, status=%s", 
                   super.convert2string(), status.name());
          return s;
        endfunction

      endclass

検証、Verification、SystemVerilog、UVM、Unified Verification Methodology