[SystemC][UVM] UVM-SystemCを試す(sequence_item)

前記事に書いた [SystmeC][UVM] UVM-SystemC Publiv Review で遊んでみました。

UVM(SystemVerilog)を普及させようとしてた際に、

まず、uvm_macros.svhをインクルードして、
uvm_sequence_itemを作ってテストベンチの
データとしてしまえば、UVMやったことになります。
なので、1回やってみてください。

でまかせ 言っていたので、今回も同じようにデータ型を作って動かしてみました。

ソースコード

  • sequence_item.h
  • #pragma once
    
    #include <iomanip>
    #include <sstream>
    
    #include "systemc.h"
    #include "uvm.h"
    
    enum cmd_op_t { READ, WRITE } ;
    
    class sequence_item : public uvm::uvm_sequence_item
    {
     public:
    
      sequence_item( const std::string& name = "sequence_item" ) : uvm::uvm_sequence_item(name)
      {
      ¦ addr = 0;
      ¦ data = 0;
      ¦ op = READ;
      }
    
      ~sequence_item() {}
    
      UVM_OBJECT_UTILS(sequence_item);
    
      virtual void do_copy( const uvm::uvm_object& rhs )
      {
      ¦ const sequence_item* rhs_ = dynamic_cast<const sequence_item*>(&rhs);
      ¦ if(rhs_ == NULL)
      ¦ ¦ UVM_ERROR("do_copy""cast failed, check type compatibility");
    
      ¦ uvm_sequence_item::do_copy(rhs);
    
      ¦ addr = rhs_->addr;
      ¦ data = rhs_->data;
      ¦ op = rhs_->op;
      }
    
      virtual bool do_compare( const uvm::uvm_object& rhs, const uvm::uvm_comparer* comparer )
      {
      ¦ const sequence_item* rhs_ = dynamic_cast<const sequence_item*>(&rhs);
      ¦ if(rhs_ == NULL)
      ¦ ¦ UVM_FATAL("do_compare""cast failed, check type compatibility");
    
      ¦ return ((op == rhs_->op) && (addr == rhs_->addr) && (data == rhs_->data));
      }
    
      void do_print( const uvm::uvm_printer& printer ) const
      {
      ¦ printer.print_string("command", (op ? "WRITE":"READ"));
      ¦ printer.print_field_int("addr", addr);
      ¦ printer.print_field_int("data", data);
      }
    
      std::string convert2string()
      {
      ¦ std::ostringstream str;
      ¦ str << "Command: " << (op ? "WRITE":"READ");
      ¦ str << " addr: 0x" << hex << std::setw(3) << std::setfill('0') << addr;
      ¦ str << " data: 0x" << hex << std::setw(3) << std::setfill('0') << data;
      ¦ return str.str();
      }
    
      // data members
     public:
      int addr;
      int data;
      cmd_op_t op;
    };
  • test1.h
  • 
    #pragma once
    
    #include "systemc.h"
    #include "uvm.h"
    
    #include "sequence_item.h"
    
    class test1 : public uvm::uvm_test
    {
     public:
    
      test1(uvm_component_name name) :
      ¦ uvm::uvm_test(name)
      {}
    
      ~test1() {}
    
      // Register with the factory.
      UVM_COMPONENT_UTILS(test1);
    
      void run_phase(uvm_phase& phase) {
      ¦ // Raise an objection before starting the activity
      ¦ phase.raise_objection(this);
    
      ¦ sequence_item item;
    
      ¦ item.addr = 0x8000;
      ¦ item.data = 0x1000;
      ¦ item.op   = WRITE;
    
      ¦ item.print();
      ¦ // seqr.execute_item(item);
    
      ¦ // Drop the objection when done
      ¦ phase.drop_objection(this);
      }
    
    };
  • test2.h
  • 
    #pragma once
    
    #include "systemc.h"
    #include "uvm.h"
    
    #include "sequence_item.h"
    
    class test2 : public uvm::uvm_test
    {
     public:
    
      test2(uvm_component_name name) :
      ¦ uvm::uvm_test(name)
      {}
    
      ~test2() {}
    
      // Register with the factory.
      UVM_COMPONENT_UTILS(test2);
    
      void run_phase(uvm_phase& phase) {
      ¦ // Raise an objection before starting the activity
      ¦ // phase.raise_objection(this);
    
      ¦ sequence_item item;
    
      ¦ item.addr = 0x8000;
      ¦ item.op   = READ;
    
      ¦ item.print();
      ¦ // seqr.execute_item(item);
    
      ¦ // Drop the objection when done
      ¦ // phase.drop_objection(this);
      }
    
    };  
  • sc_main.cpp
  • 
    #include "systemc.h"
    #include "uvm.h"
    
    #include "test1.h"
    #include "test2.h"
    
    int sc_main(int argc, char* argv[])
    {
    
      uvm::run_test(argv[1]);
    
      // uvm::run_test("test1");
      // uvm::run_test("test2");
    
      return 0;
    }  

実行

$> main [test]

実行の引数が テスト名 です。
えっ?出来んの?これ出来んの?って思いながらやったら出来ました。
(まじかー)

ちなみに、これはシミュレーション時間:0でしか動かしてないので
シミュレーション時間ありで実行させたらどうなるかはこれからです。
(たぶん、出来無いはず)

感想

  • どうしても、rand がないために不憫
    SCVと合わせて UVMパッケージにすればいいのに。
    どうしてそうなった感

  • 再コンパイル無しでテストが出来ればいいな
    SystemCのシミュレーションカーネルを弄る必要があると
    思っていたが、どうなるんだろう。

  • UVM(SystemVerilog)使えばいいじゃん。
    ごもっともなんだけど、手軽に遊べるので頑張って欲しい。

関連記事

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数