common_cells icon indicating copy to clipboard operation
common_cells copied to clipboard

Truncation of `usage_o` port in `fifo_v3` when parameter `DEPTH` is a power of 2

Open WRoenninger opened this issue 5 years ago • 2 comments

The usage_o port of fifo_v3 has currently a width of $clog(DEPTH). This causes the pointer to wrap around to all zeros, if the FIFO has a power of 2 DEPTH and is full. This is an issue for the following exapmle:

localparam int unsigned Depth     = 32'd16;
localparam logic [3:0]  Threshold = 4'hF;
logic [3:0] usage;
if (usage > threshold) begin
  /* do something */
end

This if statement would not trigger in this case. This could be resolved by assigning the whole status_cnt_q to the usage_o port instead of the truncated one as is currently the case.

The workaround I am using currently is prepending the full_o signal to the ussage_o, however this causes jumps in this new usage pointer value when the FIFO is not configured to a power of 2 DEPTH.

WRoenninger avatar Feb 21 '20 12:02 WRoenninger

Good catch and thanks for reporting. We should probably fix this in a fifo_v4 or a breaking change (major version bump) in the common cells repo (which is unfortunately anyway required near term).

zarubaf avatar Feb 21 '20 17:02 zarubaf

Came across this today. Was thinking about the same workaround.

Juan-Gg avatar Jun 20 '24 14:06 Juan-Gg