diff options
| author | Wade Fife <wade.fife@ettus.com> | 2020-08-24 21:32:20 -0500 | 
|---|---|---|
| committer | Wade Fife <wade.fife@ettus.com> | 2020-08-31 08:16:43 -0500 | 
| commit | 97cb396297828f57bba455a275966c58f1abce6e (patch) | |
| tree | 4c36cd95e401253c12ec6b49bc80b2aaa967dad8 /fpga/usrp3/lib | |
| parent | ccf5d1e0a06bf8d46d7bf6dc33a17e3228a1bff4 (diff) | |
| download | uhd-97cb396297828f57bba455a275966c58f1abce6e.tar.gz uhd-97cb396297828f57bba455a275966c58f1abce6e.tar.bz2 uhd-97cb396297828f57bba455a275966c58f1abce6e.zip | |
fpga: sim: chdr_stream_endpoint_tb improvements
- Adds test coverage for stream command and status packets
- Cleans up report output during simulation
- Stops clocks at the end of simulation, so chdr_stream_endpoint_tb can
  be run directly instead of just chdr_stream_endpoint_all_tb
Diffstat (limited to 'fpga/usrp3/lib')
| -rw-r--r-- | fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_all_tb.sv | 10 | ||||
| -rw-r--r-- | fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_tb.sv | 176 | 
2 files changed, 150 insertions, 36 deletions
| diff --git a/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_all_tb.sv b/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_all_tb.sv index c382be654..acdeb08a3 100644 --- a/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_all_tb.sv +++ b/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_all_tb.sv @@ -14,13 +14,7 @@ module chdr_stream_endpoint_all_tb#(    /* no IO */  ); -  chdr_stream_endpoint_tb #(.TEST_NAME("64B"),.CHDR_W(64)) CHDR64 (); -  chdr_stream_endpoint_tb #(.TEST_NAME("512B"),.CHDR_W(512)) CHDR512 (); - -  // Wait for all done -  bit clk,rst; -  sim_clock_gen #(100.0) clk_gen (clk, rst);   -  always_ff@(posedge clk) -    if (CHDR64.test.done && CHDR512.test.done) $finish(1); +  chdr_stream_endpoint_tb #(.TEST_NAME("64B"),  .CHDR_W(64))  CHDR64  (); +  chdr_stream_endpoint_tb #(.TEST_NAME("512B"), .CHDR_W(512)) CHDR512 ();  endmodule diff --git a/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_tb.sv b/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_tb.sv index daa7bf522..14d412a24 100644 --- a/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_tb.sv +++ b/fpga/usrp3/lib/rfnoc/sim/chdr_stream_endpoint_tb/chdr_stream_endpoint_tb.sv @@ -9,7 +9,7 @@  `default_nettype none  module chdr_stream_endpoint_tb#( -  parameter TEST_NAME  = "chdr_stream_endpoint_tb", +  parameter TEST_NAME  = "",    parameter CHDR_W     = 64  )(   /* no IO */ @@ -19,7 +19,6 @@ module chdr_stream_endpoint_tb#(    // ----------------------------------------    // Include macros and time declarations for use with PkgTestExec -  `define TEST_EXEC_OBJ test    `include "test_exec.svh"    import PkgTestExec::*; @@ -29,8 +28,10 @@ module chdr_stream_endpoint_tb#(    // Clocks and resets    bit rfnoc_chdr_clk, rfnoc_chdr_rst;    bit rfnoc_ctrl_clk, rfnoc_ctrl_rst; -  sim_clock_gen #(6.0)  rfnoc_chdr_clk_gen (rfnoc_chdr_clk, rfnoc_chdr_rst); // 166.6 MHz -  sim_clock_gen #(20.0) rfnoc_ctrl_clk_gen (rfnoc_ctrl_clk, rfnoc_ctrl_rst); // 50 MHz +  sim_clock_gen #(.PERIOD(6.0), .AUTOSTART(0)) +    rfnoc_chdr_clk_gen (rfnoc_chdr_clk, rfnoc_chdr_rst); // 166.6 MHz +  sim_clock_gen #(.PERIOD(20.0), .AUTOSTART(0)) +    rfnoc_ctrl_clk_gen (rfnoc_ctrl_clk, rfnoc_ctrl_rst); // 50 MHz    // Parameters    localparam bit    VERBOSE           = 0; @@ -48,6 +49,9 @@ module chdr_stream_endpoint_tb#(    localparam [9:0]  PORT_A   = 10'd1;    localparam [9:0]  PORT_B   = 10'd2; +  // Create a formatted string with the test name for reporting output +  string test_name = TEST_NAME == "" ? "" : {TEST_NAME, ": "}; +    typedef ChdrData #(CHDR_W)::chdr_word_t chdr_word_t;    // ---------------------------------------- @@ -275,11 +279,109 @@ module chdr_stream_endpoint_tb#(    // ----------------------------------------    // Test Utilities    // ---------------------------------------- -  TestExec test = new(); +    integer cached_mgmt_seqnum = 0;    integer cached_ctrl_seqnum = 0;    integer cached_data_seqnum = 0; +  // Test stream command packets and their stream status response packets +  task automatic send_recv_stream_packets( +    input [15:0] dst_epid +  ); +    ChdrPacket         #(CHDR_W) tx_chdr, rx_chdr, exp_chdr; +    chdr_header_t      chdr_hdr; +    chdr_str_command_t str_cmd; +    chdr_str_status_t  str_sts; +    chdr_seq_num_t     seq_num, resp_seq_num; +    int                xfer_count_bytes; +    int                xfer_count_pkts; +    chdr_strc_opcode_t op[] = { +      STRC_INIT,    // Test once with zero init values +      STRC_PING, +      STRC_RESYNC, +      STRC_INIT     // Test again with non-zero init values +    }; + +    seq_num = 0; +    resp_seq_num = 0; +    xfer_count_bytes = 0; +    xfer_count_pkts = 0; + +    // Iterate over stream commands to test +    foreach (op[i]) begin +      chdr_hdr = '{ +        dst_epid : dst_epid, +        seq_num  : seq_num, +        default  : 0 +      }; +      str_cmd = '{ +        src_epid  : EPID_TB, +        op_code   : op[i], +        num_bytes : { $urandom(), $urandom() },  // 64-bit +        num_pkts  : { $urandom(), $urandom() },  // 40-bit +        default   : 0 +      }; + +      // On the first STRC_INIT, test the init values of 0, which we use to get +      // the buffer sizes. We should only get one status update in response. +      if (i == 0) begin +        assert (op[i] == STRC_INIT) else $fatal(1, "Expecting STRC_INIT op"); +        str_cmd.num_bytes = 0; +        str_cmd.num_pkts  = 0; +      end + +      // Send the stream command packet +      tx_chdr = new(); +      tx_chdr.write_stream_cmd(chdr_hdr, str_cmd); +      if (VERBOSE) begin $write("Tx"); tx_chdr.print(); end +      tb_chdr_bfm.put_chdr(tx_chdr); + +      // Get the stream status packet response +      tb_chdr_bfm.get_chdr(rx_chdr); +      if (VERBOSE) begin $write("Rx"); rx_chdr.print(); end + +      // Build up the expected response +      if (op[i] == STRC_INIT) begin +        // STRC_INIT resets the counters in the stream endpoint +        resp_seq_num     = 0; +        xfer_count_pkts  = 0; +        xfer_count_bytes = 0; +      end +      chdr_hdr.dst_epid = EPID_TB;  // Response should come back to TB endpoint +      chdr_hdr.seq_num  = resp_seq_num; +      str_sts = '{ +        src_epid         : dst_epid, +        status           : STRS_OKAY, +        capacity_bytes   : 2**(MTU+1) * (CHDR_W/8) - 1, +        capacity_pkts    : 'hFFFFFF, +        xfer_count_pkts  : xfer_count_pkts, +        xfer_count_bytes : xfer_count_bytes, +        default          : 0 +      }; +      $write(""); str_sts.status_info = 0; // Work around Vivado bug :( +      if (op[i] == STRC_RESYNC) begin +        // The STRC_RESYNC op should update the xfer_count_bytes in the SEP, so +        // we should expect the values we sent to be echoed in the response. +        str_sts.xfer_count_pkts  = str_cmd.num_pkts; +        str_sts.xfer_count_bytes = str_cmd.num_bytes; +      end +      exp_chdr = new(); +      exp_chdr.write_stream_status(chdr_hdr, str_sts); +      if (VERBOSE) begin $write("ExpRx"); exp_chdr.print(); end + +      // Validate contents of the response +      `ASSERT_ERROR(exp_chdr.equal(rx_chdr), +        "Received CHDR stream status packet was incorrect"); + +      // Update counters. Note that xfer_count_bytes counts whole CHDR words +      // because that's the width of the internal buffers. +      xfer_count_bytes += $ceil(tx_chdr.header.length / (CHDR_W/8.0)) * (CHDR_W/8); +      xfer_count_pkts  += 1; +      resp_seq_num     += 1; +      seq_num          += 1; +    end +  endtask : send_recv_stream_packets +    task automatic send_recv_mgmt_packet(      input  chdr_header_t tx_mgmt_hdr,      input  chdr_mgmt_t   tx_mgmt_pl, @@ -390,7 +492,7 @@ module chdr_stream_endpoint_tb#(        };        tx_chdr.write_ctrl(chdr_hdr, ctrl_hdr, ctrl_op, ctrl_data, ctrl_ts); -      test.start_timeout(ctrl_timeout, 2us, "Waiting for management transaction"); +      test.start_timeout(ctrl_timeout, 2us, "Waiting for control transaction");        if (VERBOSE) begin $write("Tx"); tx_chdr.print(); end        tb_chdr_bfm.put_chdr(tx_chdr.copy());        tb_chdr_bfm.get_chdr(rx_chdr); @@ -410,7 +512,6 @@ module chdr_stream_endpoint_tb#(        if (VERBOSE) begin $write("ExpRx"); exp_chdr.print(); end        // Validate contents -      exp_chdr.disable_comparing_beyond_length = 1;        `ASSERT_ERROR(exp_chdr.equal(rx_chdr),          "Received CHDR control packet was incorrect");      end @@ -528,7 +629,7 @@ module chdr_stream_endpoint_tb#(    // ----------------------------------------    // Test Process    // ---------------------------------------- -  initial begin +  initial begin : tb_main      // Shared Variables      // ---------------------------------------- @@ -551,7 +652,7 @@ module chdr_stream_endpoint_tb#(      // Initialize      // ---------------------------------------- -    test.start_tb({TEST_NAME,"chdr_stream_endpoint_tb"}); +    test.start_tb({test_name, "chdr_stream_endpoint_tb"});      // Start the BFMs      a0_data_bfm.run(); @@ -563,12 +664,16 @@ module chdr_stream_endpoint_tb#(      tb_chdr_bfm.set_master_stall_prob(0);      tb_chdr_bfm.set_slave_stall_prob(0); +    // Start the clocks +    rfnoc_chdr_clk_gen.start(); +    rfnoc_ctrl_clk_gen.start(); +      // Reset      // ----------------------------------------      rfnoc_ctrl_clk_gen.reset();      rfnoc_chdr_clk_gen.reset(); -    test.start_test({TEST_NAME,"Wait for reset"}); +    test.start_test({test_name, "Wait for reset"});      test.start_timeout(timeout, 1us, "Waiting for reset");      while (rfnoc_ctrl_rst) @(posedge rfnoc_ctrl_clk);      while (rfnoc_chdr_rst) @(posedge rfnoc_chdr_clk); @@ -578,7 +683,7 @@ module chdr_stream_endpoint_tb#(      // Discover Topology      // ---------------------------------------- -    test.start_test({TEST_NAME,"Discover Topology"}); +    test.start_test({test_name, "Discover Topology"});      begin        automatic chdr_header_t tx_mgmt_hdr, rx_mgmt_hdr;        automatic chdr_mgmt_t tx_mgmt_pl, rx_mgmt_pl; @@ -670,7 +775,7 @@ module chdr_stream_endpoint_tb#(      // Configure Routes to Stream Endpoints A and B      // ---------------------------------------- -    test.start_test({TEST_NAME,"Configure Routes"}); +    test.start_test({test_name, "Configure Routes"});      begin        automatic chdr_header_t tx_mgmt_hdr, rx_mgmt_hdr;        automatic chdr_mgmt_t tx_mgmt_pl, rx_mgmt_pl; @@ -707,7 +812,7 @@ module chdr_stream_endpoint_tb#(      // Configure Stream Endpoints      // ---------------------------------------- -    test.start_test({TEST_NAME,"Configure Stream Endpoints"}); +    test.start_test({test_name, "Configure Stream Endpoints"});      begin        automatic chdr_header_t tx_mgmt_hdr, rx_mgmt_hdr;        automatic chdr_mgmt_t tx_mgmt_pl, rx_mgmt_pl; @@ -756,9 +861,20 @@ module chdr_stream_endpoint_tb#(      end      test.end_test(); +    // Test Stream Commands and Responses +    // ---------------------------------------- +    test.start_test({test_name, "Test Stream Commands"}, 1ms); +    begin +      automatic logic [15:0] epids[2] = {EPID_A, EPID_B}; +      foreach (epids[i]) begin +        send_recv_stream_packets(epids[i]); +      end +    end +    test.end_test(); +      // Setup a stream between Endpoint A and B      // ---------------------------------------- -    test.start_test({TEST_NAME,"Setup bidirectional stream between endpoints A and B"}); +    test.start_test({test_name, "Setup bidirectional stream between endpoints A and B"});      begin        automatic chdr_header_t tx_mgmt_hdr, rx_mgmt_hdr;        automatic chdr_mgmt_t tx_mgmt_pl, rx_mgmt_pl; @@ -865,7 +981,7 @@ module chdr_stream_endpoint_tb#(      cached_ctrl_seqnum = 0;      for (int cfg = 0; cfg < 2; cfg++) begin        $sformat(tc_label, "Control Xact to A (%s)", (cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          tb_chdr_bfm.set_master_stall_prob(cfg?SLOW_STALL_PROB:FAST_STALL_PROB);          tb_chdr_bfm.set_slave_stall_prob(cfg?SLOW_STALL_PROB:FAST_STALL_PROB); @@ -880,7 +996,7 @@ module chdr_stream_endpoint_tb#(      cached_ctrl_seqnum = 0;      for (int cfg = 0; cfg < 2; cfg++) begin        $sformat(tc_label, "Control Xact to B (%s)", (cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          tb_chdr_bfm.set_master_stall_prob(cfg?SLOW_STALL_PROB:FAST_STALL_PROB);          tb_chdr_bfm.set_slave_stall_prob(cfg?SLOW_STALL_PROB:FAST_STALL_PROB); @@ -898,7 +1014,7 @@ module chdr_stream_endpoint_tb#(        automatic logic slv_cfg = cfg[1];        $sformat(tc_label, "Stream Data from A to B (%s Mst, %s Slv)",          (mst_cfg?"Slow":"Fast"), (slv_cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          set_unidir_stall_prob(EPID_A, EPID_B,            mst_cfg?SLOW_STALL_PROB:FAST_STALL_PROB, @@ -917,7 +1033,7 @@ module chdr_stream_endpoint_tb#(        automatic logic slv_cfg = cfg[1];        $sformat(tc_label, "Stream Data from B to A (%s Mst, %s Slv)",          (mst_cfg?"Slow":"Fast"), (slv_cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          set_unidir_stall_prob(EPID_B, EPID_A,            mst_cfg?SLOW_STALL_PROB:FAST_STALL_PROB, @@ -935,7 +1051,7 @@ module chdr_stream_endpoint_tb#(        automatic logic slv_cfg = cfg[1];        $sformat(tc_label, "Stream Data between A <=> B simultaneously (%s Mst, %s Slv)",          (mst_cfg?"Slow":"Fast"), (slv_cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          set_bidir_stall_prob(            mst_cfg?SLOW_STALL_PROB:FAST_STALL_PROB, @@ -956,7 +1072,7 @@ module chdr_stream_endpoint_tb#(        automatic logic slv_cfg = cfg[1];        $sformat(tc_label, "Stream Data and Control between A <=> B (%s Mst, %s Slv)",          (mst_cfg?"Slow":"Fast"), (slv_cfg?"Slow":"Fast")); -      test.start_test({TEST_NAME,tc_label}); +      test.start_test({test_name, tc_label});        begin          tb_chdr_bfm.set_master_stall_prob(mst_cfg?SLOW_STALL_PROB:FAST_STALL_PROB);          tb_chdr_bfm.set_slave_stall_prob(slv_cfg?SLOW_STALL_PROB:FAST_STALL_PROB); @@ -982,7 +1098,7 @@ module chdr_stream_endpoint_tb#(      // Check zero sequence errors after streaming      // ---------------------------------------- -    test.start_test({TEST_NAME,"Check zero sequence errors after streaming"}); +    test.start_test({test_name, "Check zero sequence errors after streaming"});      begin        automatic logic [15:0] epids[2] = {EPID_A, EPID_B};        foreach (epids[i]) begin @@ -1000,7 +1116,7 @@ module chdr_stream_endpoint_tb#(      //   can cause the count to be greater than just the number data packets      //   that are sent, so the comparisons are to > instead of ==      // ---------------------------------------- -    test.start_test({TEST_NAME,"Force sequence error"}); +    test.start_test({test_name, "Force sequence error"});      begin        // First sequence error        send_recv_data_packets(EPID_A, EPID_B, 1, cached_data_seqnum++, 1); @@ -1028,7 +1144,7 @@ module chdr_stream_endpoint_tb#(      // Force routing error      // ---------------------------------------- -    test.start_test({TEST_NAME,"Force routing error"}); +    test.start_test({test_name, "Force routing error"});      begin        logic [31:0] old_route_err_count;        // First sequence error @@ -1058,7 +1174,7 @@ module chdr_stream_endpoint_tb#(      // Setup a stream between Endpoint A and B      // ---------------------------------------- -    test.start_test({TEST_NAME,"Reconfigure flow control (reset state)"}); +    test.start_test({test_name, "Reconfigure flow control (reset state)"});      begin        automatic chdr_header_t tx_mgmt_hdr, rx_mgmt_hdr;        automatic chdr_mgmt_t tx_mgmt_pl, rx_mgmt_pl; @@ -1122,7 +1238,7 @@ module chdr_stream_endpoint_tb#(      // Check zero errors after reinit      // ---------------------------------------- -    test.start_test({TEST_NAME,"Check zero errors after reinit"}); +    test.start_test({test_name, "Check zero errors after reinit"});      begin        automatic logic [15:0] epids[2] = {EPID_A, EPID_B};        foreach (epids[i]) begin @@ -1136,7 +1252,7 @@ module chdr_stream_endpoint_tb#(      // Stream data between A <=> B simultaneously      // ---------------------------------------- -    test.start_test({TEST_NAME,"Stream Data between A <=> B with a lossy link"}); +    test.start_test({test_name, "Stream Data between A <=> B with a lossy link"});      begin        cached_data_seqnum = 0;        set_bidir_stall_prob(FAST_STALL_PROB, SLOW_STALL_PROB); @@ -1154,9 +1270,13 @@ module chdr_stream_endpoint_tb#(      // Finish Up      // ---------------------------------------- +    // Stop the clocks +    rfnoc_chdr_clk_gen.kill(); +    rfnoc_ctrl_clk_gen.kill();      // Display final statistics and results      test.end_tb(.finish(0)); -  end +  end : tb_main  endmodule -`default_nettype wire
\ No newline at end of file + +`default_nettype wire | 
