Line 49... |
Line 49... |
output wire o_err;
|
output wire o_err;
|
|
|
localparam FLEN=(1<<LGFLEN);
|
localparam FLEN=(1<<LGFLEN);
|
|
|
reg [(BW-1):0] fifo[0:(FLEN-1)];
|
reg [(BW-1):0] fifo[0:(FLEN-1)];
|
reg [(LGFLEN-1):0] r_first, r_last;
|
reg [(LGFLEN-1):0] r_first, r_last, r_next;
|
|
|
wire [(LGFLEN-1):0] w_first_plus_one, w_first_plus_two,
|
wire [(LGFLEN-1):0] w_first_plus_one, w_first_plus_two,
|
w_last_plus_one;
|
w_last_plus_one;
|
assign w_first_plus_two = r_first + {{(LGFLEN-2){1'b0}},2'b10};
|
assign w_first_plus_two = r_first + {{(LGFLEN-2){1'b0}},2'b10};
|
assign w_first_plus_one = r_first + {{(LGFLEN-1){1'b0}},1'b1};
|
assign w_first_plus_one = r_first + {{(LGFLEN-1){1'b0}},1'b1};
|
assign w_last_plus_one = r_last + {{(LGFLEN-1){1'b0}},1'b1};
|
assign w_last_plus_one = r_next; // r_last + 1'b1;
|
|
|
reg will_overflow;
|
reg will_overflow;
|
initial will_overflow = 1'b0;
|
initial will_overflow = 1'b0;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
if (i_rst)
|
if (i_rst)
|
Line 118... |
Line 118... |
initial r_unfl = 1'b0;
|
initial r_unfl = 1'b0;
|
initial r_last = 0;
|
initial r_last = 0;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
if (i_rst)
|
if (i_rst)
|
begin
|
begin
|
r_last <= { (LGFLEN){1'b0} };
|
r_last <= 0;
|
|
r_next <= { {(LGFLEN-1){1'b0}}, 1'b1 };
|
r_unfl <= 1'b0;
|
r_unfl <= 1'b0;
|
end else if (i_rd)
|
end else if (i_rd)
|
begin
|
begin
|
if ((i_wr)||(!will_underflow)) // (r_first != r_last)
|
if ((i_wr)||(!will_underflow)) // (r_first != r_last)
|
r_last <= w_last_plus_one;
|
begin
|
|
r_last <= r_next;
|
|
r_next <= r_last +{{(LGFLEN-2){1'b0}},2'b10};
|
// Last chases first
|
// Last chases first
|
// Need to be prepared for a possible two
|
// Need to be prepared for a possible two
|
// reads in quick succession
|
// reads in quick succession
|
// o_data <= fifo[r_last+1];
|
// o_data <= fifo[r_last+1];
|
else
|
end else
|
r_unfl <= 1'b1;
|
r_unfl <= 1'b1;
|
end
|
end
|
|
|
reg [7:0] fifo_here, fifo_next, r_data;
|
reg [7:0] fifo_here, fifo_next, r_data;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
fifo_here <= fifo[r_last];
|
fifo_here <= fifo[r_last];
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
fifo_next <= fifo[r_last+{{(LGFLEN-1){1'b0}},1'b1}];
|
fifo_next <= fifo[r_next];
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
r_data <= i_data;
|
r_data <= i_data;
|
|
|
reg [1:0] osrc;
|
reg [1:0] osrc;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
Line 171... |
Line 174... |
reg [(LGFLEN-1):0] r_fill;
|
reg [(LGFLEN-1):0] r_fill;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
if (i_rst)
|
if (i_rst)
|
r_fill <= 0;
|
r_fill <= 0;
|
else if ((i_rd)&&(!i_wr))
|
else if ((i_rd)&&(!i_wr))
|
r_fill <= r_first - r_last - 1'b1;
|
r_fill <= r_first - r_next;
|
else if ((!i_rd)&&(i_wr))
|
else if ((!i_rd)&&(i_wr))
|
r_fill <= r_first - r_last + 1'b1;
|
r_fill <= r_first - r_last + 1'b1;
|
else
|
else
|
r_fill <= r_first - r_last;
|
r_fill <= r_first - r_last;
|
assign o_half_full = r_fill[(LGFLEN-1)];
|
assign o_half_full = r_fill[(LGFLEN-1)];
|