tcp fix for u55c

This commit is contained in:
Zhenhao He 2022-07-11 10:58:25 +02:00
parent c7e475e526
commit 20607a122f
8 changed files with 1434 additions and 231 deletions

View File

@ -67,8 +67,8 @@ if(NOT EXAMPLE EQUAL 0)
message("** TCP/IP benchmarks. Force config.")
set(EN_HLS 0)
set(EN_STRM 1)
set(EN_DDR 0)
set(EN_HBM 0)
# set(EN_DDR 0)
# set(EN_HBM 0)
set(EN_TCP_0 1)
add_subdirectory(hdl/operators/examples/tcp_bench/hls)
elseif(EXAMPLE STREQUAL "pr_scheduling")

View File

@ -86,10 +86,10 @@ localparam ddrPortNetworkTx = 0;
generate
// Hash Table signals
metaIntf #(.STYPE(logic[72-1:0])) axis_ht_lup_req();
metaIntf #(.STYPE(logic[88-1:0])) axis_ht_lup_rsp();
metaIntf #(.STYPE(logic[88-1:0])) axis_ht_upd_req();
metaIntf #(.STYPE(logic[88-1:0])) axis_ht_upd_rsp();
metaIntf #(.STYPE(logic[96-1:0])) axis_ht_lup_req();
metaIntf #(.STYPE(logic[120-1:0])) axis_ht_lup_rsp();
metaIntf #(.STYPE(logic[144-1:0])) axis_ht_upd_req();
metaIntf #(.STYPE(logic[152-1:0])) axis_ht_upd_rsp();
// Signals for registering
AXI4S #(.AXI4S_DATA_BITS(AXI_NET_BITS)) axis_rxwrite_data();

View File

