【verilog语法】⼆维数组
verilog中⼆维数组使⽤有些限制,⽐如不能作为module的输⼊输出port(如果确实有需要,只能⽤将等效为展开的⼆维数组的⼀维数组来代替了),另外⼆维数据初始化时,⽬前看只能⽤读⼊⽂件的⽅法,或者⽤generate的⽅法对⼆位数据进⾏初始化。
⼆维数组作为输⼊输出port报错
作为输⼊输出port的⼀个例⼦,这⾥我写了⼀个有传递参数的task,⽤来做⼀些数据初始化(根据传递参数):
task s00_axi_write;
input en_write;
input [31:0] wdat [255:0];
begin
@(negedge clk);
if(en_write)
一维数组的定义和初始化s00_axi_wdat <= wdat[0];
end
endtask
如上⾯⼀个简单的task,输⼊端⼝中有⼀个⼆维数组,⽤modelsim编译时,会报错误,这个是⼯具对语法不⽀持造成的,修改的简单⽅法是把⼆维数组输⼊改成⼀维数据传递进来,修改后如下:
task s00_axi_write;
input en_write;
input [32*256-1 :0] wdat ;
begin
@(negedge clk);
if(en_write)
s00_axi_wdat <= wdat[32-1 : 0];
end
endtask
2.⼆维数组初始化
如果要对⼆维数组初始化,只能⽤read file从⽂本⽂件读进来的⽅式或者⽤generate 来对数组初始化;
⽤read file的⽅式如下(⽂本⽂件为2进制,每个数据占据⼀⾏,例如11001111):
reg [7:0] mem_2d [99:0];
initial begin
$readmemb("", 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;
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论