0

想象一下,我有一个特定的字节缓冲区和这个缓冲区的写指针,例如:

reg[N-1:0][7:0]mybuffer;
reg[$clog2(N+1)-1:0] wptr;

wherewptr指向缓冲区中我要存储传入数据的下一个位置。

现在,假设我的输入数据也是一个字节块,例如:

reg[M-1:0][7:0] indata;

M< N

如果我编写如下代码:

mybuffer[wptr +: M] = indata;

一切正常,除了 when 的明显例外wptr > N-M,这在我的应用程序中永远不会发生。

但是,这似乎不是解决问题的一种非常干净的方法,并且会导致使用 linting 工具发出警告。扩展缓冲区似乎也不是一个好方法。

实现这样的事情的干净和正确的方法是什么?

谢谢。

4

1 回答 1

1

我将在此处的答案字段中解释我的评论。

您已将indata和声明mybuf为二维 reg 数组:

reg[N-1:0][7:0]mybuffer;
reg[M-1:0][7:0] indata;

因此,上面声明了向量的打包数组,其中第二维[7:0]是内存中向量的维数。通常在这种情况下wptr处理第一个维度。类似于以下内容:

always @(posedge clk) begin
   mybuffer[wrpt] <= indata[wrpt];
   if (wrpt == M - 1)
      wrpt <= 0; // this will prevent from coping indexes from M to N-1
   else
      wrpt <= wrpt + 1;
end

因此,wrpt指针指向下一个 8 位块。否则,我认为根本没有理由拥有这个指针。对于批量复制,您可以使用以下内容:

   always_comb mybufer = indata;

以上对于您声明的打包数组(或具有相同范围的解包数组)是可能的

更新:添加了另一个示例

我想,根据您的问题,您正在寻找一些解决方案,您可以在其中重复地将“indata”插入“mybuffer”,直到后者被填满。在这种情况下,可以使用以下方法来完成其余操作R

parameter N = 10;
parameter M = 3;
parameter R = N % M;

initial begin 
  int wrpt;
  for (wrpt = 0; wrpt < N; wrpt  += M) 
    mybuffer[wrpt  +: M ] = indata;
  
  if (R != 0)
    mybuffer[(wrpt - N)  +: R ] = indata[0 +: R];
end



于 2020-06-30T18:24:10.693 回答