我不知道下面的代码不起作用,但是不会合成:
reg [7:0] FIFO [0:8];
always@(posedge clk) begin
if(wr & !rd & !full) begin
FIFO[0:8] <= {data_in, FIFO[1:8]};
end
end
我也尝试用其他方式索引FIFO,但是没有任何效果。在Xilinx论坛上找到了这个话题,但是我无法弄清楚他想说些什么。链接在这里:
http://forums.xilinx.com/t5/General-Technical-Discussion/2-dimensional-array-problem-in-Verilog/td-p/42368
谢谢
最佳答案
您对打包和未打包的数组的工作方式了解甚少。我建议您阅读IEEE1800-2012部分7.4.1、7.4.2、7.4.4和7.4.5。从技术上讲,IEEE1800用于SystemVerilog,它是Verilog的超集。对于静态大小的阵列,两者是相同的,我发现IEEE1800比IEEE1364有更好的解释和示例。
如果您还没有LRM的副本,则可以在ieee.org网站上免费下载:IEEE Std 1800-2012
对于提供的代码,不能以这种方式分配未打包数组中的每个元素。您有两种选择:使用for循环分配数组的未打包部分,或使数组进行两次打包。
/* Using for-loop */
reg [7:0] FIFO [0:8];
integer i;
always@(posedge clk) begin
if(wr & !rd & !full) begin
for(i = 8; i > 0; i=i-i) begin
FIFO[i] <= FIFO[i-1];
end
FIFO[0] <= data_in;
end
end
/* Using double packed array */
reg [0:8] [7:0] FIFO; // NOTE: format and usage explained in IEEE1800-2012 7.4.5
always@(posedge clk) begin
if(wr & !rd & !full) begin
FIFO[0:8] <= {data_in,FIFO[0:7]};
end
end