diff options
Diffstat (limited to 'fpga/usrp3/lib/sim/axi_probe_tb.v')
-rw-r--r-- | fpga/usrp3/lib/sim/axi_probe_tb.v | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/sim/axi_probe_tb.v b/fpga/usrp3/lib/sim/axi_probe_tb.v new file mode 100644 index 000000000..4d531492c --- /dev/null +++ b/fpga/usrp3/lib/sim/axi_probe_tb.v @@ -0,0 +1,238 @@ +// +// Copyright 2012 Ettus Research LLC +// + + +// +// This module is a SIMULATION ONLY bus monitor that probes AXI4-STREAM bus +// that transfer ETTUS non-CHDR VITA49.0 data, providing logging and diagnostoic info. +// + +module axi_probe_tb + #( + parameter FILENAME="probe.txt", + parameter VITA_PORT0=0, // UDP ports to identify VITA + parameter VITA_PORT1=0, // UDP ports to identify VITA + parameter START_AT_VRL=0 // Flags already stripped back to VRL. + ) + ( + input clk, + input reset, + input clear, + input [63:0] tdata, + input tvalid, + input tready, + input tlast + ); + + localparam ARP = 16'h0806; + localparam IPv4 = 16'h0800; + localparam UDP = 8'h11; + localparam VRL = 1; + + + + + localparam WAIT_SOF = 0; + localparam LINE1 = 1; + localparam LINE2 = 2; + localparam LINE3 = 3; + localparam LINE4 = 4; + localparam LINE5 = 5; + localparam LINE6 = 6; + localparam LINE7 = 7; + + localparam WAIT_EOF = 15; + + reg [3:0] out_state; + + reg [63:0] last_line; + reg [15:0] eth_proto; + reg [7:0] ip_proto; + reg vita_proto; + + + + integer dump_file; + + initial + begin + dump_file = $fopen(FILENAME,"w"); + end + + // + // Monitor packets leaving FIFO + // + always @(posedge clk) + if (reset | clear) begin + out_state <= WAIT_SOF; + end else + case(out_state) + // + // After RESET or the EOF of previous packet, the first cycle with + // output valid asserted is the SOF and presents the Header word. + // The cycle following the concurrent presentation of asserted output + // valid and output ready presents the word following the header. + // + WAIT_SOF: + if (tvalid && tready) begin + last_line <= 0; + eth_proto <= 0; + ip_proto <= 0; + vita_proto <= 0; + + $fdisplay(dump_file,"------------------------------------------"); + $fdisplay(dump_file,"Time = %1d",$time); + if (START_AT_VRL) begin + if (tdata[63:32] == "VRLP") begin + $fdisplay(dump_file,"VRL VITA49 PAYLOAD"); + vita_proto <= VRL; + end + out_state <= LINE7; + end + else out_state <= LINE1; + + last_line <= tdata; + end else begin + out_state <= WAIT_SOF; + end + // + LINE1: if (tvalid && tready) begin + $fdisplay(dump_file,"Dst MAC: %x:%x:%x:%x:%x:%x", + last_line[15:8],last_line[7:0],tdata[63:56],tdata[55:48],tdata[47:40],tdata[39:32]); + last_line = tdata; + out_state <= LINE2; + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end + // + LINE2: if (tvalid && tready) begin + $fdisplay(dump_file,"Src MAC: %x:%x:%x:%x:%x:%x", + last_line[31:24],last_line[23:16],last_line[15:8],last_line[7:0], + tdata[63:56],tdata[55:48]); + eth_proto = tdata[47:32]; + // Protocol?? + if (tdata[47:32] == ARP) begin + //ARP + $fdisplay(dump_file,"ARP packet"); + if (tdata[31:16] == 'h0001) + $fdisplay(dump_file,"HTYPE = 1 (Ethernet)"); + if (tdata[31:16] == 'h0800) + $fdisplay(dump_file,"PTYPE = 0x0800 (IPv4)"); + out_state <= LINE3; + end else if (tdata[47:32] == IPv4) begin + // IPv4 + $fdisplay(dump_file,"IPv4 packet"); + $fdisplay(dump_file,"Packet Length: %1d",tdata[15:0]); + out_state <= LINE3; + end else + out_state <= WAIT_EOF; + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // case: LINE2 + // + LINE3: + if (tvalid && tready) begin + // Protocol?? + if (eth_proto == ARP) begin + $fdisplay(dump_file,"HLEN: %d PLEN: %d",tdata[63:56],tdata[55:48]); + if (tdata[47:32] == 1) $fdisplay(dump_file,"Operation: ARP REQUEST"); + else if (tdata[47:32] == 2) $fdisplay(dump_file,"Operation: ARP REPLY"); + else $fdisplay(dump_file,"Operation: UNKNOWN"); + last_line = tdata; + // out_state <= LINE4; + out_state <= WAIT_EOF; // Add further ARP decode later if desired. + + end else if (eth_proto == IPv4) begin + ip_proto = tdata[23:16]; + if (tdata[23:16] == UDP) $fdisplay(dump_file,"IPv4 Protocol: UDP"); + else $fdisplay(dump_file,"IPv4 Protocol: %x",tdata[23:16]); + out_state <= LINE4; + end else + out_state <= WAIT_EOF; + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // if (tvalid && tready) + // + LINE4: + if (tvalid && tready) begin + // Protocol?? + if (eth_proto == IPv4) begin + $fdisplay(dump_file,"IP Src Address: %1d.%1d.%1d.%1d IP Dst Address: %1d.%1d.%1d.%1d", + tdata[63:56],tdata[55:48],tdata[47:40],tdata[39:32], + tdata[31:24],tdata[23:16],tdata[15:8],tdata[7:0]); + if (ip_proto == UDP) + out_state <= LINE5; + else + out_state <= WAIT_EOF; + end + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // if (tvalid && tready) + // + LINE5: + if (tvalid && tready) begin + // Protocol?? + if (ip_proto == UDP) begin + $fdisplay(dump_file,"UDP Src Port: %d UDP Dst Port: %d", + tdata[63:48],tdata[47:32]); + $fdisplay(dump_file,"UDP Length: %1d",tdata[31:16]); + + last_line = tdata; + out_state <= LINE6; + end + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // if (tvalid && tready) + // + LINE6: + if (tvalid && tready) begin + // Protocol?? + if (tdata[63:32] == "VRLP") begin + $fdisplay(dump_file,"VRL VITA49 PAYLOAD"); + // Expand VITA decode later + vita_proto <= VRL; + out_state <= LINE7; + end + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // if (tvalid && tready) + // + LINE7: + if (tvalid && tready) begin + // Protocol?? + if (vita_proto == VRL) begin + $fdisplay(dump_file,"VRT: Packet Size: %1d StreamID: %x",tdata[47:32],tdata[31:0]); + out_state <= WAIT_EOF; + end + if (tlast) begin + $fdisplay(dump_file,"------------------------------------------"); + out_state <= WAIT_SOF; + end + end // if (tvalid && tready) + + + // + // EOF is signalled by o_tlast asserted whilst output valid and ready asserted. + // + WAIT_EOF: + if (tlast && tvalid && tready) begin + out_state <= WAIT_SOF; + end else begin + out_state <= WAIT_EOF; + end + endcase // case(in_state) + +endmodule // axi_probe_tb |