今回は、user_pkgパッケージ部のデータ定義の部分をみていきます。
基本となるデータ(bus_trans)をuvm_sequence_itemクラスを継承して定義しています。
基本となるデータ(bus_trans)をuvm_sequence_itemクラスを継承して定義しています。
bus_transクラスからbus_reqクラスとbus_rspクラスを作っています。
bus_reqクラスとbus_rspクラスには、new関数はありません。
その代わりに、clone関数を使います。
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