Files
Andrew Moch 55881469ac fpga: rfnoc: Add support for 512-bit CHDR widths
This fixes the rfnoc_null_src_sink, chdr_crossbar_nxn, and
chdr_stream_endpoint blocks so that wider CHDR widths are properly
supported. It also updates PkgChdrBfm to able to properly test these
blocks. The testbenches have been updated to test both 64 and 512-bit
widths.


Original-commit: 3af8dcaacfa4bf36dcae3bdbf0b353385b7063c6
2020-06-18 09:09:34 -05:00

150 lines
4.5 KiB
Systemverilog

//
// Copyright 2018 Ettus Research, A National Instruments Company
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: chdr_traffic_sink_sim
// Description:
// A sink for CHDR traffic. Simulation only.
// Accepts packets and computes the following metrics:
// - Data integrity errors
// - Packet latency
// - Throughput counts
// All metrics can optionally be written to a file to
// generate load-latency graphs.
`timescale 1ns/1ps
`include "sim_cvita_lib.svh"
module chdr_traffic_sink_sim #(
parameter WIDTH = 64,
parameter MTU = 5,
parameter [15:0] NODE_ID = 'd0,
parameter [15:0] NUM_NODES = 'd16,
parameter FILE_PATH = ".",
parameter FLUSH_N = 4
) (
// Clocks and resets
input clk,
input rst,
// Settings
input [63:0] current_time,
input start_stb,
input [7:0] injection_rate,
input [15:0] lines_per_pkt,
input [7:0] traffic_patt,
// CHDR master interface
input [WIDTH-1:0] s_axis_tdata,
input s_axis_tlast,
input s_axis_tvalid,
output s_axis_tready,
// Metrics
output session_active,
output [31:0] xfer_count,
output [31:0] pkt_count,
output [31:0] data_err_count,
output [31:0] route_err_count
);
// Constants
localparam integer ERR_BIT_PKT_SIZE_MISMATCH = 1;
localparam integer ERR_BIT_PKT_DATA_MISMATCH = 2;
localparam integer ERR_BIT_PKT_DEST_MISMATCH = 4;
localparam integer ERR_BIT_PKT_SEQUENCE_ERR = 8;
cvita_slave #(.DWIDTH(WIDTH)) s_chdr (.clk(clk));
cvita_pkt_t pkt;
assign s_chdr.axis.tdata = s_axis_tdata;
assign s_chdr.axis.tlast = s_axis_tlast;
assign s_chdr.axis.tvalid = s_axis_tvalid;
assign s_axis_tready = s_chdr.axis.tready;
logic running = 0;
integer num_data_errs = 0;
integer num_route_errs = 0;
logic [31:0] num_pkts_xferd = 0;
logic [31:0] num_samps_xferd = 0;
assign data_err_count = num_data_errs;
assign route_err_count = num_route_errs;
assign xfer_count = num_samps_xferd;
assign pkt_count = num_pkts_xferd;
assign session_active = running;
integer session = 0;
string filename;
integer handle = 0;
integer err = 0;
integer bus_idle_cnt = 0;
logic [WIDTH-1:0] i;
// Egress buff in source is MTU + 4
localparam integer IDLE_TIMEOUT = (1 << (MTU + 4 + FLUSH_N));
initial begin: consume_blk
// Consume infinitely
s_chdr.reset();
while (1) begin
// A session begins on the posedge of start_stb
while (start_stb !== 1) @(posedge clk);
session = session + 1;
$sformat(filename, "%s/pkts_node%05d_inj%03d_lpp%05d_traffic%c_sess%04d.csv",
FILE_PATH, NODE_ID, injection_rate, lines_per_pkt, traffic_patt, session);
if (FILE_PATH != "") begin
handle = $fopen(filename, "w");
if (handle == 0) begin
$error("Could not open file: %s", filename);
$finish();
end
end
if (handle != 0) $fdisplay(handle, "Src,Dst,Seqno,Error,Latency");
s_chdr.reset();
num_data_errs = 0;
num_route_errs = 0;
num_pkts_xferd = 0;
num_samps_xferd = 0;
bus_idle_cnt = 0;
running = 1;
while (1) begin
// Pull packet from bus
err = 0;
if (~s_chdr.axis.tvalid[0]) begin
@(posedge clk);
bus_idle_cnt = bus_idle_cnt + 1;
if (bus_idle_cnt <= IDLE_TIMEOUT)
continue;
else
break;
end
s_chdr.pull_pkt(pkt, 0);
bus_idle_cnt = 0;
num_pkts_xferd = num_pkts_xferd + 1;
num_samps_xferd = num_samps_xferd + lines_per_pkt;
// Validate packet
if (pkt.hdr.dst_sid != NODE_ID) begin
err = err + ERR_BIT_PKT_DEST_MISMATCH;
num_route_errs = num_route_errs + 1;
end
if (pkt.payload.size() != lines_per_pkt-2) begin
err = err + ERR_BIT_PKT_SIZE_MISMATCH;
num_data_errs = num_data_errs + 1;
end else begin
for (i = 'd0; i < (lines_per_pkt-2); i=i+1) begin
if (pkt.payload[i] != i) begin
err = err + ERR_BIT_PKT_DATA_MISMATCH;
num_data_errs = num_data_errs + 1;
break;
end
end
end
if (handle != 0) $fdisplay(handle, "%00d,%00d,%00d,%00d,%00d",
pkt.hdr.src_sid, pkt.hdr.dst_sid, pkt.hdr.seqnum, err, (current_time - pkt.hdr.timestamp));
end
running = 0;
if (handle != 0) $fclose(handle);
end
end
endmodule