diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_packet_generator.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_packet_generator.sv index 883a04a..863137c 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_packet_generator.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_packet_generator.sv @@ -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 \ No newline at end of file diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_state_manager.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_state_manager.sv index a819773..bb20dee 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_state_manager.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_state_manager.sv @@ -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; diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv index 1cfb2db..861899b 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv @@ -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) ); diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_tx_ctrl.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_tx_ctrl.sv index 8ca3105..d20bbfe 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_tx_ctrl.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_tx_ctrl.sv @@ -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