Send basic header
This commit is contained in:
@@ -15,22 +15,89 @@ module tcp_packet_generator (
|
|||||||
input wire [31:0] i_src_ip,
|
input wire [31:0] i_src_ip,
|
||||||
input wire [31:0] i_dst_ip,
|
input wire [31:0] i_dst_ip,
|
||||||
|
|
||||||
|
output logic o_packet_done,
|
||||||
|
|
||||||
ip_intf.MASTER m_ip
|
ip_intf.MASTER m_ip
|
||||||
);
|
);
|
||||||
|
|
||||||
always_comb begin
|
logic [31:0] counter, counter_next;
|
||||||
m_ip.ip_hdr_valid = '0;
|
enum logic [1:0] {IDLE, HEADER, DATA} state, state_next;
|
||||||
|
|
||||||
if (i_hdr_valid) begin
|
logic [15:0] checksum;
|
||||||
m_ip.ip_hdr_valid = '1;
|
|
||||||
m_ip.ip_dscp = '0;
|
always_ff @(posedge i_clk) begin
|
||||||
m_ip.ip_ecn = '0;
|
if (i_rst) begin
|
||||||
m_ip.ip_length = '0;
|
counter <= '0;
|
||||||
m_ip.ip_ttl = '1;
|
state <= IDLE;
|
||||||
m_ip.ip_protocol = 8'h6;
|
end else begin
|
||||||
m_ip.ip_source_ip = i_src_ip;
|
counter <= counter_next;
|
||||||
m_ip.ip_dest_ip = i_dst_ip;
|
state <= state_next;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
always_comb begin
|
||||||
|
m_ip.ip_hdr_valid = '0;
|
||||||
|
o_packet_done = '0;
|
||||||
|
|
||||||
|
case (state)
|
||||||
|
|
||||||
|
IDLE: begin
|
||||||
|
if (i_hdr_valid) begin
|
||||||
|
m_ip.ip_hdr_valid = '1;
|
||||||
|
m_ip.ip_dscp = '0;
|
||||||
|
m_ip.ip_ecn = '0;
|
||||||
|
m_ip.ip_length = '0;
|
||||||
|
m_ip.ip_ttl = '1;
|
||||||
|
m_ip.ip_protocol = 8'h6;
|
||||||
|
m_ip.ip_source_ip = i_src_ip;
|
||||||
|
m_ip.ip_dest_ip = i_dst_ip;
|
||||||
|
|
||||||
|
if (m_ip.ip_hdr_ready) begin
|
||||||
|
state_next = HEADER;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
HEADER: begin
|
||||||
|
m_ip.ip_payload_axis_tvalid = '1;
|
||||||
|
|
||||||
|
case (counter)
|
||||||
|
0: m_ip.ip_payload_axis_tdata = i_source_port[15:8];
|
||||||
|
1: m_ip.ip_payload_axis_tdata = i_source_port[7:0];
|
||||||
|
2: m_ip.ip_payload_axis_tdata = i_dest_port[15:8];
|
||||||
|
3: m_ip.ip_payload_axis_tdata = i_dest_port[7:0];
|
||||||
|
4: m_ip.ip_payload_axis_tdata = i_seq_number[31:24];
|
||||||
|
5: m_ip.ip_payload_axis_tdata = i_seq_number[23:16];
|
||||||
|
6: m_ip.ip_payload_axis_tdata = i_seq_number[15:8];
|
||||||
|
7: m_ip.ip_payload_axis_tdata = i_seq_number[7:0];
|
||||||
|
8: m_ip.ip_payload_axis_tdata = i_ack_number[31:24];
|
||||||
|
9: m_ip.ip_payload_axis_tdata = i_ack_number[23:16];
|
||||||
|
10: m_ip.ip_payload_axis_tdata = i_ack_number[15:8];
|
||||||
|
11: m_ip.ip_payload_axis_tdata = i_ack_number[7:0];
|
||||||
|
12: m_ip.ip_payload_axis_tdata = '0;
|
||||||
|
13: m_ip.ip_payload_axis_tdata = i_flags;
|
||||||
|
14: m_ip.ip_payload_axis_tdata = i_window_size[15:8];
|
||||||
|
15: m_ip.ip_payload_axis_tdata = i_window_size[7:0];
|
||||||
|
16: m_ip.ip_payload_axis_tdata = checksum[15:8];
|
||||||
|
17: m_ip.ip_payload_axis_tdata = checksum[7:0];
|
||||||
|
18: m_ip.ip_payload_axis_tdata = '0;
|
||||||
|
19: begin
|
||||||
|
m_ip.ip_payload_axis_tdata = '0;
|
||||||
|
m_ip.ip_payload_axis_tlast = '1;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
|
||||||
|
if (m_ip.ip_payload_axis_tready) begin
|
||||||
|
counter_next <= counter + 1;
|
||||||
|
|
||||||
|
if (m_ip.ip_payload_axis_tlast) begin
|
||||||
|
state_next = IDLE;
|
||||||
|
o_packet_done = '1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
@@ -37,7 +37,7 @@ always_ff @(posedge i_clk) begin
|
|||||||
if (i_rst) begin
|
if (i_rst) begin
|
||||||
tcp_state <= IDLE;
|
tcp_state <= IDLE;
|
||||||
end else begin
|
end else begin
|
||||||
if (i_enable) begin
|
if (~i_enable) begin
|
||||||
tcp_state <= IDLE;
|
tcp_state <= IDLE;
|
||||||
end else begin
|
end else begin
|
||||||
tcp_state <= tcp_state_next;
|
tcp_state <= tcp_state_next;
|
||||||
@@ -48,6 +48,8 @@ end
|
|||||||
always_comb begin
|
always_comb begin
|
||||||
tcp_state_next = tcp_state;
|
tcp_state_next = tcp_state;
|
||||||
|
|
||||||
|
o_tx_ctrl_valid = '0;
|
||||||
|
|
||||||
o_tx_ctrl = TX_CTRL_NOP;
|
o_tx_ctrl = TX_CTRL_NOP;
|
||||||
o_tx_ctrl_valid = '0;
|
o_tx_ctrl_valid = '0;
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ logic [31:0] w_tx_ack_number;
|
|||||||
logic [7:0] w_tx_flags;
|
logic [7:0] w_tx_flags;
|
||||||
logic [15:0] w_tx_window_size;
|
logic [15:0] w_tx_window_size;
|
||||||
logic w_tx_hdr_valid;
|
logic w_tx_hdr_valid;
|
||||||
|
logic w_tx_packet_done;
|
||||||
|
|
||||||
tcp_pkg::rx_msg_t rx_msg;
|
tcp_pkg::rx_msg_t rx_msg;
|
||||||
|
|
||||||
@@ -163,7 +164,9 @@ tcp_tx_ctrl u_tcp_tx_ctrl (
|
|||||||
.o_ack_number (w_tx_ack_number),
|
.o_ack_number (w_tx_ack_number),
|
||||||
.o_flags (w_tx_flags),
|
.o_flags (w_tx_flags),
|
||||||
.o_window_size (w_tx_window_size),
|
.o_window_size (w_tx_window_size),
|
||||||
.o_hdr_valid (w_tx_hdr_valid)
|
.o_hdr_valid (w_tx_hdr_valid),
|
||||||
|
|
||||||
|
.i_packet_done (w_tx_packet_done)
|
||||||
);
|
);
|
||||||
|
|
||||||
// packet generator
|
// packet generator
|
||||||
@@ -183,6 +186,8 @@ tcp_packet_generator u_tcp_packet_generator (
|
|||||||
.i_src_ip (hwif_out.source_ip.d.value),
|
.i_src_ip (hwif_out.source_ip.d.value),
|
||||||
.i_dst_ip (hwif_out.dest_ip.d.value),
|
.i_dst_ip (hwif_out.dest_ip.d.value),
|
||||||
|
|
||||||
|
.o_packet_done (w_tx_packet_done),
|
||||||
|
|
||||||
.m_ip (m_ip_tx)
|
.m_ip (m_ip_tx)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ module tcp_tx_ctrl(
|
|||||||
output logic [31:0] o_ack_number,
|
output logic [31:0] o_ack_number,
|
||||||
output logic [7:0] o_flags,
|
output logic [7:0] o_flags,
|
||||||
output logic [15:0] o_window_size,
|
output logic [15:0] o_window_size,
|
||||||
output logic o_hdr_valid
|
output logic o_hdr_valid,
|
||||||
|
|
||||||
|
input wire i_packet_done
|
||||||
);
|
);
|
||||||
|
|
||||||
localparam FLAG_FIN = (1 << 0);
|
localparam FLAG_FIN = (1 << 0);
|
||||||
@@ -55,6 +57,10 @@ always_comb begin
|
|||||||
SEND_SYN: begin
|
SEND_SYN: begin
|
||||||
o_flags = FLAG_SYN;
|
o_flags = FLAG_SYN;
|
||||||
o_hdr_valid = '1;
|
o_hdr_valid = '1;
|
||||||
|
|
||||||
|
if (i_packet_done) begin
|
||||||
|
state_next = IDLE;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user