diff options
Diffstat (limited to 'fpga/usrp3/lib/sim/packet_proc')
4 files changed, 466 insertions, 0 deletions
| diff --git a/fpga/usrp3/lib/sim/packet_proc/chdr_chunker/chdr_chunker_tb.v b/fpga/usrp3/lib/sim/packet_proc/chdr_chunker/chdr_chunker_tb.v new file mode 100644 index 000000000..9e80f9c15 --- /dev/null +++ b/fpga/usrp3/lib/sim/packet_proc/chdr_chunker/chdr_chunker_tb.v @@ -0,0 +1,190 @@ +// +// Copyright 2013 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// + + +`timescale 1ns/10ps + +module chdr_chunker_tb(); + +   // TB stimulus +   reg clk    = 0; +   reg reset  = 1; +   reg clear  = 0; +   reg [15:0] quantum; + +   // Check vars +   reg [31:0] o_xfer_count = 0, i_xfer_count = 0; +   reg [63:0] o_last_tdata = 0; + +    +   always #10 clk = ~clk; +    +   initial $dumpfile("chdr_chunker_tb.vcd"); +   initial $dumpvars(0,chdr_chunker_tb); + +   function check_result; +      input [31:0]   o_xfer_count_arg; +      input [31:0]   i_xfer_count_arg; +      input [63:0]   o_last_tdata_arg; +      input          error_arg; +      begin +         //Check vars +         check_result = 1; +         check_result = check_result & ((o_xfer_count_arg == o_xfer_count) !== 0); +         check_result = check_result & ((i_xfer_count_arg == i_xfer_count) !== 0); +         check_result = check_result & ((o_last_tdata_arg == o_last_tdata) !== 0); +         check_result = check_result & ((error_arg == error) != 0); +          +         if (check_result) begin +            $display ("... Passed"); +         end else begin +            $display ("... FAILED!!!"); +            $display ("o_xfer_count = %d (Expected %d)",o_xfer_count,o_xfer_count_arg); +            $display ("i_xfer_count = %d (Expected %d)",i_xfer_count,i_xfer_count_arg); +            $display ("o_last_tdata = %h (Expected %h)",o_last_tdata,o_last_tdata_arg); +            $display ("error = %d  (Expected %d)",error,error_arg); +         end + +         //Reset vars +         o_xfer_count = 0; +         i_xfer_count = 0; +         o_last_tdata = 64'h0; +      end +   endfunction + +   task send_packet; +      input [63:0] data_start; +      input [31:0] len; +       +      begin +         if(len < 9) begin +            {i_tlast, i_tdata} <= { 1'b1, data_start[63:32], len[15:0], data_start[15:0] }; +            i_tvalid <= 1; +            @(posedge clk); +            i_tvalid <= 0; +         end else begin +            {i_tlast, i_tdata} <= { 1'b0, data_start[63:32], len[15:0], data_start[15:0] }; +            i_tvalid <= 1; +            @(posedge clk); +            repeat(((len-1)/8)-1) begin +               i_tdata <= i_tdata + 64'h0000_0002_0000_0002; +               @(posedge clk); +            end +            i_tdata <= i_tdata + 64'h0000_0002_0000_0002; +            i_tlast <= 1; +            @(posedge clk); +            i_tvalid <= 0; +        end // else: !if(len < 9) +      end +   endtask // send_packet + +   task reset_quantum_atomic; +      input [15:0] quant; +      begin +         quantum <= quant; +         clear <= 1; +         @(posedge clk); +         clear <= 0; +         @(posedge clk); +      end +   endtask // reset_quantum_atomic + + +   initial begin +      #100 reset = 0; +      #200000; +      $finish; +   end +    +   reg [63:0]  i_tdata; +   reg         i_tlast; +   reg         i_tvalid; +   wire        i_tready; + +   wire [63:0] o_tdata; +   wire        o_tlast, o_tvalid, o_tready; +   wire        error; +    +   initial begin +      quantum <= 256; +      i_tvalid <= 0; +      while(reset) @(posedge clk); + +      $write ("Running test case: First packet after reset"); +      send_packet(64'h00000001_00000000, 128); +      while(o_tvalid) @(posedge clk); +      check_result(256,16,64'hFFFFFFFF_FFFFFFFF,0); + +      reset_quantum_atomic(8); + +      $write ("Running test case: sizeof(packet) < quantum"); +      send_packet(64'h00000001_00000000, 40); +      while(o_tvalid) @(posedge clk); +      check_result(8,5,64'hFFFFFFFF_FFFFFFFF,0); + +      reset_quantum_atomic(5); + +      $write ("Running test case: sizeof(packet) == quantum"); +      send_packet(64'h00000001_00000000, 40); +      while(o_tvalid) @(posedge clk); +      check_result(5,5,64'h00000030_00000008,0); +       +      $write ("Running test case: sizeof(packet) == quantum - 64bits"); +      send_packet(64'h00000001_00000000, 32); +      while(o_tvalid) @(posedge clk); +      check_result(5,4,64'hFFFFFFFF_FFFFFFFF,0); + +      $write ("Running test case: sizeof(packet) == quantum + 64bits"); +      send_packet(64'h00000001_00000000, 48); +      while(o_tvalid) @(posedge clk); +      check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,1); + +      $write ("Running test case: Error reset"); +      reset_quantum_atomic(8); +      check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,0); +       +      $write ("Running test case: sizeof(packet) > quantum"); +      send_packet(64'h00000001_00000000, 80); +      while(o_tvalid) @(posedge clk); +      check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,1); + +      reset_quantum_atomic(8); + +      $write ("Running test case: sizeof(packet) == 2"); +      send_packet(64'h00000001_00000000, 8); +      while(o_tvalid) @(posedge clk); +      check_result(8,1,64'hFFFFFFFF_FFFFFFFF,0); + +      $write ("Running test case: Multiple packets back-to-back"); +      send_packet(64'h00000001_00000000, 40); +      while(o_tvalid) @(posedge clk); +      send_packet(64'h00000001_00000000, 16); +      while(o_tvalid) @(posedge clk); +      send_packet(64'h00000001_00000000, 64); +      while(o_tvalid) @(posedge clk); +      check_result(24,15,64'h0000004e0000000e,0); + +   end // initial begin + + +   chdr_chunker dut ( +      .clk(clk), .reset(reset), .clear(clear), .frame_size(quantum), +      .i_tdata(i_tdata), .i_tlast(i_tlast), .i_tvalid(i_tvalid), .i_tready(i_tready), +      .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready), +      .error(error)); +       +   assign o_tready = 1; +   +   always @(posedge clk) begin +      if (o_tvalid & o_tready) begin +         o_xfer_count <= o_xfer_count + 1; +         o_last_tdata <= o_tdata; +      end +      if (i_tvalid & i_tready) i_xfer_count <= i_xfer_count + 1; +   end + +endmodule // chdr_chunker_tb diff --git a/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/Makefile b/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/Makefile new file mode 100644 index 000000000..f73cbdae9 --- /dev/null +++ b/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/Makefile @@ -0,0 +1,33 @@ +# +# Copyright 2016 Ettus Research +# + +#------------------------------------------------- +# Top-of-Makefile +#------------------------------------------------- +# Define BASE_DIR to point to the "top" dir +BASE_DIR = $(abspath ../../../../top) +# Include viv_sim_preample after defining BASE_DIR +include $(BASE_DIR)/../tools/make/viv_sim_preamble.mak + +#------------------------------------------------- +# Testbench Specific +#------------------------------------------------- +# Define only one toplevel module +SIM_TOP = chdr_dechunker_tb + +# Add test bench, user design under test, and +# additional user created files +SIM_SRCS = $(abspath \ +chdr_dechunker_tb.sv \ +) + +MODELSIM_USER_DO = $(abspath wave.do) + +#------------------------------------------------- +# Bottom-of-Makefile +#------------------------------------------------- +# Include all simulator specific makefiles here +# Each should define a unique target to simulate +# e.g. xsim, vsim, etc and a common "clean" target +include $(BASE_DIR)/../tools/make/viv_simulator.mak diff --git a/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/chdr_dechunker_tb.sv b/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/chdr_dechunker_tb.sv new file mode 100644 index 000000000..38664c20f --- /dev/null +++ b/fpga/usrp3/lib/sim/packet_proc/chdr_dechunker/chdr_dechunker_tb.sv @@ -0,0 +1,200 @@ +// +// Copyright 2013 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// + + +`timescale 1ns/10ps + +`define NS_PER_TICK 1 +`define NUM_TEST_CASES 8 + +`include "sim_exec_report.vh" + + +module chdr_dechunker_tb(); +   `TEST_BENCH_INIT("chdr_dechunker_tb", `NUM_TEST_CASES, `NS_PER_TICK) + +   // TB stimulus +   reg clk    = 0; +   reg reset  = 1; +   reg clear  = 0; +   reg [15:0] quantum; +   wire error; + +   // Check vars +   reg [31:0] o_xfer_count = 0, i_xfer_count = 0; +   reg [63:0] o_last_tdata = 0; + +    +   always #10 clk = ~clk; +    +   initial $dumpfile("chdr_dechunker_tb.vcd"); +   initial $dumpvars(0,chdr_dechunker_tb); + +   function check_result; +      input [31:0]   o_xfer_count_arg; +      input [31:0]   i_xfer_count_arg; +      input [63:0]   o_last_tdata_arg; +      input          error_arg; +      begin +         //Check vars +         check_result = 1; +         check_result = check_result & ((o_xfer_count_arg == o_xfer_count) !== 0); +         check_result = check_result & ((i_xfer_count_arg == i_xfer_count) !== 0); +         check_result = check_result & ((o_last_tdata_arg == o_last_tdata) !== 0); +         check_result = check_result & ((error_arg == error) != 0); +          +         if (!check_result) begin +            $display ("o_xfer_count = %d (Expected %d)",o_xfer_count,o_xfer_count_arg); +            $display ("i_xfer_count = %d (Expected %d)",i_xfer_count,i_xfer_count_arg); +            $display ("o_last_tdata = %h (Expected %h)",o_last_tdata,o_last_tdata_arg); +            $display ("error = %d  (Expected %d)",error,error_arg); +            `ASSERT_ERROR(0, "Result did not match expected value"); +         end + +         //Reset vars +         o_xfer_count = 0; +         i_xfer_count = 0; +         o_last_tdata = 64'h0; +      end +   endfunction + +   task send_packet; +      input [63:0] data_start; +      input [31:0] len; +      input [31:0] quant; +       +      begin +         if(quant < 2) begin +            {i_tlast, i_tdata} <= { 1'b1, data_start[63:32], len[15:0], data_start[15:0] }; +            i_tvalid <= 1; +            @(posedge clk); +            i_tvalid <= 0; +         end else begin +            {i_tlast, i_tdata} <= { 1'b0, data_start[63:32], len[15:0], data_start[15:0] }; +            i_tvalid <= 1; +            @(posedge clk); +            repeat(quant - 2) begin +               i_tdata <= i_tdata + 64'h0000_0002_0000_0002; +               @(posedge clk); +            end +            i_tdata <= i_tdata + 64'h0000_0002_0000_0002; +            i_tlast <= 1; +            @(posedge clk); +            i_tvalid <= 1'b0; +         end // else: !if(quant < 2) +      end +   endtask // send_packet + +   task reset_quantum_atomic; +      input [15:0] quant; +      begin +         quantum <= quant; +         clear <= 1; +         @(posedge clk); +         clear <= 0; +         @(posedge clk); +      end +   endtask // reset_quantum_atomic + + +   initial begin +      #100 reset = 0; +   end +    +   reg [63:0]  i_tdata; +   reg         i_tlast; +   reg         i_tvalid; +   wire        i_tready; + +   wire [63:0] o_tdata; +   wire        o_tlast, o_tvalid, o_tready; +    +   reg result; +   initial begin +      quantum <= 8; +      i_tvalid <= 0; +      while(reset) @(posedge clk); + +      `TEST_CASE_START("Running test case: First packet after reset"); +      send_packet(64'h00000001_00000000, 32, 8); +      @(posedge clk); +      result = check_result(4,8,64'hxxxxxxxx_xxxxxx06, 0); +      `TEST_CASE_DONE(result); + +      reset_quantum_atomic(10); + +      `TEST_CASE_START("Running test case: sizeof(packet) < quantum"); +      send_packet(64'h00000001_00000000, 64, 10); +      @(posedge clk); +      result = check_result(8,10,64'hxxxxxxxx_xxxxxx0e, 0); +      `TEST_CASE_DONE(result); + +      `TEST_CASE_START("Running test case: sizeof(packet) == quantum"); +      send_packet(64'h00000001_00000000, 80, 10); +      @(posedge clk); +      result = check_result(10,10,64'hxxxxxxxx_xxxxxx12, 0); +      `TEST_CASE_DONE(result); +       +      `TEST_CASE_START("Running test case: sizeof(packet) == quantum - 64bits"); +      send_packet(64'h00000001_00000000, 72, 10); +      @(posedge clk); +      result = check_result(9,10,64'hxxxxxxxx_xxxxxx10, 0); +      `TEST_CASE_DONE(result); + +      `TEST_CASE_START("Running test case: sizeof(packet) == quantum + 64bits"); +      send_packet(64'h00000001_00000000, 88, 10); +      @(posedge clk); +      result = check_result(32'hxxxxxxxx,10,64'hxxxxxxxx_xxxxxxxx, 1); +      `TEST_CASE_DONE(result); + +      reset_quantum_atomic(10); + +      `TEST_CASE_START("Running test case: sizeof(packet) > quantum"); +      send_packet(64'h00000001_00000000, 88, 10); +      @(posedge clk); +      result = check_result(32'hxxxxxxxx,10,64'hxxxxxxxx_xxxxxxxx, 1); +      `TEST_CASE_DONE(result); + +      reset_quantum_atomic(8); + +      `TEST_CASE_START("Running test case: sizeof(packet) == 2"); +      send_packet(64'h00000001_00000000, 8, 8); +      @(posedge clk); +      result = check_result(1,8,64'hxxxxxxxx_xxxxxx00, 0); +      `TEST_CASE_DONE(result); + +      `TEST_CASE_START("Running test case: Multiple packets"); +      send_packet(64'h00000001_00000000, 8, 8); +      send_packet(64'h00000001_00000000, 16, 8); +      send_packet(64'h00000001_00000000, 24, 8); +      send_packet(64'h00000001_00000000, 32, 8); +      @(posedge clk); +      result = check_result(10,32,64'hxxxxxxxx_xxxxxx06, 0); +      `TEST_CASE_DONE(result); + +      `TEST_BENCH_DONE; +   end // initial begin + + +   chdr_dechunker dut ( +      .clk(clk), .reset(reset), .clear(clear), .frame_size(quantum), +      .i_tdata(i_tdata), .i_tvalid(i_tvalid), .i_tready(i_tready), +      .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready), +      .error(error)); +       +   assign o_tready = 1; +   +   always @(posedge clk) begin +      if (o_tvalid & o_tready) begin +         o_xfer_count <= o_xfer_count + 1; +         o_last_tdata <= o_tdata; +      end +      if (i_tvalid & i_tready) i_xfer_count <= i_xfer_count + 1; +   end + +endmodule // chdr_dechunker_tb diff --git a/fpga/usrp3/lib/sim/packet_proc/ip_hdr_checksum/ip_hdr_checksum_tb.v b/fpga/usrp3/lib/sim/packet_proc/ip_hdr_checksum/ip_hdr_checksum_tb.v new file mode 100644 index 000000000..82deca656 --- /dev/null +++ b/fpga/usrp3/lib/sim/packet_proc/ip_hdr_checksum/ip_hdr_checksum_tb.v @@ -0,0 +1,43 @@ +// +// Copyright 2014 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +module ip_hdr_checksum_tb(); +    +   initial $dumpfile("ip_hdr_checksum_tb.vcd"); +   initial $dumpvars(0,ip_hdr_checksum_tb); + +   reg clk; +    +   wire [159:0] in = { +		      16'h4500, +		      16'h0030, +		      16'h4422, +		      16'h4000, +		      16'h8006, +		      16'h0000, +		      16'h8c7c, +		      16'h19ac, +		      16'hae24, +		      16'h1e2b +		      }; +    +   wire [15:0] 	out; +   ip_hdr_checksum ip_hdr_checksum +     (.clk(clk),  +      .in(in), +      .out(out)); + +   initial +     begin +	clk <= 0; +	#100 clk <= 1; +	#100 clk <= 0; +	#100 clk <= 1; +	#100 $display("Computed 0x%x, should be 0x442e", out); +	#100 $finish; +     end +    +endmodule // ip_hdr_checksum_tb | 
