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_dst_ip,
|
||||
|
||||
output logic o_packet_done,
|
||||
|
||||
ip_intf.MASTER m_ip
|
||||
);
|
||||
|
||||
always_comb begin
|
||||
m_ip.ip_hdr_valid = '0;
|
||||
logic [31:0] counter, counter_next;
|
||||
enum logic [1:0] {IDLE, HEADER, DATA} state, state_next;
|
||||
|
||||
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;
|
||||
logic [15:0] checksum;
|
||||
|
||||
always_ff @(posedge i_clk) begin
|
||||
if (i_rst) begin
|
||||
counter <= '0;
|
||||
state <= IDLE;
|
||||
end else begin
|
||||
counter <= counter_next;
|
||||
state <= state_next;
|
||||
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
|
||||
@@ -37,7 +37,7 @@ always_ff @(posedge i_clk) begin
|
||||
if (i_rst) begin
|
||||
tcp_state <= IDLE;
|
||||
end else begin
|
||||
if (i_enable) begin
|
||||
if (~i_enable) begin
|
||||
tcp_state <= IDLE;
|
||||
end else begin
|
||||
tcp_state <= tcp_state_next;
|
||||
@@ -48,6 +48,8 @@ end
|
||||
always_comb begin
|
||||
tcp_state_next = tcp_state;
|
||||
|
||||
o_tx_ctrl_valid = '0;
|
||||
|
||||
o_tx_ctrl = TX_CTRL_NOP;
|
||||
o_tx_ctrl_valid = '0;
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ logic [31:0] w_tx_ack_number;
|
||||
logic [7:0] w_tx_flags;
|
||||
logic [15:0] w_tx_window_size;
|
||||
logic w_tx_hdr_valid;
|
||||
logic w_tx_packet_done;
|
||||
|
||||
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_flags (w_tx_flags),
|
||||
.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
|
||||
@@ -183,6 +186,8 @@ tcp_packet_generator u_tcp_packet_generator (
|
||||
.i_src_ip (hwif_out.source_ip.d.value),
|
||||
.i_dst_ip (hwif_out.dest_ip.d.value),
|
||||
|
||||
.o_packet_done (w_tx_packet_done),
|
||||
|
||||
.m_ip (m_ip_tx)
|
||||
);
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ module tcp_tx_ctrl(
|
||||
output logic [31:0] o_ack_number,
|
||||
output logic [7:0] o_flags,
|
||||
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);
|
||||
@@ -55,6 +57,10 @@ always_comb begin
|
||||
SEND_SYN: begin
|
||||
o_flags = FLAG_SYN;
|
||||
o_hdr_valid = '1;
|
||||
|
||||
if (i_packet_done) begin
|
||||
state_next = IDLE;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user