Line 62... |
Line 62... |
input p_abort,
|
input p_abort,
|
input [width-1:0] mem_rd_data,
|
input [width-1:0] mem_rd_data,
|
output [width-1:0] p_data
|
output [width-1:0] p_data
|
);
|
);
|
|
|
reg [asz-1:0] cur_rdptr;
|
|
reg [asz-1:0] nxt_cur_rdptr;
|
reg [asz-1:0] nxt_cur_rdptr;
|
reg [asz-1:0] cur_rdptr_p1;
|
reg [asz-1:0] cur_rdptr_p1;
|
reg [asz-1:0] com_rdptr;
|
|
reg empty, full;
|
reg empty, full;
|
|
|
reg p_srdy;
|
|
reg nxt_irdy;
|
reg nxt_irdy;
|
|
|
reg [width-1:0] hold_a, hold_b;
|
reg [width-1:0] hold_a, hold_b;
|
reg valid_a, valid_b;
|
reg valid_a, valid_b;
|
reg prev_re;
|
reg prev_re;
|
reg [asz:0] tmp_usage;
|
reg [asz:0] tmp_usage;
|
reg [asz:0] fifo_size;
|
reg [asz:0] fifo_size;
|
|
wire rbuf1_drdy;
|
|
wire ip_srdy, ip_drdy;
|
|
wire [width-1:0] ip_data;
|
|
|
// Stage 1 -- Read pipeline
|
// Stage 1 -- Read pipeline
|
// issue a read if:
|
// issue a read if:
|
// 1) we are enabled
|
// 1) we are enabled
|
// 2) valid_a is 0, OR
|
// 2) valid_a is 0, OR
|
Line 100... |
Line 100... |
if (commit && p_abort)
|
if (commit && p_abort)
|
begin
|
begin
|
nxt_cur_rdptr = com_rdptr;
|
nxt_cur_rdptr = com_rdptr;
|
mem_re = 0;
|
mem_re = 0;
|
end
|
end
|
else if (enable & !empty & (!valid_a | (!prev_re & !valid_b) |
|
// else if (enable & !empty & (!valid_a | (!prev_re & !valid_b) |
|
(valid_a & valid_b & p_drdy)))
|
// (valid_a & valid_b & p_drdy)))
|
|
else if (enable & !empty & ip_drdy)
|
begin
|
begin
|
nxt_cur_rdptr = cur_rdptr_p1;
|
nxt_cur_rdptr = cur_rdptr_p1;
|
mem_re = 1;
|
mem_re = 1;
|
end
|
end
|
else
|
else
|
Line 157... |
Line 158... |
// Stage 2 -- read buffering
|
// Stage 2 -- read buffering
|
always @(`SDLIB_CLOCKING)
|
always @(`SDLIB_CLOCKING)
|
begin
|
begin
|
if (reset)
|
if (reset)
|
begin
|
begin
|
valid_a <= `SDLIB_DELAY 0;
|
|
hold_a <= `SDLIB_DELAY 0;
|
|
prev_re <= `SDLIB_DELAY 0;
|
prev_re <= `SDLIB_DELAY 0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if (commit && p_abort)
|
if (commit && p_abort)
|
prev_re <= `SDLIB_DELAY 0;
|
prev_re <= `SDLIB_DELAY 0;
|
else
|
else
|
prev_re <= `SDLIB_DELAY mem_re;
|
prev_re <= `SDLIB_DELAY mem_re;
|
|
end // else: !if(reset)
|
if (commit && p_abort)
|
end // always @ (`SDLIB_CLOCKING)
|
valid_a <= `SDLIB_DELAY 0;
|
|
else if (prev_re)
|
|
begin
|
|
valid_a <= `SDLIB_DELAY 1;
|
|
hold_a <= `SDLIB_DELAY mem_rd_data;
|
|
end
|
|
else if (!valid_b | p_drdy)
|
|
valid_a <= `SDLIB_DELAY 0;
|
|
end
|
|
end // always @ (posedge clk or posedge reset)
|
|
|
|
generate
|
generate
|
if (commit == 1)
|
if (commit == 1)
|
begin : gen_s2
|
|
always @(posedge clk)
|
|
begin
|
|
if (prev_re)
|
|
rdaddr_a <= `SDLIB_DELAY rdaddr_s0;
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
// Stage 3 -- output irdy/trdy
|
|
always @(`SDLIB_CLOCKING)
|
|
begin
|
|
if (reset)
|
|
begin
|
|
valid_b <= `SDLIB_DELAY 0;
|
|
hold_b <= `SDLIB_DELAY 0;
|
|
end
|
|
else
|
|
begin
|
|
if (commit && p_abort)
|
|
valid_b <= `SDLIB_DELAY 0;
|
|
else if (valid_a & (!valid_b | p_drdy))
|
|
begin
|
begin
|
valid_b <= `SDLIB_DELAY 1;
|
wire [asz-1:0] ip_rdaddr, p_rdaddr;
|
hold_b <= `SDLIB_DELAY hold_a;
|
|
end
|
|
else if (valid_b & p_drdy)
|
|
valid_b <= `SDLIB_DELAY 0;
|
|
end
|
|
end // always @ (posedge clk or posedge reset)
|
|
|
|
generate
|
sd_input #(asz+width) rbuf1
|
if (commit == 1)
|
(.clk (clk), .reset (p_abort | reset),
|
begin : gen_s3
|
.c_srdy (prev_re),
|
always @(posedge clk)
|
.c_drdy (rbuf1_drdy),
|
begin
|
.c_data ({rdaddr_s0,mem_rd_data}),
|
if (valid_a & (!valid_b | p_drdy))
|
.ip_srdy (ip_srdy), .ip_drdy (ip_drdy),
|
rdaddr_b <= `SDLIB_DELAY rdaddr_a;
|
.ip_data ({ip_rdaddr,ip_data}));
|
end
|
|
|
sd_output #(asz+width) rbuf2
|
|
(.clk (clk), .reset (p_abort | reset),
|
|
.ic_srdy (ip_srdy),
|
|
.ic_drdy (ip_drdy),
|
|
.ic_data ({ip_rdaddr,ip_data}),
|
|
.p_srdy (p_srdy), .p_drdy (p_drdy),
|
|
.p_data ({p_rdaddr,p_data}));
|
|
|
always @*
|
always @*
|
begin
|
begin
|
if (p_commit)
|
if (p_commit)
|
nxt_com_rdptr = rdaddr_b;
|
nxt_com_rdptr = p_rdaddr;
|
else
|
else
|
nxt_com_rdptr = com_rdptr;
|
nxt_com_rdptr = com_rdptr;
|
end
|
end
|
end
|
end // if (commit == 1)
|
|
else
|
|
begin
|
|
sd_input #(width) rbuf1
|
|
(.clk (clk), .reset (p_abort | reset),
|
|
.c_srdy (prev_re),
|
|
.c_drdy (rbuf1_drdy),
|
|
.c_data (mem_rd_data),
|
|
.ip_srdy (ip_srdy), .ip_drdy (ip_drdy),
|
|
.ip_data (ip_data));
|
|
|
|
sd_output #(width) rbuf2
|
|
(.clk (clk), .reset (p_abort | reset),
|
|
.ic_srdy (ip_srdy),
|
|
.ic_drdy (ip_drdy),
|
|
.ic_data (ip_data),
|
|
.p_srdy (p_srdy), .p_drdy (p_drdy),
|
|
.p_data (p_data));
|
|
end // else: !if(commit == 1)
|
endgenerate
|
endgenerate
|
|
|
assign p_srdy = valid_b;
|
|
assign p_data = hold_b;
|
|
|
|
endmodule // it_fifo
|
endmodule // it_fifo
|
|
|
No newline at end of file
|
No newline at end of file
|