2017-04-19 16 views

答えて

2

John Aynsley(Doulos製)は、あなたに役立つセクションがあるUVMに関する良い記事を書いています。この論文はDVCon 2011で公開されており、free copyを得ることができます: "メインストリームユーザーによる機能検証のための容易なUVM"。

このホワイトペーパーで説明したように、考えられるのはuvm_monitoruvm_subscriberです。 UVMサブスクライバ内のすべてのFunctional Coverageコードが表示されていても、そのコードをモニタ内に置くことはできません。以下に示すように

モニタコードがなります

class my_monitor extends uvm_monitor; 
`uvm_component_utils(my_monitor) 
uvm_analysis_port #(my_tx) aport; 

virtual dut_if dut_vi; 
... 
task run; 
    forever 
    begin 
     my_tx tx; 
     // Sense the DUT pins on a clock edge 
     @(posedge dut_vi.clock); 
     tx = my_tx::type_id::create("tx"); 
     tx.cmd = dut_vi.cmd; 
     tx.addr = dut_vi.addr; 
     tx.data = dut_vi.data; 

     aport.write(tx); 
    end 
    endtask 
endclass 

を紙に示すように、あなたは、加入者を作成します。

class my_subscriber extends uvm_subscriber #(my_tx); 
`uvm_component_utils(my_subscriber) 

// Coverage registers 
bit cmd; 
int addr; 
int data; 

covergroup cover_bus; 
coverpoint cmd; 
coverpoint addr; 
coverpoint data; 
endgroup 
... 
// Function called through analysis port 
function void write(my_tx t); 
    cmd = t.cmd; 
    addr = t.addr; 
    data = t.data; 
    cover_bus.sample(); 
endfunction 
endclass 

を最後に、あなたは、モニターと加入者の両方をインスタンス化次のコンポーネント階層のレベルアップを行い、論文のように接続します。

class my_env extends uvm_env; 
    `uvm_component_utils(my_env) 

    my_monitor monitor; 
    my_subscriber subscriber; 
    ... 
    function void build; 
    super.build(); 
    monitor = my_monitor::type_id::create("monitor" , this); 
    subscriber = my_subscriber::type_id::create("subscriber", this); 
    endfunction 

    function void connect; 
    monitor.aport.connect(subscriber.analysis_export); 
    endfunction 
endclass 

PS。論文に示されているコードのソースファイルは、すべてDoulos websiteからダウンロードできます。

関連する問題