2016-10-26 8 views
0

私は、いくつかのSPIインターフェイスを備えたSPIスレーブBFMモジュールを作成します。私はActive-HDL 9.1を使用します。私はSystemVerilogコードにいくつかのブロック(スピードスレーブ)を生成します。私はこのブロックのデータを読み込んでリセットする関数も書いています。これは私のコードの一部です:SystemVerilogブロック項目の変数インデックス

module bfm_spi(itf_spi); 
    parameter C_NUM = 1; 
    parameter C_DATA_WIDTH = 32; 

    spi_interface itf_spi [C_NUM]; 


    genvar i; 
    generate 
     for(i=0; i < C_NUM; i++) begin : bfm_spi_arr 
    bfm_spi_1 #(.C_DATA_WIDTH(C_DATA_WIDTH)) bfm_spi_1_i (itf_spi[i]); 
     end 
    endgenerate 

    /** 
    * Reset all input buffers 
    * */ 
    task Reset; 
     integer i; 
     for(i = 0; i < C_NUM; i++) bfm_spi_arr[i].bfm_spi_1_i.Reset(); //Error this 
    endtask // Reset 

私は "エラーこれ"に注意してください、コンパイルコンパイラの書き込みエラーの間に。

エラーメッセージ:変数のインデックスを持つブロック項目の選択を生成するには、 サポートされていない:私は一定の数で私を交換した場合、私

、complileはOKです。

module bfm_spi(itf_spi); 
    parameter C_NUM = 1; 
    parameter C_DATA_WIDTH = 32; 

    spi_interface itf_spi [C_NUM]; 


    genvar i; 
    generate 
     for(i=0; i < C_NUM; i++) begin : bfm_spi_arr 
    bfm_spi_1 #(.C_DATA_WIDTH(C_DATA_WIDTH)) bfm_spi_1_i (itf_spi[i]); 
     end 
    endgenerate 

    /** 
    * Reset all input buffers 
    * */ 
    task Reset; 
     integer i; 
     for(i = 0; i < C_NUM; i++) bfm_spi_arr[0].bfm_spi_1_i.Reset(); //OK 
    endtask // Reset 

私のタスクでいくつかのbfm_spi_1_iブロックを自分のタスクで選択できますか?Reset()?このBFMモジュールはありません、あなたが生成する内部で)各リセット(呼び出す実装とのインターフェイスや抽象クラスを作成する何ができるかimplemantions

答えて

0

ため、シミュレーションのみに使用されて

interface class Reset_c; // you can use a virtual class if your simulator does not yet support interface classes. 
    pure virtual task Reset; 
endclass 
Reset_c R_h[C_NUM]; // array of handles to each implementation instance 
for(genvar i=0; i < C_NUM; i++) begin : bfm_spi_arr 
    bfm_spi_1 #(.C_DATA_WIDTH(C_DATA_WIDTH)) bfm_spi_1_i (itf_spi[i]); 

    class Reset_imp implements Reset_c; 
    virtual task Reset; 
     bfm_spi_1_i.Reset() 
    endtask 
    endclass 
    initial R_h[i] = new; 
end : bfm_spi_arr 

    task Reset; 
     for(int i = 0; i < C_NUM; i++) R_h[i].Reset(); 
    endtask // Reset 
関連する問題