【问题标题】:SystemVerilog: writing into an array using a write pointerSystemVerilog:使用写指针写入数组
【发布时间】:2020-06-30 15:07:58
【问题描述】:

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

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

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

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

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

M N.

如果我编写如下代码:

mybuffer[wptr +: M] = indata;

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

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

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

谢谢。

【问题讨论】:

  • 您的所有数据似乎都是 8 位宽。那么为什么不使用简单的索引,mybuffer[wptr]?如果 wptr >=M,您将获得 x 值。因此,您可能需要为 wpttr 值添加检查器。
  • @Serge 感谢您的评论。你到底是什么意思?我需要将indata 批量复制到mybuffer,如何使用简单索引?

标签: verilog system-verilog fpga hdl asic


【解决方案1】:

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

您已将 indatamybuf 声明为二维 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



【讨论】:

  • 再次感谢!其实indata不止一个字节,我需要从wptr的位置开始,把它的M个字节全部复制到mybufferwptr 将增加 M。
  • 我添加了另一个例子。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2019-12-10
  • 1970-01-01
  • 2011-05-20
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多