用生成的移位填充来自 FIFO 的寄存器向量

Filling register vector from FIFO with generated shifts

我是 Verilog 的新手,我刚刚开始从事一个项目,我正在尝试验证我开始使用的代码是否可行。下面的代码片段将 FIFO 卸载到 8 位寄存器的向量中。在每个时钟周期,它从 FIFO 卸载一个字节并将其放在寄存器链的末尾,将所有其他字节向下移动。

reg   [ 7:0]            mac_rx_regs [0 : 1361];
 generate for (ii=0; ii<1361; ii=ii+1)
  begin: mac_rx_regs_inst            
    always @(posedge rx_clk_int, posedge tx_reset)  
    if (tx_reset) begin
      mac_rx_regs[ii]   <= 8'b0;
      mac_rx_regs[1361]  <= 8'b0;
    end else begin
      if (rx_data_valid_r) begin
        mac_rx_regs[ii]   <= mac_rx_regs[ii+1];
        mac_rx_regs[1361]  <= rx_data_r;
      end
    end
  end
  endgenerate

我想知道这是否是执行此操作的好方法。我原以为只用读取 FIFO 的字节数来寻址寄存器向量。我担心这不是确定性的,因为未指定生成的总是块 运行 的顺序,而且它似乎会导致创建很多不必要的逻辑来从一个寄存器移动数据给另一个。

首先,您真的不需要担心一般情况下 always 语句的数量。如果它们都使用相同的时钟和重置,您将获得与进程之间的交互相关的预期行为。 恕我直言,我做的一件事是在我的翻牌作业中添加一个#FD,如下所示,使模拟看起来更好一些,这比其他任何事情都更重要。

此外,这非常简单,您可以将其编码为单个进程。

parameter FD = 1;
reg [1361*8-1:0] mac_rx_regs;  // Arrays are good if you are trying to 
                               // infer memory, but if you are okay 
                               // with registers, just declare a vector.
always @ (posedge clk or posedge reset)
begin 
   if (reset)
      mac_rx_regs <= #FD 1361*8'h0;
   else
      // This next statement shifts in a new 8 bits when rx_data_valid_r is asserted.
      // It will assign max_rx_regs to max_rx_regs (nop) when deasserted.
      mac_rx_regs <= #FD rx_data_valid_r ? {mac_rx_regs[1361*8-9:0],rx_data_r} : 
                                            mac_rx_regs;
end