@ -0,0 +1,311 @@
/*
* Copyright (c) 2019, Systems Group, ETH Zurich
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "axi_utils.hpp"
ap_uint<64> lenToKeep(ap_uint<6> length)
{
switch (length)
{
case 1:
return 0x01;
case 2:
return 0x03;
case 3:
return 0x07;
case 4:
return 0x0F;
case 5:
return 0x1F;
case 6:
return 0x3F;
case 7:
return 0x7F;
case 8:
return 0xFF;
case 9:
return 0x01FF;
case 10:
return 0x03FF;
case 11:
return 0x07FF;
case 12:
return 0x0FFF;
case 13:
return 0x1FFF;
case 14:
return 0x3FFF;
case 15:
return 0x7FFF;
case 16:
return 0xFFFF;
case 17:
return 0x01FFFF;
case 18:
return 0x03FFFF;
case 19:
return 0x07FFFF;
case 20:
return 0x0FFFFF;
case 21:
return 0x1FFFFF;
case 22:
return 0x3FFFFF;
case 23:
return 0x7FFFFF;
case 24:
return 0xFFFFFF;
case 25:
return 0x01FFFFFF;
case 26:
return 0x03FFFFFF;
case 27:
return 0x07FFFFFF;
case 28:
return 0x0FFFFFFF;
case 29:
return 0x1FFFFFFF;
case 30:
return 0x3FFFFFFF;
case 31:
return 0x7FFFFFFF;
case 32:
return 0xFFFFFFFF;
case 33:
return 0x01FFFFFFFF;
case 34:
return 0x03FFFFFFFF;
case 35:
return 0x07FFFFFFFF;
case 36:
return 0x0FFFFFFFFF;
case 37:
return 0x1FFFFFFFFF;
case 38:
return 0x3FFFFFFFFF;
case 39:
return 0x7FFFFFFFFF;
case 40:
return 0xFFFFFFFFFF;
case 41:
return 0x01FFFFFFFFFF;
case 42:
return 0x03FFFFFFFFFF;
case 43:
return 0x07FFFFFFFFFF;
case 44:
return 0x0FFFFFFFFFFF;
case 45:
return 0x1FFFFFFFFFFF;
case 46:
return 0x3FFFFFFFFFFF;
case 47:
return 0x7FFFFFFFFFFF;
case 48:
return 0xFFFFFFFFFFFF;
case 49:
return 0x01FFFFFFFFFFFF;
case 50:
return 0x03FFFFFFFFFFFF;
case 51:
return 0x07FFFFFFFFFFFF;
case 52:
return 0x0FFFFFFFFFFFFF;
case 53:
return 0x1FFFFFFFFFFFFF;
case 54:
return 0x3FFFFFFFFFFFFF;
case 55:
return 0x7FFFFFFFFFFFFF;
case 56:
return 0xFFFFFFFFFFFFFF;
case 57:
return 0x01FFFFFFFFFFFFFF;
case 58:
return 0x03FFFFFFFFFFFFFF;
case 59:
return 0x07FFFFFFFFFFFFFF;
case 60:
return 0x0FFFFFFFFFFFFFFF;
case 61:
return 0x1FFFFFFFFFFFFFFF;
case 62:
return 0x3FFFFFFFFFFFFFFF;
case 63:
return 0x7FFFFFFFFFFFFFFF;
default:
return 0xFFFFFFFFFFFFFFFF;
}//switch
}
//Input argument cannot be templatized, otherwise the case statement leads to duplicate definitions
ap_uint<8> keepToLen(ap_uint<64> keepValue)
{
#pragma HLS INLINE
switch (keepValue)
{
case 0x01:
return 0x1;
case 0x3:
return 0x2;
case 0x07:
return 0x3;
case 0x0F:
return 0x4;
case 0x1F:
return 0x5;
case 0x3F:
return 0x6;
case 0x7F:
return 0x7;
case 0xFF:
return 0x8;
//#if W > 64
case 0x01FF:
return 0x9;
case 0x3FF:
return 0xA;
case 0x07FF:
return 0xB;
case 0x0FFF:
return 0xC;
case 0x1FFF:
return 0xD;
case 0x3FFF:
return 0xE;
case 0x7FFF:
return 0xF;
case 0xFFFF:
return 0x10;
//#if W > 128
case 0x01FFFF:
return 0x11;
case 0x3FFFF:
return 0x12;
case 0x07FFFF:
return 0x13;
case 0x0FFFFF:
return 0x14;
case 0x1FFFFF:
return 0x15;
case 0x3FFFFF:
return 0x16;
case 0x7FFFFF:
return 0x17;
case 0xFFFFFF:
return 0x18;
case 0x01FFFFFF:
return 0x19;
case 0x3FFFFFF:
return 0x1A;
case 0x07FFFFFF:
return 0x1B;
case 0x0FFFFFFF:
return 0x1C;
case 0x1FFFFFFF:
return 0x1D;
case 0x3FFFFFFF:
return 0x1E;
case 0x7FFFFFFF:
return 0x1F;
case 0xFFFFFFFF:
return 0x20;
//#if W > 256
case 0x01FFFFFFFF:
return 0x21;
case 0x3FFFFFFFF:
return 0x22;
case 0x07FFFFFFFF:
return 0x23;
case 0x0FFFFFFFFF:
return 0x24;
case 0x1FFFFFFFFF:
return 0x25;
case 0x3FFFFFFFFF:
return 0x26;
case 0x7FFFFFFFFF:
return 0x27;
case 0xFFFFFFFFFF:
return 0x28;
case 0x01FFFFFFFFFF:
return 0x29;
case 0x3FFFFFFFFFF:
return 0x2A;
case 0x07FFFFFFFFFF:
return 0x2B;
case 0x0FFFFFFFFFFF:
return 0x2C;
case 0x1FFFFFFFFFFF:
return 0x2D;
case 0x3FFFFFFFFFFF:
return 0x2E;
case 0x7FFFFFFFFFFF:
return 0x2F;
case 0xFFFFFFFFFFFF:
return 0x30;
case 0x01FFFFFFFFFFFF:
return 0x31;
case 0x3FFFFFFFFFFFF:
return 0x32;
case 0x07FFFFFFFFFFFF:
return 0x33;
case 0x0FFFFFFFFFFFFF:
return 0x34;
case 0x1FFFFFFFFFFFFF:
return 0x35;
case 0x3FFFFFFFFFFFFF:
return 0x36;
case 0x7FFFFFFFFFFFFF:
return 0x37;
case 0xFFFFFFFFFFFFFF:
return 0x38;
case 0x01FFFFFFFFFFFFFF:
return 0x39;
case 0x3FFFFFFFFFFFFFF:
return 0x3A;
case 0x07FFFFFFFFFFFFFF:
return 0x3B;
case 0x0FFFFFFFFFFFFFFF:
return 0x3C;
case 0x1FFFFFFFFFFFFFFF:
return 0x3D;
case 0x3FFFFFFFFFFFFFFF:
return 0x3E;
case 0x7FFFFFFFFFFFFFFF:
return 0x3F;
case 0xFFFFFFFFFFFFFFFF:
return 0x40;
default:
return 0xFF;
//#endif
//#endif
//#endif
}
}

File diff suppressed because it is too large Load Diff

View File

@ -155,7 +155,8 @@ public:
void clear()
{
#pragma HLS pipeline II=1
//#pragma HLS pipeline II=1
#pragma HLS INLINE
//header = 0;
ready = false;
idx = 0;

View File

@ -29,6 +29,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "send_recv_config.hpp"
#include "send_recv.hpp"
#include <iostream>
#if defined( __VITIS_HLS__)
#include "ap_axi_sdata.h"
#endif
//Buffers responses coming from the TCP stack
void status_handler(hls::stream<appTxRsp>& txStatus,
@ -286,7 +289,102 @@ void server( hls::stream<ap_uint<16> >& listenPort,
}
#if defined( __VITIS_HLS__)
void send_recv( hls::stream<ap_uint<16> >& listenPort,
hls::stream<bool>& listenPortStatus,
hls::stream<appNotification>& notifications,
hls::stream<appReadRequest>& readRequest,
hls::stream<ap_uint<16> >& rxMetaData,
hls::stream<ap_axiu<DATA_WIDTH, 0, 0, 0> >& rxData,
hls::stream<appTxMeta>& txMetaData,
hls::stream<ap_axiu<DATA_WIDTH, 0, 0, 0> >& txData,
hls::stream<appTxRsp>& txStatus,
ap_uint<32> pkgWordCount,
ap_uint<32> sessionID,
ap_uint<32> transferSize,
ap_uint<1> runTx
)
{
#pragma HLS DATAFLOW disable_start_propagation
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE axis register port=listenPort name=m_axis_listen_port
#pragma HLS INTERFACE axis register port=listenPortStatus name=s_axis_listen_port_status
#pragma HLS INTERFACE axis register port=notifications name=s_axis_notifications
#pragma HLS INTERFACE axis register port=readRequest name=m_axis_read_package
#pragma HLS aggregate compact=bit variable=notifications
#pragma HLS aggregate compact=bit variable=readRequest
#pragma HLS INTERFACE axis register port=rxMetaData name=s_axis_rx_metadata
#pragma HLS INTERFACE axis register port=rxData name=s_axis_rx_data
#pragma HLS INTERFACE axis register port=txMetaData name=m_axis_tx_metadata
#pragma HLS INTERFACE axis register port=txData name=m_axis_tx_data
#pragma HLS INTERFACE axis register port=txStatus name=s_axis_tx_status
#pragma HLS aggregate compact=bit variable=txMetaData
#pragma HLS aggregate compact=bit variable=txStatus
#pragma HLS INTERFACE ap_none register port=pkgWordCount
#pragma HLS INTERFACE ap_none register port=sessionID
#pragma HLS INTERFACE ap_none register port=transferSize
#pragma HLS INTERFACE ap_none register port=runTx
//This is required to buffer up to 1024 reponses => supporting up to 1024 connections
static hls::stream<appTxRsp> txStatusBuffer("txStatusBuffer");
#pragma HLS STREAM variable=txStatusBuffer depth=512
//This is required to buffer up to 512 tx_meta_data => supporting up to 512 connections
static hls::stream<appTxMeta> txMetaDataBuffer("txMetaDataBuffer");
#pragma HLS STREAM variable=txMetaDataBuffer depth=512
//This is required to buffer up to MAX_SESSIONS txData
static hls::stream<net_axis<DATA_WIDTH> > txDataBuffer("txDataBuffer");
#pragma HLS STREAM variable=txDataBuffer depth=512
static hls::stream<net_axis<DATA_WIDTH> > rxData_internal;
#pragma HLS STREAM depth=2 variable=rxData_internal
static hls::stream<net_axis<DATA_WIDTH> > txData_internal;
#pragma HLS STREAM depth=2 variable=txData_internal
/*
* Client
*/
status_handler(txStatus, txStatusBuffer);
txMetaData_handler(txMetaDataBuffer, txMetaData);
txDataBuffer_handler(txDataBuffer, txData_internal);
convert_axis_to_net_axis<DATA_WIDTH>(rxData,
rxData_internal);
convert_net_axis_to_axis<DATA_WIDTH>(txData_internal,
txData);
client<DATA_WIDTH>(
txMetaDataBuffer,
txDataBuffer,
txStatusBuffer,
pkgWordCount,
sessionID,
transferSize,
runTx
);
/*
* Server
*/
server<DATA_WIDTH>( listenPort,
listenPortStatus,
notifications,
readRequest,
rxMetaData,
rxData_internal);
}
#else
void send_recv( hls::stream<ap_uint<16> >& listenPort,
hls::stream<bool>& listenPortStatus,
hls::stream<appNotification>& notifications,
@ -369,3 +467,4 @@ void send_recv( hls::stream<ap_uint<16> >& listenPort,
rxData);
}
#endif

