階層

2016-06-25 12 views
0

はSVインタフェース内のコードを考えてみましょブロック要素を生成するアクセス方法:階層

genvar i; 
generate 
for (i = 0; i < 2; i++) begin : g1 
task ab(); 
///< something here 
endtask 
end 
endgenerate 

LRMによると、1800年から2012年、私は技術的に(モニターのVIFに考えることで、このタスクにアクセスすることができるはずセクション27.6は、仮想インスタンスでありますのインタフェース:

vif.g1[i].ab(); 

これは間違いありませんか?

vif.genblk1[i].ab(); 

:はい、それはvif.g1は(推敲時間)見つけることができない報告ので、私もそれだけであることを仮定という名前のブロックせずにそれを試してみたそれを支える

を問題を持っているシミュレータ場合運がない。 ここで問題は何ですか?私は、モニターや他のクラスは実行時に作成されたハンドルを持っていると思いますが、インターフェースは静的な時間でコンパイルされ、インターフェースのすべての要素が利用可能でなければなりません。

答えて

2

あなたは、タスクを参照するために[] 'sの内部の変数を使用することはできません。 Aは、シミュレーションを開始する前にループが精緻で平らます生成します。だからあなたはこのタスクを

と呼ぶ必要があります
vif.g1[0].ab; 

完全な自己完結型の例です。同じ質問を投稿してみてください。

interface itf; 
     for (genvar ii = 0; ii < 2; ii++) begin : g1 
    task ab(); 
     $display("%m"); 
    endtask // ab  
     end : g1 
endinterface : itf 
module top; 
    itf i1(); 
    virtual itf vif; 
    initial begin 
     vif = i1; 
     vif.g1[0].ab; 
    end 
endmodule : top 
+0

ああ、ループがフラット/アンロールの生成範囲を超えないようにしても、たくさんのタスクコールがあれば本当にたくさんのコードになるでしょうが、私はそれが一行の文であると思いますので、うまくいくはずです。提案のおかげで、私は別の生成されたブロックにアクセスすると:) – wisemonkey

+1

問題は、動的範囲の参照のアウトとはほとんどを持っていることを試してみましょう。問題はgenvar値を使用して型を定義することができることです。つまり、生成されたブロックごとに異なる型がある可能性があります。真の配列はすべての要素が同じ型です。例えば: 'のための(genvar II = 0; II <2; II ++)開始:G1 ビット[I + 1:0] VAR1。 関数[ii + 1:0] func; リターン '1; VAR1及びFUNCに endfunction'各参照は、静的に決定タイプを有する必要があります。私はそれについて考えていなかった –

+0

感謝:)ところでちょうどサイドノートVCS(今うまくいけば、彼らが将来的に修正します)の報告が備わっていますまだ実装されていません、しかし、のIncisiveはModelSimの/クエスタ – wisemonkey