我用多个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模块仅用于模拟,而不用于实现
答案 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