我是一个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块运行的顺序没有指定,而且它似乎会导致创建许多不必要的逻辑来将数据从一个寄存器移动到另一个寄存器。
发布于 2017-08-24 14:51:17
首先,通常你不需要担心always语句的数量。如果它们都使用相同的时钟并重置,您将获得与进程之间的交互相关的预期行为。我所做的一件事,更多的是关于风格,是添加一个#FD到我的flop赋值中,如下所示,以使模拟看起来更好一些,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 https://stackoverflow.com/questions/45852498
复制相似问题