diff options
Diffstat (limited to 'fpga/usrp3/lib/sim/rfnoc/axi_rate_change')
-rw-r--r-- | fpga/usrp3/lib/sim/rfnoc/axi_rate_change/Makefile | 37 | ||||
-rw-r--r-- | fpga/usrp3/lib/sim/rfnoc/axi_rate_change/axi_rate_change_tb.sv | 323 | ||||
-rw-r--r-- | fpga/usrp3/lib/sim/rfnoc/axi_rate_change/wave.do | 115 |
3 files changed, 475 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/Makefile b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/Makefile new file mode 100644 index 000000000..fcf21b755 --- /dev/null +++ b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/Makefile @@ -0,0 +1,37 @@ +# +# Copyright 2016 Ettus Research +# + +#------------------------------------------------- +# Top-of-Makefile +#------------------------------------------------- +# Define BASE_DIR to point to the "top" dir +BASE_DIR = $(abspath ../../../../top) +# Include viv_sim_preamble after defining BASE_DIR +include $(BASE_DIR)/../tools/make/viv_sim_preamble.mak + +#------------------------------------------------- +# Testbench Specific +#------------------------------------------------- +# Define only one toplevel module +SIM_TOP = axi_rate_change_tb + +# Add test bench, user design under test, and +# additional user created files +SIM_SRCS = $(abspath \ +axi_rate_change_tb.sv \ +$(LIB_DIR)/control/ram_2port.v \ +$(LIB_DIR)/fifo/axi_packet_gate.v \ +$(LIB_DIR)/rfnoc/axi_rate_change.v \ +$(LIB_DIR)/rfnoc/axi_drop_partial_packet.v \ +) + +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/rfnoc/axi_rate_change/axi_rate_change_tb.sv b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/axi_rate_change_tb.sv new file mode 100644 index 000000000..b16c2d26d --- /dev/null +++ b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/axi_rate_change_tb.sv @@ -0,0 +1,323 @@ +`timescale 1ns/1ps +`define NS_PER_TICK 1 +`define NUM_TEST_CASES 4 + +`include "sim_exec_report.vh" +`include "sim_clks_rsts.vh" +`include "sim_cvita_lib.svh" +`include "sim_axis_lib.svh" +`include "sim_set_rb_lib.svh" + +module axi_rate_change_tb(); + `TEST_BENCH_INIT("axi_rate_change_tb",`NUM_TEST_CASES,`NS_PER_TICK); + localparam CLK_PERIOD = $ceil(1e9/166.67e6); + `DEFINE_CLK(clk, CLK_PERIOD, 50); + `DEFINE_RESET(reset, 0, 100); + + localparam SR_N_ADDR = 0; + localparam SR_M_ADDR = 1; + localparam SR_CONFIG_ADDR = 2; + localparam MAX_N = 16; + localparam MAX_M = 16; + + logic [15:0] src_sid = 16'h0000; + logic [15:0] dst_sid = 16'h0010; + settings_bus_master sb (.clk(clk)); + axis_master #(.DWIDTH(32+128)) m_axis (.clk(clk)); + axis_slave #(.DWIDTH(32+128)) s_axis (.clk(clk)); + logic clear, clear_user; + logic [31:0] m_axis_data_tdata, s_axis_data_tdata; + logic m_axis_data_tlast, m_axis_data_tvalid, m_axis_data_tready; + logic s_axis_data_tlast, s_axis_data_tvalid, s_axis_data_tready; + logic warning_long_throttle, error_extra_outputs, error_drop_pkt_lockup; + axi_rate_change #( + .WIDTH(32), + .MAX_N(MAX_N), + .MAX_M(MAX_M), + .SR_N_ADDR(SR_N_ADDR), + .SR_M_ADDR(SR_M_ADDR), + .SR_CONFIG_ADDR(SR_CONFIG_ADDR)) + axi_rate_change ( + .clk(clk), .reset(reset), .clear(clear), .clear_user(clear_user), + .src_sid(src_sid), .dst_sid(dst_sid), + .set_stb(sb.settings_bus.set_stb), .set_addr(sb.settings_bus.set_addr), .set_data(sb.settings_bus.set_data), + .i_tdata(m_axis.axis.tdata[31:0]), .i_tlast(m_axis.axis.tlast), .i_tvalid(m_axis.axis.tvalid), .i_tready(m_axis.axis.tready), .i_tuser(m_axis.axis.tdata[159:32]), + .o_tdata(s_axis.axis.tdata[31:0]), .o_tlast(s_axis.axis.tlast), .o_tvalid(s_axis.axis.tvalid), .o_tready(s_axis.axis.tready), .o_tuser(s_axis.axis.tdata[159:32]), + .m_axis_data_tdata(m_axis_data_tdata), .m_axis_data_tlast(m_axis_data_tlast), + .m_axis_data_tvalid(m_axis_data_tvalid), .m_axis_data_tready(m_axis_data_tready), + .s_axis_data_tdata(s_axis_data_tdata), .s_axis_data_tlast(s_axis_data_tlast), + .s_axis_data_tvalid(s_axis_data_tvalid), .s_axis_data_tready(s_axis_data_tready), + .warning_long_throttle(warning_long_throttle), + .error_extra_outputs(error_extra_outputs), + .error_drop_pkt_lockup(error_drop_pkt_lockup)); + + // Simulate user logic that can handle various decimation / interpolation rates + // - Generates a word count sequence that is checked in the test_rate() task. + // - Introduces a single clock cycle delay which is useful for testing that + // the DUT is not reliant on user logic having a large built in delay. + integer rate_n, rate_m, count_n, count_m, count_in, count_out; + always @(posedge clk) begin + if (reset | clear_user | clear) begin + s_axis_data_tlast <= 1'b0; + count_n <= 1; + count_m <= 1; + count_in <= 0; + count_out <= 0; + end else begin + // Rate change = N/M + if (m_axis_data_tvalid & m_axis_data_tready) begin + if (count_n == rate_n) begin + count_n <= 1; + count_in <= count_in + 1; + end else begin + count_n <= count_n + 1; + end + end + if (count_in != count_out) begin + if (s_axis_data_tvalid & s_axis_data_tready) begin + if (count_m == rate_m) begin + count_m <= 1; + count_out <= count_out + 1; + end else begin + count_m <= count_m + 1; + end + end + end + end + end + + assign s_axis_data_tdata = {count_out[15:0], count_m[15:0]}; + assign s_axis_data_tvalid = (count_in != count_out); + assign m_axis_data_tready = s_axis_data_tready; + + // Used with test 3 to count output clock cycles + int clock_cnt; + logic clock_cnt_en = 1'b0; + logic clock_cnt_start = 1'b0; + always @(posedge clk) begin + if (clock_cnt_en == 1'b1) begin + // Wait until output data starts + if (s_axis.axis.tvalid & ~clock_cnt_start) begin + clock_cnt_start <= 1'b1; + clock_cnt <= clock_cnt + 1; + end else if (clock_cnt_start) begin + clock_cnt <= clock_cnt + 1; + end + end else begin + clock_cnt_start <= 1'b0; + clock_cnt <= 0; + end + end + + /******************************************************** + ** Verification + ********************************************************/ + task random_wait(int unsigned min_cycles, int unsigned max_cycles); + begin + int unsigned num_cycles; + do begin + num_cycles = $random() & (2**($clog2(max_cycles))-1); + end while ((num_cycles < min_cycles) || (num_cycles > max_cycles)); + + if (num_cycles != 0) begin + for (int unsigned i = 0; i < num_cycles; i++) begin + @(posedge clk); + end + @(negedge clk); // Realign with negedge + end + end + endtask + + task test_rate(int n, int m, int num_words, int spp = 16, bit rand_delay_in = 0, bit rand_delay_out = 0); + begin + clear = 1'b1; + @(posedge clk); + @(posedge clk); + clear = 1'b0; + @(posedge clk); + @(posedge clk); + rate_n = n; + rate_m = m; + sb.write(SR_N_ADDR, n); + sb.write(SR_M_ADDR, m); + @(posedge clk); + fork + begin + cvita_hdr_t send_header; + int words_left_to_send, words_to_send; + logic [31:0] words_sent; + real timestamp; + timestamp = 0.0; + words_sent = 0; + words_left_to_send = num_words; + + while (words_left_to_send > 0) begin + // Setup header + send_header = '{default:0}; + send_header.has_time = 1; + send_header.timestamp = longint'(timestamp); + send_header.eob = (words_left_to_send <= spp); + if (words_left_to_send >= spp) begin + send_header.length = 16+4*spp; + words_to_send = spp; + words_left_to_send -= spp; + end else begin + send_header.length = 16+4*words_left_to_send; + words_to_send = words_left_to_send; + words_left_to_send = 0; + end + // Send packet + for (int i = 0; i < words_to_send; i++) begin + if (rand_delay_in) random_wait(0,2*spp); + m_axis.push_word({send_header,words_sent + i},i == words_to_send-1); + end + words_sent += words_to_send; + // Update seq num, timestamp + send_header.seqnum++; + timestamp += (1.0*m/n)*words_to_send; + end + end + begin + string s; + cvita_hdr_t recv_header; + logic last, expected_eob; + real timestamp; + logic [63:0] expected_timestamp; + logic [31:0] word; + logic [15:0] word_cnt_div_m, word_cnt_div_m_frac; + logic [15:0] word_cnt_div_spp_frac; + int words_left_to_recv, words_recvd; + timestamp = 0.0; + expected_timestamp = 0; // Timestamp starts at 0 + word_cnt_div_spp_frac = 0; + word_cnt_div_m = 0; + word_cnt_div_m_frac = 0; + words_recvd = 0; + words_left_to_recv = $floor(num_words/n)*m; // Order matters! + + while (words_left_to_recv > 0) begin + s_axis.pull_word({recv_header,word},last); + word_cnt_div_spp_frac++; + word_cnt_div_m_frac++; + words_recvd++; + words_left_to_recv--; + timestamp += 1.0*n; + // Check packet length + if ((word_cnt_div_spp_frac == spp) || (words_left_to_recv == 0)) begin + `ASSERT_FATAL(last == 1, "Incorrect packet length! Last not asserted!"); + word_cnt_div_spp_frac = 0; + end else begin + $sformat(s, "Incorrect packet length! Expected: %0d, Actual %0d", spp, words_recvd); + `ASSERT_FATAL(last == 0, s); + end + // Check for EOB + if (last) begin + words_recvd = 0; + expected_eob = (words_left_to_recv == 0); + $sformat(s, "Incorrect EOB state! Expected: %0d, Actual %0d", expected_eob, recv_header.eob); + `ASSERT_FATAL(recv_header.eob == expected_eob, s); + end + // Check timestamp + if (last) begin + $sformat(s, "Incorrect timestamp! Expected: %0d, Actual %0d", expected_timestamp, recv_header.timestamp); + `ASSERT_FATAL(recv_header.timestamp == expected_timestamp, s); + expected_timestamp = longint'(timestamp); + end + // Check word + $sformat(s, "Incorrect packet data! Expected: 0x%08h, Actual: 0x%08h", {word_cnt_div_m, word_cnt_div_m_frac}, word); + `ASSERT_FATAL(((word[31:16] == word_cnt_div_m) && (word[15:0] == word_cnt_div_m_frac)), s); + // Track number of received words, do at end of loop + if (word_cnt_div_m_frac == m) begin + word_cnt_div_m_frac = 0; + word_cnt_div_m++; + end + end + end + join + end + endtask + + initial begin : tb_main + string s; + cvita_hdr_t tmp_header; + logic [63:0] word; + logic last; + integer spp, number_words; + spp = 16; + + /******************************************************** + ** Test 1 -- Reset + ********************************************************/ + `TEST_CASE_START("Wait for Reset"); + sb.reset(); + m_axis.reset(); + s_axis.reset(); + while (reset) @(posedge clk); + `TEST_CASE_DONE(~reset); + + /******************************************************** + ** Test 2 -- Test various rates + ** - Try many decimation / interpolation rates (including + ** fractional rates) and use randomized delays. + ********************************************************/ + `TEST_CASE_START("Check various rates"); + for (int _n = 1; _n <= MAX_N; _n++) begin + for (int _m = 1; _m <= MAX_M; _m++) begin + $display("Testing rate %0d:%0d", _n, _m); + test_rate(_n, _m, _n*spp*3, spp, 1, 1); + end + end + `TEST_CASE_DONE(1); + + #2000; // Delay to make the tests visually distinct in waveform viewer + + /******************************************************** + ** Test 3 -- Test partial packets + ** - Send packets with extra data that is less than SPP. + ** Module should output the maximum number of samples + ** possible while dropping the "partial" sample. + ********************************************************/ + `TEST_CASE_START("Test partial packets"); + for (int _n = 1; _n <= MAX_N; _n++) begin + for (int _m = 1; _m <= MAX_M; _m++) begin + $display("Testing rate %0d:%0d", _n, _m); + test_rate(_n, _m, _n*spp + spp-1, spp, 1, 1); + end + end + `TEST_CASE_DONE(1); + + #2000; + + /******************************************************** + ** Test 3 -- Test for bubble states + ** - Send many packets at full rate and make sure number + ** of input clock cycles == output clock cycles. If + ** they do not match, then the module likely has + ** bubble states that would prevent it from running + ** continuously at full rate. + ********************************************************/ + `TEST_CASE_START("Test for bubble states"); + clock_cnt_en = 1'b1; + number_words = 100000; + test_rate(1, 1, number_words, spp, 0, 0); + $sformat(s, "Incorrect number of clock cycles -- Possible bubble states detected! Expected: %0d, Actual: %0d", number_words, clock_cnt); + `ASSERT_FATAL(clock_cnt == number_words, s); + clock_cnt_en = 1'b0; + `TEST_CASE_DONE(1); + + `TEST_BENCH_DONE; + + end + + // The warning, error signals should never assert. + initial begin + while (reset) @(posedge clk); + forever begin + @(posedge clk); + `ASSERT_FATAL(~warning_long_throttle, "Throttle state deadlock!"); + `ASSERT_FATAL(~error_extra_outputs, "Extra outputs detected!"); + `ASSERT_FATAL(~error_drop_pkt_lockup, "Drop packet deadlock!"); + end + end + +endmodule diff --git a/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/wave.do b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/wave.do new file mode 100644 index 000000000..f16b9d5a7 --- /dev/null +++ b/fpga/usrp3/lib/sim/rfnoc/axi_rate_change/wave.do @@ -0,0 +1,115 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate /axi_rate_change_tb/axi_rate_change/clk +add wave -noupdate /axi_rate_change_tb/axi_rate_change/reset +add wave -noupdate /axi_rate_change_tb/axi_rate_change/clear +add wave -noupdate /axi_rate_change_tb/axi_rate_change/clear_user +add wave -noupdate /axi_rate_change_tb/axi_rate_change/active +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_tuser +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_frac +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/in_pkt_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_reg_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_reg_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_reg_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_reg_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/i_reg_tuser +add wave -noupdate /axi_rate_change_tb/axi_rate_change/m_axis_data_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/m_axis_data_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/m_axis_data_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/m_axis_data_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/s_axis_data_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/s_axis_data_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/s_axis_data_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/s_axis_data_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/out_payload_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/payload_length_out +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_m +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_fifo_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_fifo_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/word_cnt_div_n_fifo_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/first_pkt_out +add wave -noupdate /axi_rate_change_tb/axi_rate_change/vita_time_out +add wave -noupdate /axi_rate_change_tb/axi_rate_change/vita_time_accum +add wave -noupdate /axi_rate_change_tb/axi_rate_change/vita_time_reg +add wave -noupdate /axi_rate_change_tb/axi_rate_change/header_fifo_out_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/header_fifo_out_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_reg_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_reg_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_reg_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_reg_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_reg_tuser +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/o_tuser +add wave -noupdate -divider {AXI Drop Partial Packet} +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_terror +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_tlast_int +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/i_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/in_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/large_pkt +add wave -noupdate {/axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/o_tdata[32]} +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/o_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/o_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/o_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/o_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/small_pkt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/flush +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/hold_last_sample +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/in_pkt_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/out_pkt_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/release_due_to_error +add wave -noupdate -divider {AXI Drop Packet} +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/hold +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/i_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/i_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/i_terror +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/i_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/i_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/empty +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/full +add wave -noupdate -radix unsigned /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/rd_addr +add wave -noupdate -radix unsigned /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/wr_addr +add wave -noupdate -radix unsigned /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/in_pkt_cnt +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/int_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/int_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/int_tlast +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/int_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/mem +add wave -noupdate -radix hexadecimal /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/o_tdata +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/o_tvalid +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/o_tready +add wave -noupdate /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/o_tlast +add wave -noupdate -radix unsigned /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/out_pkt_cnt +add wave -noupdate -radix unsigned /axi_rate_change_tb/axi_rate_change/axi_drop_partial_packet/axi_drop_packet/prev_wr_addr +add wave -noupdate /axi_rate_change_tb/axi_rate_change/n +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {1112517 ps} 0} {{Cursor 2} {1974349848 ps} 0} +quietly wave cursor active 2 +configure wave -namecolwidth 633 +configure wave -valuecolwidth 184 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {1974303474 ps} {1974374671 ps} |