我是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的字节数来寻址寄存器向量。我担心这不是确定性的,因为没有指定生成的始终阻止运行的顺序,而且似乎它会导致为从中移动数据而创建大量不必要的逻辑。一个注册到另一个。
答案 0 :(得分:1)
首先,您并不需要担心一般语句的数量。如果它们都使用相同的时钟并重置,您将获得与进程之间的交互相关的预期行为。 我做的一件事,更多是关于风格而不是其他任何事情,就是在我的翻牌作业中添加一个#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