今天设计碰到需要例化32个子模块的问题,依稀记得verilog中好像有循环的语句可以使用,于是查到了generate的使用。同时学习使用二维数据,将代码简洁化:
二维数组初始化
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
reg [7:0] mem_2d [99:0];
initial begin
$readmemb("simu.txt", mem_2d);
end
用generate 的方式(相当于依次给每个元素赋值)如下:
wire [7:0] mem_2d[99:0];
generate
genvar i;
for(i=0;i<=99;i=i+1) begin : BLOCK0
assign mem_2d[8*(i+1) : 8*i] = i;//
//crc_32 crc32(mem_2d[i] , crc_dout[i] );
end
endgenerate
也许大家会认为可以用如下的for循环来初始化数组:
reg [7:0] mem_2d[99:0];
initial begin
for(i=0;i<=99;i=i+1) begin
mem_2d[i] <= i;
end
end
但实际modelsim编译时会报错误,会认为mem_2d[i]应该是一个已知数据,不能用变量。