module egr_oflow
|
module egr_oflow
|
#(parameter drop_thr=`TX_FIFO_DEPTH-10)
|
#(parameter drop_thr=`TX_FIFO_DEPTH-128)
|
(
|
(
|
input clk,
|
input clk,
|
input reset,
|
input reset,
|
|
|
input c_srdy,
|
input c_srdy,
|
output reg c_drdy,
|
output reg c_drdy,
|
input [`PFW_SZ-1:0] c_data,
|
input [`PFW_SZ-1:0] c_data,
|
|
|
input [`TX_USG_SZ-1:0] tx_usage,
|
input [`TX_USG_SZ-1:0] tx_usage,
|
|
|
output reg p_srdy,
|
output reg p_srdy,
|
input p_drdy,
|
input p_drdy,
|
output [`PFW_SZ-1:0] p_data,
|
output [`PFW_SZ-1:0] p_data,
|
output reg p_commit,
|
output reg p_commit,
|
output reg p_abort
|
output reg p_abort
|
);
|
);
|
|
|
reg state, nxt_state;
|
reg state, nxt_state;
|
|
|
localparam s_idle = 0, s_packet = 1, s_flush = 2;
|
localparam s_idle = 0, s_packet = 1, s_flush = 2;
|
|
|
assign p_data = c_data;
|
assign p_data = c_data;
|
|
|
always @*
|
always @*
|
begin
|
begin
|
c_drdy = 0;
|
c_drdy = 0;
|
p_srdy = 0;
|
p_srdy = 0;
|
p_commit = 0;
|
p_commit = 0;
|
p_abort = 0;
|
p_abort = 0;
|
|
|
case (state)
|
case (state)
|
s_idle :
|
s_idle :
|
begin
|
begin
|
if (c_srdy & p_drdy & (c_data[`PRW_PCC] == `PCC_SOP))
|
if (c_srdy & p_drdy & (c_data[`PRW_PCC] == `PCC_SOP))
|
begin
|
begin
|
nxt_state = s_packet;
|
nxt_state = s_packet;
|
c_drdy = 1;
|
c_drdy = 1;
|
p_srdy = 1;
|
p_srdy = 1;
|
end
|
end
|
else if (c_srdy)
|
else if (c_srdy)
|
begin
|
begin
|
c_drdy = 1;
|
c_drdy = 1;
|
end
|
end
|
end // case: state[s_idle]
|
end // case: state[s_idle]
|
|
|
s_packet :
|
s_packet :
|
begin
|
begin
|
if (c_srdy & (c_data[`PRW_PCC] == `PCC_BADEOP))
|
if (c_srdy & (c_data[`PRW_PCC] == `PCC_BADEOP))
|
begin
|
begin
|
c_drdy = 1;
|
c_drdy = 1;
|
p_abort = 1;
|
p_abort = 1;
|
nxt_state = s_idle;
|
nxt_state = s_idle;
|
end
|
end
|
else if (c_srdy & p_drdy & (c_data[`PRW_PCC] == `PCC_EOP))
|
else if (c_srdy & p_drdy & (c_data[`PRW_PCC] == `PCC_EOP))
|
begin
|
begin
|
p_srdy = 1;
|
p_srdy = 1;
|
c_drdy = 1;
|
c_drdy = 1;
|
p_commit = 1;
|
p_commit = 1;
|
nxt_state = s_idle;
|
nxt_state = s_idle;
|
end
|
end
|
else if (tx_usage >= drop_thr)
|
else if (!p_drdy | (tx_usage >= drop_thr))
|
begin
|
begin
|
c_drdy = 1;
|
c_drdy = 1;
|
nxt_state = s_idle;
|
nxt_state = s_idle;
|
p_abort = 1;
|
p_abort = 1;
|
end
|
end
|
else if (c_srdy & p_drdy)
|
else if (c_srdy & p_drdy)
|
begin
|
begin
|
p_srdy = 1;
|
p_srdy = 1;
|
c_drdy = 1;
|
c_drdy = 1;
|
end
|
end
|
end // case: state[s_packet]
|
end // case: state[s_packet]
|
|
|
default : nxt_state = s_idle;
|
default : nxt_state = s_idle;
|
endcase // case (1'b1)
|
endcase // case (1'b1)
|
end // always @ *
|
end // always @ *
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
begin
|
begin
|
if (reset)
|
if (reset)
|
begin
|
begin
|
state <= #1 s_idle;
|
state <= #1 s_idle;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
state <= #1 nxt_state;
|
state <= #1 nxt_state;
|
end
|
end
|
end // always @ (posedge clk)
|
end // always @ (posedge clk)
|
|
|
endmodule // egr_oflow
|
endmodule // egr_oflow
|
|
|