我不知道什么对以下代码不起作用,但它不会合成: reg [7:0] FIFO [0:8];always@(posedge clk) begin if(wr !rd !full) begin FIFO[0:8] = {data_in, FIFO[1:8]}; endend 我试图以其他方式索引FIFO,但没有任何作用.在
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