2016-10-26 1 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 

나는 "이 오류"주의하는 라인에 대한 컴파일 컴파일러 쓰기 오류, 중 : 이것은 내 코드의 일부이다.

오류 메시지 : 변수 인덱스 블록 항목 선택을 생성은 지원되지 않습니다 : 나는 일정한 수의 난을 교체 할 경우 내가

, 컴파일해야 확인합니다.

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 블록을 어떻게 선택할 수 있습니까? 이 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