Skip to content

Commit

Permalink
fixed dual port bug
Browse files Browse the repository at this point in the history
  • Loading branch information
surangamh committed Mar 16, 2023
1 parent 507f7e4 commit 0cc71e4
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 179 deletions.
8 changes: 4 additions & 4 deletions config_files/connectivity_if3.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ slr=cmac_0:SLR2
slr=cmac_1:SLR2
slr=networklayer_0:SLR2
slr=networklayer_1:SLR2
slr=txkrnl_0:SLR2
slr=txkrnl_1:SLR2
slr=rxkrnl_0:SLR2
slr=rxkrnl_1:SLR2
slr=txkrnl_0:SLR1
slr=txkrnl_1:SLR0
slr=rxkrnl_0:SLR1
slr=rxkrnl_1:SLR0

#Connect Network Layer to CMAC DO NOT CHANGE
stream_connect=cmac_0.M_AXIS:networklayer_0.S_AXIS_eth2nl
Expand Down
173 changes: 86 additions & 87 deletions host/host_receiver_if3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,18 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define MY_IP_ADDR1 0xC0A80104
#define THEIR_IP_ADDR1 0xC0A80103
#define IP_GATEWAY 0xC0A801FF
#define ARP_DISCOVERY 0x3010
#define ARP_IP_ADDR_OFFSET 0x3400
#define ARP_MAC_ADDR_OFFSET 0x3800
#define ARP_VALID_OFFSET 0x3100
#define ARP_DISCOVERY 0x1010
#define ARP_IP_ADDR_OFFSET 0x1400
#define ARP_MAC_ADDR_OFFSET 0x1800
#define ARP_VALID_OFFSET 0x1100
#define IP_ADDR_OFFSET 0x0018
#define IP_GATEWAY_OFFSET 0x001C
#define MAC_ADDR_OFFSET 0x0010
#define NUM_SOCKETS_HW 0x2210
#define UDP_OFFSET 0x2000
#define NUM_SOCKETS_HW 0x0A10
#define UDP_TI_OFFSET 0x0810
#define UDP_TP_OFFSET 0x0890
#define UDP_MP_OFFSET 0x0910
#define UDP_V_OFFSET 0x0990

