Vengineerの妄想(準備期間)

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

UVM 1.0 : examples/simple/hello_world (その4)


コンシューマクラス(consumer.sv)は、次のようになっています。
      // テンプレートとして、#(type T=packet)を指定している。packetは前回説明したクラス
      class consumer #(type T=packet) extends uvm_component; // uvm_componentを継承する

        // ブロッキングタイプの入力側のTLMポート
        uvm_blocking_put_imp #(T,consumer #(T)) in;  
        uvm_get_port #(T) out;

        function new(string name, uvm_component parent=null);
          super.new(name,parent);
          in  = new("in", this);              // ポート(in)を生成する 
          out = new("out",this,0);            // ポート(out)を生成する 
        endfunction

        protected int count=0;
        local semaphore lock = new(1);

        // set_config_xxx/get_config_xxxのためのおまじない
        `uvm_component_utils_begin(consumer #(T))
          `uvm_field_int(count,UVM_ALL_ON + UVM_READONLY + UVM_DEC)
        `uvm_component_utils_end

        // run_test()が呼ばれたときに実行されるタスク
        task run_phase(uvm_phase phase);  
          T p;                          // Tは、デフォルトでは、packetクラス
          while(out.size()) begin       // outポート内のパケットのサイズが0でないと、
            out.get(p);                 // outポートからパケットを取り出し、
            put(p);                     // putタスクを呼び出す
          end
        endtask

        // accept_tr/begin_tr/end_trは、
        // uvm_componentクラスでRecording Interfaceとして定義されている
        task put (T p);                 // putタスク
          lock.get();                   // セマファでロックする
          count++;
          accept_tr(p);                              
          #10;
          void'(begin_tr(p));
          #30;
          end_tr(p);
          `uvm_info("consumer", 
                    $sformatf("Received %0s local_count=%0d",p.get_name(),count), 
                    UVM_MEDIUM)
          if(uvm_report_enabled(UVM_HIGH,UVM_INFO,""))
            p.print();
          lock.put();                  // セマファをアンロックする
        endtask

      endclass
ModelSim 6.6c Altera Editionでシミュレーションすると、
accept_tr/begin_tr/end_trを呼ばれたことにより、tr_db.logというファイルが生成されます。
このデータは波形Viewerで表示できるようなフォーマットになっています。
実際に波形Viewerで表示できるかどうかまでは確認していません。
BEGIN: {TXH:2     TYPE:"Begin_No_Parent, Link" STREAM:0     NAME:packet TIME=0 ns LABEL:"" DESC=""
BEGIN: {TXH:3     TYPE:"Begin_No_Parent, Link" STREAM:x     NAME:producer1-0 TIME=0 ns LABEL:"" DESC=""
  LINK: {TXH1:3     TXH2:2     RELATION=}
  SET_ATTR: {TXH:2     NAME:addr VALUE:0 RADIX:UVM_HEX BITS=32   }
  SET_ATTR: {TXH:2     NAME:accept_time VALUE:0 RADIX:UVM_TIME BITS=64   }
  SET_ATTR: {TXH:2     NAME:initiator VALUE:475 RADIX:UVM_DEC BITS=32   }
END: {TXH:2     TIME=0 ns}
  FREE: {TXH:2    }
  SET_ATTR: {TXH:3     NAME:addr VALUE:0 RADIX:UVM_HEX BITS=32   }
  SET_ATTR: {TXH:3     NAME:accept_time VALUE:0 RADIX:UVM_TIME BITS=64   }
  SET_ATTR: {TXH:3     NAME:initiator VALUE:475 RADIX:UVM_DEC BITS=32   }
END: {TXH:3     TIME=0 ns}
  FREE: {TXH:3    }

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