Vengineerの妄想

人生を妄想しています。

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


ドライバは、シーケンサからのトランザクションを受け取り、
その結果をシーケンサに戻します。
ドライバは、uvm_driverクラスを継承して、new関数run_phaseタスク
実装するだけです。
      // ドライバクラス
      // REQにuvm_sequence_itemクラスを
      // RSPにuvm_sequence_itemクラスをテンプレートに
      class my_driver #(type REQ = uvm_sequence_item, 
                        type RSP = uvm_sequence_item)  
                        extends uvm_driver #(REQ, RSP);

        int data_array[511:0];

        function new(string name, uvm_component parent);
          super.new(name, parent);
        endfunction

        // uvm_driverクラスを継承したときは、このタスクを実装する
        task run_phase(uvm_phase phase); 
          REQ req;
          RSP rsp;

          forever begin

            // シーケンスからトランザクションの要求をgetする
            seq_item_port.get(req);

            rsp = new();
            rsp.set_id_info(req);

            // Actually do the read or write here
            if (req.op == BUS_READ) begin // リード時
              rsp.addr = req.addr[8:0];
              rsp.data = data_array[rsp.addr];
              `uvm_info("my_driver",rsp.convert2string(),UVM_MEDIUM);
            end 
            else begin                     // ライト時
              data_array[req.addr[8:0]] = req.data;
              `uvm_info("my_driver",req.convert2string(),UVM_MEDIUM);
            end

            // シーケンスへトランザクションの応答をputする
            seq_item_port.put(rsp);

          end

        endtask

      endclass

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