2016-10-26 43 views
0

我編寫了帶有多個SPI接口的SPI從站BFM模塊。我使用Active-HDL 9.1。我在我的SystemVerilog代碼中生成了幾個塊(spi奴隸)。我還編寫了在這些塊中讀取和重置數據的函數。這是我的代碼的一部分: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 

在一個編譯器編譯器寫入錯誤的行,其中我注意到「錯誤this」。是 不支持生成塊項選擇具有可變指數::

錯誤消息我

如果我與恆定數目的取代我,請編譯是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 

如何在我的任務Reset()中生成多個bfm_spi_1_i塊?這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