// Copyright (2019-2023) Paul Scherrer Institute #include "hls_jfjoch.h" #include "ip_header_checksum.h" void generate_packet(STREAM_512 &data_out, ap_uint<256> *d_hbm_p0, ap_uint<256> *d_hbm_p1, ap_uint<32> hbm_size_bytes, ap_uint<32> frame, ap_uint<8> module, ap_uint<7> eth_packet, ap_uint<48> src_mac_addr, ap_uint<48> dest_mac_addr, ap_uint<32> src_ipv4_addr, ap_uint<32> dest_ipv4_addr, ap_uint<64> bunchid, ap_uint<32> exptime, ap_uint<64> timestamp, ap_uint<32> debug) { #pragma HLS PIPELINE II=130 ap_uint<720> header = 0; header(47 , 0) = dest_mac_addr; header(95 , 48) = src_mac_addr; header(111, 96) = 0x0008; // ETHER_IP = IPv4 header(eth_payload_pos+3 , eth_payload_pos ) = 0x5; // header len of 5 header(eth_payload_pos+7 , eth_payload_pos+4 ) = 0x4; // IPv4 header(eth_payload_pos+31 , eth_payload_pos+16 ) = 0x4C20; // total length = 8268 header(eth_payload_pos+79 , eth_payload_pos+72 ) = PROTOCOL_UDP; // UDP header(eth_payload_pos+127, eth_payload_pos+96 ) = src_ipv4_addr; header(eth_payload_pos+159, eth_payload_pos+128) = dest_ipv4_addr; header(eth_payload_pos+95 , eth_payload_pos+80 ) = computeCheckSum20B(header(eth_payload_pos + 159, eth_payload_pos)); header(ipv4_payload_pos+47, ipv4_payload_pos+32) = 0x3820; // UDP length = 8248 header(udp_payload_pos+63, udp_payload_pos) = frame + 1; header(udp_payload_pos+95, udp_payload_pos+64) = exptime; header(udp_payload_pos+127, udp_payload_pos+96) = eth_packet; header(udp_payload_pos+2*64+63, udp_payload_pos+2*64) = bunchid; header(udp_payload_pos+3*64+63, udp_payload_pos+3*64) = timestamp; header(udp_payload_pos+4*64+31, udp_payload_pos+4*64+16) = 2 * module; header(udp_payload_pos+5*64+31, udp_payload_pos+5*64) = debug; packet_512_t packet; packet.data = header(511 ,0); packet.last = 0; packet.dest = 0; packet.id = 0; packet.strb = UINT64_MAX; packet.keep = UINT64_MAX; packet.user = 0; data_out << packet; ap_uint<32> offset_hbm_0 = 20 * hbm_size_bytes / 32; ap_uint<32> offset_hbm_1 = 21 * hbm_size_bytes / 32; ap_uint<208> remainder = header(719, 512); for (int i = 0; i < 128; i++) { ap_uint<512> tmp; tmp(255, 0) = d_hbm_p0[offset_hbm_0 + (module % FRAME_GENERATOR_MODULES) * 128 * 128 + eth_packet * 128 + i]; tmp(511, 256) = d_hbm_p1[offset_hbm_1 + (module % FRAME_GENERATOR_MODULES) * 128 * 128 + eth_packet * 128 + i]; packet.data(207, 0) = remainder; packet.data(511, 208) = tmp(303, 0); data_out << packet; remainder = tmp(511, 304); } packet.data(207, 0) = remainder; packet.data(511, 208) = 0; packet.keep(63, 26) = 0; packet.last = 1; data_out << packet; } void frame_generator(STREAM_512 &data_out, ap_uint<256> *d_hbm_p0, ap_uint<256> *d_hbm_p1, ap_uint<32> hbm_size_bytes, ap_uint<32> frames, ap_uint<5> modules, ap_uint<48> src_mac_addr, ap_uint<48> dest_mac_addr, ap_uint<32> src_ipv4_addr, ap_uint<32> dest_ipv4_addr, ap_uint<64> bunchid, ap_uint<32> exptime, ap_uint<32> debug) { #pragma HLS INTERFACE mode=s_axilite port=return #pragma HLS INTERFACE mode=s_axilite port=frames #pragma HLS INTERFACE mode=s_axilite port=modules #pragma HLS INTERFACE mode=s_axilite port=bunchid #pragma HLS INTERFACE mode=s_axilite port=exptime #pragma HLS INTERFACE mode=s_axilite port=debug #pragma HLS INTERFACE mode=s_axilite port=dest_mac_addr #pragma HLS INTERFACE mode=s_axilite port=dest_ipv4_addr #pragma HLS INTERFACE mode=ap_none port=src_mac_addr #pragma HLS INTERFACE mode=ap_none port=src_ipv4_addr #pragma HLS INTERFACE register ap_none port=hbm_size_bytes #pragma HLS INTERFACE m_axi port=d_hbm_p0 bundle=d_hbm_p0 depth=512 offset=off \ max_read_burst_length=16 max_write_burst_length=2 latency=120 num_write_outstanding=2 num_read_outstanding=9 #pragma HLS INTERFACE m_axi port=d_hbm_p1 bundle=d_hbm_p1 depth=512 offset=off \ max_read_burst_length=16 max_write_burst_length=2 latency=120 num_write_outstanding=2 num_read_outstanding=9 #pragma HLS INTERFACE register both axis port=data_out for (uint32_t f = 0; f < frames; f++) { for (uint32_t p = 0; p < 128; p++) { for (uint32_t m = 0; m < modules; m++) { generate_packet(data_out, d_hbm_p0, d_hbm_p1, hbm_size_bytes, f, m, p, src_mac_addr, dest_mac_addr, src_ipv4_addr, dest_ipv4_addr, bunchid + f, exptime, exptime * f, debug); } } } }