【UVM】ScoreBoardを作成する~uvm_tlm_analysis_fifoを使用する~【#2】

Systemverilog

はじめに

前回はScoreBoardでAnalysis Exportを定義してMonitor階層のAnalysis Portと接続しました。

Analysis Exportはデータを受け取るだけなので、FIFOのようにデータを保持する仕組みをScoreBoard内に実装する必要があります。

そこで、今回はFIFO付きのAnalysis Export、uvm_tlm_analysis_fifoを使用します。

サンプルコード

sample_scoreboard.svh

uvm_analysis_impからuvm_tlm_analysis_fifoに変更します。

class sample_scoreboard extends uvm_scoreboard;
    `uvm_component_utils(sample_scoreboard)
    // uvm_analysis_imp#(sample_sequence_item, sample_scoreboard) item_collected_export;  // 削除
    uvm_tlm_analysis_fifo#(sample_sequence_item) fifo;  // 代わりにuvm_tlm_analysis_fifoを使用する

    function new(string name, uvm_component parent);
        super.new(name, parent);
        // item_collected_export = new("item_collected_export", this);  // 削除
        fifo = new("fifo", this);
    endfunction

    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
    endfunction

    // uvm_tlm_analysis_fifoにはwriteメソッドがあるので必要ない
    // virtual function void write(sample_sequence_item item);
    //     `uvm_info(this.get_name(), $sformatf("data=%x", item.data), UVM_NONE);
    // endfunction

    // 代わりにgetメソッドでfifoからトランザクションを取得する。
    virtual task run_phase(uvm_phase phase);
        sample_sequence_item item;
        super.run_phase(phase);
        forever begin
            fifo.get(item);
            `uvm_info(this.get_name(), $sformatf("data=%x", item.data), UVM_NONE);
        end
    endtask

    virtual function void check_phase(uvm_phase phase);
    endfunction
endclass
sample_env.svh

ScoreBoardに変更があるので、接続部分を修正します。

Monitor階層に変更はありません。

class sample_env extends uvm_env;
    `uvm_component_utils(sample_env)

    sample_agent agent;
    sample_scoreboard scoreboard;

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

    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        agent = sample_agent::type_id::create("agent", this);
        scoreboard = sample_scoreboard::type_id::create("scoreboard", this);
    endfunction

    function void connect_phase(uvm_phase phase);
        // agent.monitor.item_collected_port.connect(scoreboard.item_collected_export);  // 削除
        // uvm_tlm_analysis_fifoにbuilt-inであるanalysis_exportと接続する
        agent.monitor.item_collected_port.connect(scoreboard.fifo.analysis_export);
    endfunction
endclass

まとめ

uvm_tlm_analysis_fifoを使用しました。

コメント

タイトルとURLをコピーしました