View File

@ -301,7 +301,7 @@ always @(posedge ap_clk) begin
end
if (running & successOpenCounter== 0 ) begin
openCon_cycles ++;
openCon_cycles <= openCon_cycles + 1;
end
if (m_axis_tcp_read_pkg_tvalid & m_axis_tcp_read_pkg_tready) begin
@ -328,7 +328,58 @@ always @(posedge ap_clk) begin
end
end
`ifdef VITIS_HLS
send_recv_ip send_recv (
// .m_axis_close_connection_V_V_TVALID(m_axis_tcp_close_connection_tvalid), // output wire m_axis_close_connection_TVALID
// .m_axis_close_connection_V_V_TREADY(m_axis_tcp_close_connection_tready), // input wire m_axis_close_connection_TREADY
// .m_axis_close_connection_V_V_TDATA(m_axis_tcp_close_connection_tdata), // output wire [15 : 0] m_axis_close_connection_TDATA
.m_axis_listen_port_TVALID(m_axis_tcp_listen_port_tvalid), // output wire m_axis_listen_port_TVALID
.m_axis_listen_port_TREADY(m_axis_tcp_listen_port_tready), // input wire m_axis_listen_port_TREADY
.m_axis_listen_port_TDATA(m_axis_tcp_listen_port_tdata), // output wire [15 : 0] m_axis_listen_port_TDATA
// .m_axis_open_connection_V_TVALID(m_axis_tcp_open_connection_tvalid), // output wire m_axis_open_connection_TVALID
// .m_axis_open_connection_V_TREADY(m_axis_tcp_open_connection_tready), // input wire m_axis_open_connection_TREADY
// .m_axis_open_connection_V_TDATA(m_axis_tcp_open_connection_tdata), // output wire [47 : 0] m_axis_open_connection_TDATA
.m_axis_read_package_TVALID(m_axis_tcp_read_pkg_tvalid), // output wire m_axis_read_package_TVALID
.m_axis_read_package_TREADY(m_axis_tcp_read_pkg_tready), // input wire m_axis_read_package_TREADY
.m_axis_read_package_TDATA(m_axis_tcp_read_pkg_tdata), // output wire [31 : 0] m_axis_read_package_TDATA
.m_axis_tx_data_TVALID(m_axis_tcp_tx_data_tvalid), // output wire m_axis_tx_data_TVALID
.m_axis_tx_data_TREADY(m_axis_tcp_tx_data_tready), // input wire m_axis_tx_data_TREADY
.m_axis_tx_data_TDATA(m_axis_tcp_tx_data_tdata), // output wire [63 : 0] m_axis_tx_data_TDATA
.m_axis_tx_data_TKEEP(m_axis_tcp_tx_data_tkeep), // output wire [7 : 0] m_axis_tx_data_TKEEP
.m_axis_tx_data_TLAST(m_axis_tcp_tx_data_tlast), // output wire [0 : 0] m_axis_tx_data_TLAST
.m_axis_tx_metadata_TVALID(m_axis_tcp_tx_meta_tvalid), // output wire m_axis_tx_metadata_TVALID
.m_axis_tx_metadata_TREADY(m_axis_tcp_tx_meta_tready), // input wire m_axis_tx_metadata_TREADY
.m_axis_tx_metadata_TDATA(m_axis_tcp_tx_meta_tdata), // output wire [15 : 0] m_axis_tx_metadata_TDATA
.s_axis_listen_port_status_TVALID(s_axis_tcp_port_status_tvalid), // input wire s_axis_listen_port_status_TVALID
.s_axis_listen_port_status_TREADY(s_axis_tcp_port_status_tready), // output wire s_axis_listen_port_status_TREADY
.s_axis_listen_port_status_TDATA(s_axis_tcp_port_status_tdata), // input wire [7 : 0] s_axis_listen_port_status_TDATA
.s_axis_notifications_TVALID(s_axis_tcp_notification_tvalid), // input wire s_axis_notifications_TVALID
.s_axis_notifications_TREADY(s_axis_tcp_notification_tready), // output wire s_axis_notifications_TREADY
.s_axis_notifications_TDATA(s_axis_tcp_notification_tdata), // input wire [87 : 0] s_axis_notifications_TDATA
// .s_axis_open_status_TVALID(s_axis_tcp_open_status_tvalid), // input wire s_axis_open_status_TVALID
// .s_axis_open_status_TREADY(s_axis_tcp_open_status_tready), // output wire s_axis_open_status_TREADY
// .s_axis_open_status_TDATA(s_axis_tcp_open_status_tdata), // input wire [23 : 0] s_axis_open_status_TDATA
.s_axis_rx_data_TVALID(s_axis_tcp_rx_data_tvalid), // input wire s_axis_rx_data_TVALID
.s_axis_rx_data_TREADY(s_axis_tcp_rx_data_tready), // output wire s_axis_rx_data_TREADY
.s_axis_rx_data_TDATA(s_axis_tcp_rx_data_tdata), // input wire [63 : 0] s_axis_rx_data_TDATA
.s_axis_rx_data_TKEEP(s_axis_tcp_rx_data_tkeep), // input wire [7 : 0] s_axis_rx_data_TKEEP
.s_axis_rx_data_TLAST(s_axis_tcp_rx_data_tlast), // input wire [0 : 0] s_axis_rx_data_TLAST
.s_axis_rx_metadata_TVALID(s_axis_tcp_rx_meta_tvalid), // input wire s_axis_rx_metadata_TVALID
.s_axis_rx_metadata_TREADY(s_axis_tcp_rx_meta_tready), // output wire s_axis_rx_metadata_TREADY
.s_axis_rx_metadata_TDATA(s_axis_tcp_rx_meta_tdata), // input wire [15 : 0] s_axis_rx_metadata_TDATA
.s_axis_tx_status_TVALID(s_axis_tcp_tx_status_tvalid), // input wire s_axis_tx_status_TVALID
.s_axis_tx_status_TREADY(s_axis_tcp_tx_status_tready), // output wire s_axis_tx_status_TREADY
.s_axis_tx_status_TDATA(s_axis_tcp_tx_status_tdata), // input wire [23 : 0] s_axis_tx_status_TDATA
//Client only
.runTx(runTx),
.transferSize(transferSize), // input wire [0 : 0] transferSize_V
.sessionID(sessionID), // input wire [7 : 0] sessionID_V
.pkgWordCount(pkgWordCountReg), // input wire [7 : 0] pkgWordCount_V
.ap_clk(ap_clk), // input wire aclk
.ap_rst_n(ap_rst_n) // input wire aresetn
);
`else
send_recv_ip send_recv (
// .m_axis_close_connection_V_V_TVALID(m_axis_tcp_close_connection_tvalid), // output wire m_axis_close_connection_TVALID
// .m_axis_close_connection_V_V_TREADY(m_axis_tcp_close_connection_tready), // input wire m_axis_close_connection_TREADY
@ -379,7 +430,7 @@ send_recv_ip send_recv (
.ap_clk(ap_clk), // input wire aclk
.ap_rst_n(ap_rst_n) // input wire aresetn
);
`endif
/*
* Role Controller
@ -504,7 +555,7 @@ end
`define DEBUG
`ifdef DEBUG
/*
ila_controller controller_debug
(
.clk(ap_clk), // input wire clk
@ -520,8 +571,8 @@ ila_controller controller_debug
.probe9(ap_start), //1
.probe10(ap_done) //1
);
*/
/*
ila_perf benchmark_debug (
.clk(ap_clk), // input wire clk
@ -570,7 +621,7 @@ ila_perf benchmark_debug (
.probe41(tx_status_down), //32
.probe42(tx_data_down) //32
);
*/
`endif

View File

@ -53,7 +53,8 @@ int main(int argc, char *argv[])
boost::program_options::notify(commandLineArgs);
// Stat
uint32_t ip = 0xC0A802C9;
uint32_t local_ip = 0x0A01D497;
uint32_t target_ip = 0x0A01D498;
uint64_t useConn = 1;
uint64_t useIpAddr = 1;
uint64_t port = 5001;
@ -76,17 +77,22 @@ int main(int argc, char *argv[])
timeInCycles = timeInSeconds * freq * 1000000;
if (server == 1) {
ip = 0xC0A802CA;
local_ip = 0x0A01D498;
target_ip = 0x0A01D497;
}
printf("usecon:%ld, useIP:%ld, pkgWordCount:%ld,port:%ld, ip:%x,time:%ld, is server:%ld, transferBytes:%ld\n", useConn, useIpAddr, pkgWordCount, port, ip, timeInCycles, server, transferBytes);
printf("usecon:%ld, useIP:%ld, pkgWordCount:%ld,port:%ld, local ip:%x, target ip:%x, time:%ld, is server:%ld, transferBytes:%ld\n", useConn, useIpAddr, pkgWordCount, port, local_ip, target_ip, timeInCycles, server, transferBytes);
// FPGA handles
cProc cproc(targetRegion, getpid());
cproc.changeIpAddress(local_ip);
cproc.changeBoardNumber(server);
// ARP lookup
cproc.doArpLookup();
// cproc.doArpLookup();
/* -- Register map -----------------------------------------------------------------------
/ 0 (WO) : Control
@ -110,7 +116,7 @@ int main(int argc, char *argv[])
cproc.setCSR(useIpAddr, 3);
cproc.setCSR(pkgWordCount, 4);
cproc.setCSR(port, 5);
cproc.setCSR(ip, 6);
cproc.setCSR(target_ip, 6);
cproc.setCSR(transferBytes, 7);
cproc.setCSR(server, 8);
cproc.setCSR(timeInSeconds, 9);
@ -123,6 +129,7 @@ int main(int argc, char *argv[])
//Probe the done signal
while (cproc.getCSR(1) != 1) {}
// std::this_thread::sleep_for(1s);
auto end = std::chrono::high_resolution_clock::now();
double durationUs = 0.0;
@ -141,6 +148,10 @@ int main(int argc, char *argv[])
cout << "throughput [gbps]: " << throughput << " latency[us]: " << latency << endl;
}
// Print net stats
cproc.printDebug();
cproc.printNetDebug();
return EXIT_SUCCESS;
}