2016-10-26 5 views
0

Я пишу модуль подчиненного модуля SPI с несколькими интерфейсами SPI. Я использую Active-HDL 9.1. Я генерирую несколько блоков (spi slaves) в моем коде 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 ОК.

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

Что вы можете сделать, создать интерфейс или абстрактный класс с реализацией, который вызывает каждый Reset() внутри генерировать

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 
Смежные вопросы