4 `include "axi_pwm_coprocessor_v1_0_tb_include.vh"
6 // lite_response Type Defines
7 `define RESPONSE_OKAY 2'b00
8 `define RESPONSE_EXOKAY 2'b01
9 `define RESP_BUS_WIDTH 2
10 `define BURST_TYPE_INCR 2'b01
11 `define BURST_TYPE_WRAP 2'b10
13 // AMBA AXI4 Lite Range Constants
14 `define S00_AXI_MAX_BURST_LENGTH 1
15 `define S00_AXI_DATA_BUS_WIDTH 32
16 `define S00_AXI_ADDRESS_BUS_WIDTH 32
17 `define S00_AXI_MAX_DATA_SIZE (`S00_AXI_DATA_BUS_WIDTH*`S00_AXI_MAX_BURST_LENGTH)/8
19 module axi_pwm_coprocessor_v1_0_tb;
23 wire M00_AXI_TXN_DONE;
26 // Create an instance of the example tb
27 `BD_WRAPPER dut (.ACLK(tb_ACLK),
29 .M00_AXI_TXN_DONE(M00_AXI_TXN_DONE),
30 .M00_AXI_ERROR(M00_AXI_ERROR),
31 .M00_AXI_INIT_AXI_TXN(M00_AXI_INIT_AXI_TXN));
35 // AMBA S00_AXI AXI4 Lite Local Reg
36 reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_rd_data_lite;
37 reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_test_data_lite [3:0];
38 reg [`RESP_BUS_WIDTH-1:0] S00_AXI_lite_response;
39 reg [`S00_AXI_ADDRESS_BUS_WIDTH-1:0] S00_AXI_mtestAddress;
40 reg [3-1:0] S00_AXI_mtestProtection_lite;
41 integer S00_AXI_mtestvectorlite; // Master side testvector
42 integer S00_AXI_mtestdatasizelite;
43 integer result_slave_lite;
46 // Simple Reset Generator and test
50 // Release the reset on the posedge of the clk.
56 // Simple Clock Generator
57 initial tb_ACLK = 1'b0;
58 always #10 tb_ACLK = !tb_ACLK;
60 //------------------------------------------------------------------------
61 // TEST LEVEL API: CHECK_RESPONSE_OKAY
62 //------------------------------------------------------------------------
64 // CHECK_RESPONSE_OKAY(lite_response)
65 // This task checks if the return lite_response is equal to OKAY
66 //------------------------------------------------------------------------
67 task automatic CHECK_RESPONSE_OKAY;
68 input [`RESP_BUS_WIDTH-1:0] response;
70 if (response !== `RESPONSE_OKAY) begin
71 $display("TESTBENCH ERROR! lite_response is not OKAY",
72 "\n expected = 0x%h",`RESPONSE_OKAY,
73 "\n actual = 0x%h",response);
79 //------------------------------------------------------------------------
80 // TEST LEVEL API: COMPARE_LITE_DATA
81 //------------------------------------------------------------------------
83 // COMPARE_LITE_DATA(expected,actual)
84 // This task checks if the actual data is equal to the expected data.
85 // X is used as don't care but it is not permitted for the full vector
87 //------------------------------------------------------------------------
88 `define S_AXI_DATA_BUS_WIDTH 32
89 task automatic COMPARE_LITE_DATA;
90 input [`S_AXI_DATA_BUS_WIDTH-1:0]expected;
91 input [`S_AXI_DATA_BUS_WIDTH-1:0]actual;
93 if (expected === 'hx || actual === 'hx) begin
94 $display("TESTBENCH ERROR! COMPARE_LITE_DATA cannot be performed with an expected or actual vector that is all 'x'!");
95 result_slave_lite = 0;
99 if (actual != expected) begin
100 $display("TESTBENCH ERROR! Data expected is not equal to actual.",
101 "\nexpected = 0x%h",expected,
102 "\nactual = 0x%h",actual);
103 result_slave_lite = 0;
108 $display("TESTBENCH Passed! Data expected is equal to actual.",
109 "\n expected = 0x%h",expected,
110 "\n actual = 0x%h",actual);
115 task automatic S00_AXI_TEST;
117 $display("---------------------------------------------------------");
118 $display("EXAMPLE TEST : S00_AXI");
119 $display("Simple register write and read example");
120 $display("---------------------------------------------------------");
122 S00_AXI_mtestvectorlite = 0;
123 S00_AXI_mtestAddress = `S00_AXI_SLAVE_ADDRESS;
124 S00_AXI_mtestProtection_lite = 0;
125 S00_AXI_mtestdatasizelite = `S00_AXI_MAX_DATA_SIZE;
127 result_slave_lite = 1;
129 for (S00_AXI_mtestvectorlite = 0; S00_AXI_mtestvectorlite <= 3; S00_AXI_mtestvectorlite = S00_AXI_mtestvectorlite + 1)
131 dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.WRITE_BURST_CONCURRENT( S00_AXI_mtestAddress,
132 S00_AXI_mtestProtection_lite,
133 S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],
134 S00_AXI_mtestdatasizelite,
135 S00_AXI_lite_response);
136 $display("EXAMPLE TEST %d write : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_lite_response);
137 CHECK_RESPONSE_OKAY(S00_AXI_lite_response);
138 dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.READ_BURST(S00_AXI_mtestAddress,
139 S00_AXI_mtestProtection_lite,
140 S00_AXI_rd_data_lite,
141 S00_AXI_lite_response);
142 $display("EXAMPLE TEST %d read : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_rd_data_lite,S00_AXI_lite_response);
143 CHECK_RESPONSE_OKAY(S00_AXI_lite_response);
144 COMPARE_LITE_DATA(S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_rd_data_lite);
145 $display("EXAMPLE TEST %d : Sequential write and read burst transfers complete from the master side. %d",S00_AXI_mtestvectorlite,S00_AXI_mtestvectorlite);
146 S00_AXI_mtestAddress = S00_AXI_mtestAddress + 32'h00000004;
149 $display("---------------------------------------------------------");
150 $display("EXAMPLE TEST S00_AXI: PTGEN_TEST_FINISHED!");
151 if ( result_slave_lite ) begin
152 $display("PTGEN_TEST: PASSED!");
154 $display("PTGEN_TEST: FAILED!");
156 $display("---------------------------------------------------------");
160 // Create the test vectors
162 // When performing debug enable all levels of INFO messages.
163 wait(tb_ARESETn === 0) @(posedge tb_ACLK);
164 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
165 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
166 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
167 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
169 dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.set_channel_level_info(1);
171 // Create test data vectors
172 S00_AXI_test_data_lite[0] = 32'h0101FFFF;
173 S00_AXI_test_data_lite[1] = 32'habcd0001;
174 S00_AXI_test_data_lite[2] = 32'hdead0011;
175 S00_AXI_test_data_lite[3] = 32'hbeef0011;
180 // Wait for end of reset
181 wait(tb_ARESETn === 0) @(posedge tb_ACLK);
182 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
183 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
184 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
185 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
193 // Wait for end of reset
194 wait(tb_ARESETn === 0) @(posedge tb_ACLK);
195 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
196 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
197 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
198 wait(tb_ARESETn === 1) @(posedge tb_ACLK);
200 M00_AXI_INIT_AXI_TXN = 1'b0;
201 #500 M00_AXI_INIT_AXI_TXN = 1'b1;
203 $display("EXAMPLE TEST M00_AXI:");
204 wait( M00_AXI_TXN_DONE == 1'b1);
205 $display("M00_AXI: PTGEN_TEST_FINISHED!");
206 if ( M00_AXI_ERROR ) begin
207 $display("PTGEN_TEST: FAILED!");
209 $display("PTGEN_TEST: PASSED!");