数组
在verilog中,对数组reg [7:0] a_tmp[32:0]进行操作时,分不清楚先对[32:0]进行操作还是先对 [7:0]进行操作,为此进行下面的实验。进一步加深对数组的理解。
实验1:
reg [7:0] a_tmp[32:0];
遍历的方式:
integer i;
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
for(i=0;i<8;i=i+1)
a_tmp[i]<='d0;//遍历了8次,a_tmp[i]<='d0与a_tmp[i][7:0]<='d0的结果一样
end
else begin
for(i=0;i<8;i=i+1)
a_tmp[i]<=data_out;
end
end
实验2:
reg [7:0] a_tmp[32:0];
integer i;
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
for(i=0;i<8;i=i+1)
a_tmp[i][7:0]<='d0;//将a_tmp[i]修改为a_tmp[i][7:0]。
end
else begin
for(i=0;i<8;i=i+1)
a_tmp[i][7:0]<=data_out;
end
end
两个实验的出的结论:
数组数据的遍历a_tmp[i]<='d0与a_tmp[i][7:0]<='d0的结果一样
实验3:
module array(
input clk,
input rst_n,
input reg [7:0] data_in,
output reg [7:0] data_out
);
reg [7:0] a_tmp[32:0];
reg [7:0] b_tmp[32:0];
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
data_out <= 'b0;
end
else
data_out <= data_in*data_in;
end
integer i;
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
for(i=0;i<33;i=i+1)//将i=8改为i=33
a_tmp[i][7:0]<='d0;
end
else begin
for(i=0;i<8;i=i+1)
a_tmp[i][7:0]<=data_out;
end
end
endmodule
得到的结果:
最后得出的结论:
“reg [7:0] a_tmp[32:0]”代码中,对数组的操作先对[32:0]进行操作,再对[7:0]进行操作。[32:0]为深度,[7:0]为位宽。
reg [7:0] a_tmp[32:0];
--晓凡 2023年6月12日于桂林书