typedef struct {
uint32_t theirIP;
Expand All @@ -87,14 +90,14 @@ int main(int argc, char **argv) {
cl_uint num_platforms;
cl_uint deviceCount;
cl_platform_id *platform_id;
cl_device_id device_id[2];
cl_program program[2];
cl_context context[2];
cl_device_id device_id;
cl_program program;
cl_context context;
cl_command_queue q[2];
cl_int binaryStatus;
xclDeviceHandle handle[2];
xclDeviceHandle handle;
xuid_t xclbinId;
cl_kernel nl[2];
cl_kernel nl;
cl_kernel cmac[2];
cl_kernel ul[2];
cl_uint nlidx[2];
Expand Down Expand Up @@ -152,36 +155,32 @@ int main(int argc, char **argv) {
}
// Get characteristics for each platform
for (uint i = 0; i < num_platforms; i++){
err = clGetDeviceIDs(platform_id[i], CL_DEVICE_TYPE_ALL, 1, &device_id[0], &deviceCount);
err = clGetDeviceIDs(platform_id[i], CL_DEVICE_TYPE_ALL, 1, &device_id[1], &deviceCount);
err = clGetDeviceIDs(platform_id[i], CL_DEVICE_TYPE_ALL, 1, &device_id, &deviceCount);
if (err != CL_SUCCESS) {
printf("Error: clGetDeviceIDs failed!\n");
return EXIT_FAILURE;
}
context[0] = clCreateContext(0, 1, &device_id[0], NULL, NULL, &err);
context[1] = clCreateContext(0, 1, &device_id[1], NULL, NULL, &err);
q[0] = clCreateCommandQueue(context[0], device_id[0], CL_QUEUE_PROFILING_ENABLE, &err);
q[1] = clCreateCommandQueue(context[1], device_id[1], CL_QUEUE_PROFILING_ENABLE, &err);
context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);
q[0] = clCreateCommandQueue(context, device_id, CL_QUEUE_PROFILING_ENABLE, &err);
q[1] = clCreateCommandQueue(context, device_id, CL_QUEUE_PROFILING_ENABLE, &err);

printf("Device count %d\n",deviceCount);
int size=load_file_to_memory(xclbinFilename, (char **) &kernelBinary);
printf("xclbin size: %d\n",size);
size_t size_var = size;
if (!(program[0] = clCreateProgramWithBinary(context[0], 1, &device_id[0], &size_var, (const unsigned char **) &kernelBinary, &binaryStatus, &err))) return EXIT_FAILURE;
if (!(program[1] = clCreateProgramWithBinary(context[1], 1, &device_id[1], &size_var, (const unsigned char **) &kernelBinary, &binaryStatus, &err))) return EXIT_FAILURE;
if (!(program = clCreateProgramWithBinary(context, 1, &device_id, &size_var, (const unsigned char **) &kernelBinary, &binaryStatus, &err))) return EXIT_FAILURE;

}

cmac[0] = clCreateKernel(program[0], "cmac_0", &err);
cmac[1] = clCreateKernel(program[1], "cmac_1", &err);
nl[0] = clCreateKernel(program[0], "networklayer",&err);
nl[1] = clCreateKernel(program[1], "networklayer",&err);
cmac[0] = clCreateKernel(program, "cmac_0", &err);
cmac[1] = clCreateKernel(program, "cmac_1", &err);
nl = clCreateKernel(program, "networklayer",&err);
xclGetComputeUnitInfo(cmac[0], 0, XCL_COMPUTE_UNIT_INDEX, sizeof(cmacidx[0]), &cmacidx[0], NULL);
xclGetComputeUnitInfo(cmac[1], 0, XCL_COMPUTE_UNIT_INDEX, sizeof(cmacidx[1]), &cmacidx[1], NULL);
xclGetComputeUnitInfo(nl[0], 0, XCL_COMPUTE_UNIT_INDEX, sizeof(nlidx[0]), &nlidx[0], NULL);
xclGetComputeUnitInfo(nl[1], 0, XCL_COMPUTE_UNIT_INDEX, sizeof(nlidx[1]), &nlidx[1], NULL);
clGetDeviceInfo(device_id[0], CL_DEVICE_HANDLE, sizeof(handle[0]), &handle[0], NULL);
clGetDeviceInfo(device_id[1], CL_DEVICE_HANDLE, sizeof(handle[1]), &handle[1], NULL);
xclGetComputeUnitInfo(nl, 0, XCL_COMPUTE_UNIT_INDEX, sizeof(nlidx[0]), &nlidx[0], NULL);
xclGetComputeUnitInfo(nl, 1, XCL_COMPUTE_UNIT_INDEX, sizeof(nlidx[1]), &nlidx[1], NULL);
clGetDeviceInfo(device_id, CL_DEVICE_HANDLE, sizeof(handle), &handle, NULL);
clGetDeviceInfo(device_id, CL_DEVICE_HANDLE, sizeof(handle), &handle, NULL);

std::ifstream bin_file(xclbinFilename, std::ifstream::binary);
bin_file.seekg (0, bin_file.end);
Expand All @@ -201,15 +200,15 @@ int main(int argc, char **argv) {
* ############################################################
*/

xclOpenContext(handle[0], xclbinId, nlidx[0], false);
xclOpenContext(handle, xclbinId, nlidx[0], false);

unsigned int my_ip_address0 = argc>=7 ? (unsigned int)strtol(argv[6], NULL, 16) : (unsigned int)MY_IP_ADDR0;
unsigned int their_ip_address0 = argc>=9 ? (unsigned int)strtol(argv[8], NULL, 16) : (unsigned int)THEIR_IP_ADDR0;
long mac_address0 = (0xf0f1f2f3f4f5 & 0xFFFFFFFFFF0) + (my_ip_address0 & 0xF);
xclRegWrite(handle[0], nlidx[0], MAC_ADDR_OFFSET, mac_address0);
xclRegWrite(handle[0], nlidx[0], MAC_ADDR_OFFSET + 4, mac_address0 >> 32);
xclRegWrite(handle[0], nlidx[0], IP_ADDR_OFFSET, my_ip_address0);
xclRegWrite(handle[0], nlidx[0], IP_GATEWAY_OFFSET, ip_gateway);
xclRegWrite(handle, nlidx[0], MAC_ADDR_OFFSET, mac_address0);
xclRegWrite(handle, nlidx[0], MAC_ADDR_OFFSET + 4, mac_address0 >> 32);
xclRegWrite(handle, nlidx[0], IP_ADDR_OFFSET, my_ip_address0);
xclRegWrite(handle, nlidx[0], IP_GATEWAY_OFFSET, ip_gateway);

sockets[0][0].theirIP = their_ip_address0;
sockets[0][0].theirPort = 50000;
Expand All @@ -221,54 +220,54 @@ int main(int argc, char **argv) {
printf("Their IP address 0: %x\n", their_ip_address0);
printf("My MAC address 0: %lx\n", mac_address0);

xclRegRead(handle[0], nlidx[0], NUM_SOCKETS_HW, &num_sockets_hw);
xclRegRead(handle, nlidx[0], NUM_SOCKETS_HW, &num_sockets_hw);
printf("Number of sockets HW: %d\n", num_sockets_hw);

if (num_sockets_hw != num_sockets_sw) {
printf("HW Socket list for device [0] should be [%d], is [%d]\n", num_sockets_sw, num_sockets_hw);
fflush(stdout);
xclCloseContext(handle[0], xclbinId, nlidx[0]);
xclCloseContext(handle, xclbinId, nlidx[0]);
return 1;
}
for (unsigned int i = 0; i < num_sockets_hw; i++) {
uint32_t TI_OFFSET = 0x10 + i * 8;
uint32_t TP_OFFSET = TI_OFFSET + 16 * 8;
uint32_t MP_OFFSET = TI_OFFSET + 16 * 8 * 2;
uint32_t V_OFFSET = TI_OFFSET + 16 * 8 * 3;

xclRegWrite(handle[0], nlidx[0], UDP_OFFSET + TI_OFFSET, sockets[i][0].theirIP);
xclRegWrite(handle[0], nlidx[0], UDP_OFFSET + TP_OFFSET, sockets[i][0].theirPort);
xclRegWrite(handle[0], nlidx[0], UDP_OFFSET + MP_OFFSET, sockets[i][0].myPort);
xclRegWrite(handle[0], nlidx[0], UDP_OFFSET + V_OFFSET, sockets[i][0].valid);
uint32_t TI_OFFSET = UDP_TI_OFFSET + i * 8;
uint32_t TP_OFFSET = UDP_TP_OFFSET + i * 8;
uint32_t MP_OFFSET = UDP_MP_OFFSET + i * 8;
uint32_t V_OFFSET = UDP_V_OFFSET + i * 8;

xclRegWrite(handle, nlidx[0], TI_OFFSET, sockets[i][0].theirIP);
xclRegWrite(handle, nlidx[0], TP_OFFSET, sockets[i][0].theirPort);
xclRegWrite(handle, nlidx[0], MP_OFFSET, sockets[i][0].myPort);
xclRegWrite(handle, nlidx[0], V_OFFSET, sockets[i][0].valid);
}

for(int i = 0; i < 256; i++) {
xclRegWrite(handle[0], nlidx[0], ARP_VALID_OFFSET + (i / 4) * 4, 0);
xclRegWrite(handle, nlidx[0], ARP_VALID_OFFSET + (i / 4) * 4, 0);
}

xclRegWrite(handle[0], nlidx[0], ARP_DISCOVERY, 0);
xclRegWrite(handle[0], nlidx[0], ARP_DISCOVERY, 1);
xclRegWrite(handle[0], nlidx[0], ARP_DISCOVERY, 0);
xclRegWrite(handle, nlidx[0], ARP_DISCOVERY, 0);
xclRegWrite(handle, nlidx[0], ARP_DISCOVERY, 1);
xclRegWrite(handle, nlidx[0], ARP_DISCOVERY, 0);

//ARP
for (int i = 0; i < 256; i++) {
unsigned valid_entry;
xclRegRead(handle[0], nlidx[0], ARP_VALID_OFFSET + (i / 4) * 4, &valid_entry);
xclRegRead(handle, nlidx[0], ARP_VALID_OFFSET + (i / 4) * 4, &valid_entry);
valid_entry = (valid_entry >> ((i % 4) * 8)) & 0x1;
if (valid_entry){
printf("Device 0: ARP valid entry found at %d\n", i);
}
}

xclCloseContext(handle[0], xclbinId, nlidx[0]);
xclOpenContext(handle[0], xclbinId, cmacidx[0], false);
xclCloseContext(handle, xclbinId, nlidx[0]);
xclOpenContext(handle, xclbinId, cmacidx[0], false);
unsigned tx_status0 = 0;
unsigned rx_status0 = 0;
xclRegRead(handle[0], cmacidx[0], 0x0200, &tx_status0);
xclRegRead(handle[0], cmacidx[0], 0x0200, &tx_status0);
xclRegRead(handle[0], cmacidx[0], 0x0204, &rx_status0);
xclRegRead(handle[0], cmacidx[0], 0x0204, &rx_status0);
xclCloseContext(handle[0], xclbinId, cmacidx[0]);
xclRegRead(handle, cmacidx[0], 0x0200, &tx_status0);
xclRegRead(handle, cmacidx[0], 0x0200, &tx_status0);
xclRegRead(handle, cmacidx[0], 0x0204, &rx_status0);
xclRegRead(handle, cmacidx[0], 0x0204, &rx_status0);
xclCloseContext(handle, xclbinId, cmacidx[0]);
printf("Device 0: TX status %d\n", tx_status0);
printf("Device 0: RX status %d\n", rx_status0);

Expand All @@ -286,15 +285,15 @@ int main(int argc, char **argv) {
* ############################################################
*/

xclOpenContext(handle[1], xclbinId, nlidx[1], false);
xclOpenContext(handle, xclbinId, nlidx[1], false);

unsigned int my_ip_address1 = argc>=8 ? (unsigned int)strtol(argv[7], NULL, 16) : (unsigned int)MY_IP_ADDR1;
unsigned int their_ip_address1 = argc>=10 ? (unsigned int)strtol(argv[9], NULL, 16) : (unsigned int)THEIR_IP_ADDR1;
long mac_address1 = (0xf0f1f2f3f4f5 & 0xFFFFFFFFFF0) + (my_ip_address1 & 0xF);
xclRegWrite(handle[1], nlidx[1], MAC_ADDR_OFFSET, mac_address1);
xclRegWrite(handle[1], nlidx[1], MAC_ADDR_OFFSET + 4, mac_address1 >> 32);
xclRegWrite(handle[1], nlidx[1], IP_ADDR_OFFSET, my_ip_address1);
xclRegWrite(handle[1], nlidx[1], IP_GATEWAY_OFFSET, ip_gateway);
xclRegWrite(handle, nlidx[1], MAC_ADDR_OFFSET, mac_address1);
xclRegWrite(handle, nlidx[1], MAC_ADDR_OFFSET + 4, mac_address1 >> 32);
xclRegWrite(handle, nlidx[1], IP_ADDR_OFFSET, my_ip_address1);
xclRegWrite(handle, nlidx[1], IP_GATEWAY_OFFSET, ip_gateway);

sockets[0][1].theirIP = their_ip_address1;
sockets[0][1].theirPort = 50000;
Expand All @@ -306,54 +305,54 @@ int main(int argc, char **argv) {
printf("Their IP address 1: %x\n", their_ip_address1);
printf("My MAC address 1: %lx\n", mac_address1);

xclRegRead(handle[1], nlidx[1], NUM_SOCKETS_HW, &num_sockets_hw);
xclRegRead(handle, nlidx[1], NUM_SOCKETS_HW, &num_sockets_hw);
printf("Number of sockets HW: %d\n", num_sockets_hw);

if (num_sockets_hw != num_sockets_sw) {
printf("HW Socket list for device [0] should be [%d], is [%d]\n", num_sockets_sw, num_sockets_hw);
fflush(stdout);
xclCloseContext(handle[1], xclbinId, nlidx[1]);
xclCloseContext(handle, xclbinId, nlidx[1]);
return 1;
}
for (unsigned int i = 0; i < num_sockets_hw; i++) {
uint32_t TI_OFFSET = 0x10 + i * 8;
uint32_t TP_OFFSET = TI_OFFSET + 16 * 8;
uint32_t MP_OFFSET = TI_OFFSET + 16 * 8 * 2;
uint32_t V_OFFSET = TI_OFFSET + 16 * 8 * 3;

xclRegWrite(handle[1], nlidx[1], UDP_OFFSET + TI_OFFSET, sockets[i][1].theirIP);
xclRegWrite(handle[1], nlidx[1], UDP_OFFSET + TP_OFFSET, sockets[i][1].theirPort);
xclRegWrite(handle[1], nlidx[1], UDP_OFFSET + MP_OFFSET, sockets[i][1].myPort);
xclRegWrite(handle[1], nlidx[1], UDP_OFFSET + V_OFFSET, sockets[i][1].valid);
uint32_t TI_OFFSET = UDP_TI_OFFSET + i * 8;
uint32_t TP_OFFSET = UDP_TP_OFFSET + i * 8;
uint32_t MP_OFFSET = UDP_MP_OFFSET + i * 8;
uint32_t V_OFFSET = UDP_V_OFFSET + i * 8;

xclRegWrite(handle, nlidx[1], TI_OFFSET, sockets[i][1].theirIP);
xclRegWrite(handle, nlidx[1], TP_OFFSET, sockets[i][1].theirPort);
xclRegWrite(handle, nlidx[1], MP_OFFSET, sockets[i][1].myPort);
xclRegWrite(handle, nlidx[1], V_OFFSET, sockets[i][1].valid);
}

for(int i = 0; i < 256; i++) {
xclRegWrite(handle[1], nlidx[1], ARP_VALID_OFFSET + (i / 4) * 4, 0);
xclRegWrite(handle, nlidx[1], ARP_VALID_OFFSET + (i / 4) * 4, 0);
}

xclRegWrite(handle[1], nlidx[1], ARP_DISCOVERY, 0);
xclRegWrite(handle[1], nlidx[1], ARP_DISCOVERY, 1);
xclRegWrite(handle[1], nlidx[1], ARP_DISCOVERY, 0);
xclRegWrite(handle, nlidx[1], ARP_DISCOVERY, 0);
xclRegWrite(handle, nlidx[1], ARP_DISCOVERY, 1);
xclRegWrite(handle, nlidx[1], ARP_DISCOVERY, 0);

//ARP
for (int i = 0; i < 256; i++) {
unsigned valid_entry;
xclRegRead(handle[1], nlidx[1], ARP_VALID_OFFSET + (i / 4) * 4, &valid_entry);
xclRegRead(handle, nlidx[1], ARP_VALID_OFFSET + (i / 4) * 4, &valid_entry);
valid_entry = (valid_entry >> ((i % 4) * 8)) & 0x1;
if (valid_entry){
printf("Device 1: ARP valid entry found at %d\n", i);
}
}

xclCloseContext(handle[1], xclbinId, nlidx[1]);
xclOpenContext(handle[1], xclbinId, cmacidx[1], false);
xclCloseContext(handle, xclbinId, nlidx[1]);
xclOpenContext(handle, xclbinId, cmacidx[1], false);
unsigned tx_status1 = 0;
unsigned rx_status1 = 0;
xclRegRead(handle[1], cmacidx[1], 0x0200, &tx_status1);
xclRegRead(handle[1], cmacidx[1], 0x0200, &tx_status1);
xclRegRead(handle[1], cmacidx[1], 0x0204, &rx_status1);
xclRegRead(handle[1], cmacidx[1], 0x0204, &rx_status1);
xclCloseContext(handle[1], xclbinId, cmacidx[1]);
xclRegRead(handle, cmacidx[1], 0x0200, &tx_status1);
xclRegRead(handle, cmacidx[1], 0x0200, &tx_status1);
xclRegRead(handle, cmacidx[1], 0x0204, &rx_status1);
xclRegRead(handle, cmacidx[1], 0x0204, &rx_status1);
xclCloseContext(handle, xclbinId, cmacidx[1]);
printf("Device 1: TX status %d\n", tx_status1);
printf("Device 1: RX status %d\n", rx_status1);

Expand All @@ -366,9 +365,9 @@ int main(int argc, char **argv) {
}

// Device 0: User logic stuff
ul[0] = clCreateKernel(program[0], "rxkrnl", &err);
ul[0] = clCreateKernel(program, "rxkrnl:{rxkrnl_0}", &err);
auto packet_size_bytes_0 = sizeof(uint8_t) * packet_size_total_0;
buffer_packetdata0 = clCreateBuffer(context[0], CL_MEM_WRITE_ONLY, packet_size_bytes_0, NULL, &err);
buffer_packetdata0 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, packet_size_bytes_0, NULL, &err);
cl_uint pst0 = (cl_uint)packet_size_bytes_0;
clSetKernelArg(ul[0], 0, sizeof(cl_mem), &buffer_packetdata0);
clSetKernelArg(ul[0], 2, sizeof(cl_uint), &pst0);
Expand All @@ -386,9 +385,9 @@ int main(int argc, char **argv) {
printf("Device 0: Message received.\n");

// Device 1: User logic stuff
ul[1] = clCreateKernel(program[1], "rxkrnl", &err);
ul[1] = clCreateKernel(program, "rxkrnl:{rxkrnl_1}", &err);
auto packet_size_bytes_1 = sizeof(uint8_t) * packet_size_total_1;
buffer_packetdata1 = clCreateBuffer(context[1], CL_MEM_WRITE_ONLY, packet_size_bytes_1, NULL, &err);
buffer_packetdata1 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, packet_size_bytes_1, NULL, &err);
cl_uint pst1 = (cl_uint)packet_size_bytes_1;
clSetKernelArg(ul[1], 0, sizeof(cl_mem), &buffer_packetdata1);
clSetKernelArg(ul[1], 2, sizeof(cl_uint), &pst1);
Expand Down
Loading

0 comments on commit 0cc71e4

Please sign in to comment.