Verilog 用生成的移位从FIFO填充寄存器向量

Verilog 用生成的移位从FIFO填充寄存器向量,verilog,fpga,Verilog,Fpga,我对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 a

我对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
reg[7:0]mac_rx_regs[0:1361];

generate for(ii=0;ii首先,您实际上不需要担心always语句的数量。如果它们都使用相同的时钟和重置,您将获得与进程之间交互相关的预期行为。 我要做的一件事,就是在我的翻牌任务中添加一个#FD,如下所示,让模拟看起来更好一点,IMHO

而且,这非常简单,您可以将其编码为单个进程

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  
参数FD=1;
reg[1361*8-1:0]mac_rx_regs;//如果您试图
//推断记忆,但如果你没事
//对于寄存器,只需声明一个向量。
始终@(posedge clk或posedge重置)
开始
如果(重置)

mac_rx_regs谢谢你的回答。如果我理解正确,我的原始代码应该可以正常工作,但我更喜欢你的版本。它更干净,功能更明显。