verilog中二维数组使用有些限制,比如不能作为module的输入输出port
另外二维数据初始化可以使用for循环来实现初始化
------------------------------------------------------------------------------------------------
1. 二维数组作为输入输出port报错
下面举一个例子:
model inception(
input clk;
input [31:0] x [3:0]
);
如上面一个简单的model,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
上面这个简单的例子,输入端口有一个二维数组,编译时会出现错误,想要实现相同的效果,可以扩展位宽,也可以用四个x作为并行输入来等效,下面以扩展位宽为例子:
model inception(
input clk;
input [32*4-1:0] x
);
-----------------------------------------------------------------------------------------------
2.二维数组初始化
如果要对二维数组初始化,可以用如下三种方式
(1) read file从文本文件读取初始数据
(2) 用generate 来初始化
(3) 用for循环 来初始化
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
reg [31:0] x [7:0];
initial begin
$readmemb("test.txt", x);
end
用generate 的方式(相当于依次给每个元素赋值)如下:
wire [31:0] x [7:0];
generate
genvar i;
for(i=0;i<=7;i=i+1) begin : BLOCK0
assign x[32*(i+1) : 32*i] = i;
end
endgenerate
for循环来初始化数组:
reg [31:0] x [7:0];
always@(posedge clk) begin
for(i=0;i<=7;i=i+1) begin
x[i] <= i;
end
end