SystemVerilog生成块项中的变量索引

时间:2016-10-26 14:14:25

标签: verilog system-verilog

我用多个SPI接口写SPI从BFM模块。我使用Active-HDL 9.1。我在SystemVerilog代码中生成了几个块(spi slave)。我还编写了在这个块中读取和重置数据的函数。这是我的代码的一部分:

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

在编译编译器中写入行的错误,其中我注意到&#34;错误此&#34;。

  

错误消息:生成带有变量索引的块项目选项   不支持:我

如果我用常数替换i,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

如何在我的任务Reset()中选择生成中的几个bfm_spi_1_i块?此BFM模块仅用于模拟,而不用于实现

1 个答案:

答案 0 :(得分:0)

您可以创建一个接口或抽象类,其实现调用generate

中的每个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