1 |
2 |
dsmv |
//////////////////////////////////////////////////////////////////////////////////
|
2 |
|
|
// Company: ;)
|
3 |
|
|
// Engineer: Kuzmi4 (original src - des00)
|
4 |
|
|
//
|
5 |
|
|
// Create Date: 14:39:52 05/19/2010
|
6 |
|
|
// Design Name:
|
7 |
|
|
// Module Name: tb/wb_cross
|
8 |
|
|
// Project Name: DS_DMA
|
9 |
|
|
// Target Devices: no
|
10 |
|
|
// Tool versions: any with SV support
|
11 |
|
|
// Description:
|
12 |
|
|
//
|
13 |
|
|
// Multi-tests for WB_CROSS
|
14 |
|
|
// ==> oriented for 4KB MM division for WBS
|
15 |
|
|
//
|
16 |
|
|
// Revision:
|
17 |
|
|
// Revision 0.01 - File Created
|
18 |
|
|
//
|
19 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
20 |
|
|
`timescale 1ns / 1ps
|
21 |
|
|
|
22 |
|
|
`include "wb_intf.sv"
|
23 |
|
|
`include "wb_tb_simple_ram_slave.v"
|
24 |
|
|
|
25 |
|
|
module tb;
|
26 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
27 |
|
|
/**/
|
28 |
|
|
localparam lp_MASTER_Q = 8;
|
29 |
|
|
localparam lp_SLAVE_Q = 16;
|
30 |
|
|
//
|
31 |
|
|
localparam lp_ADDR_W = 32;
|
32 |
|
|
localparam lp_DATA_W = 64;
|
33 |
|
|
localparam lp_SEL_W = 8;
|
34 |
|
|
|
35 |
|
|
localparam lp_FULL_ADDR_RANGE = 33'h1_0000_0000; //
|
36 |
|
|
localparam lp_MY_MEM_SIZE = 512; // 512 WORDS (512x64bit)
|
37 |
|
|
//localparam lp_MY_MEM_SIZE = 4096; // 4K WORDS
|
38 |
|
|
// ==> wb_tb_simple_ram_slave: bit [pD_W-1 : 0] ram [16*512 : 0] !!!
|
39 |
|
|
/*
|
40 |
|
|
parameter lp_MASTER_Q = 2;
|
41 |
|
|
parameter lp_SLAVE_Q = 8;
|
42 |
|
|
//
|
43 |
|
|
parameter lp_ADDR_W = 32;
|
44 |
|
|
parameter lp_DATA_W = 64;
|
45 |
|
|
parameter lp_SEL_W = 8;*/
|
46 |
|
|
//
|
47 |
|
|
parameter bit [lp_ADDR_W-1 : 0] lp_SLAVE_ADDR_BASE [0 : lp_SLAVE_Q-1] = '{
|
48 |
|
|
32'h000_00,
|
49 |
|
|
32'h010_00,
|
50 |
|
|
32'h020_00,
|
51 |
|
|
32'h030_00,
|
52 |
|
|
32'h040_00,
|
53 |
|
|
32'h050_00,
|
54 |
|
|
32'h060_00,
|
55 |
|
|
32'h070_00,
|
56 |
|
|
32'h080_00,
|
57 |
|
|
32'h090_00,
|
58 |
|
|
32'h0A0_00,
|
59 |
|
|
32'h0B0_00,
|
60 |
|
|
32'h0C0_00,
|
61 |
|
|
32'h0D0_00,
|
62 |
|
|
32'h0E0_00,
|
63 |
|
|
32'h0F0_00
|
64 |
|
|
|
65 |
|
|
} ;
|
66 |
|
|
|
67 |
|
|
|
68 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
69 |
|
|
//
|
70 |
|
|
parameter p_Tclk = 10ns;
|
71 |
|
|
parameter p_Trst = 120ns;
|
72 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
73 |
|
|
// Declare SYS_CON stuff:
|
74 |
|
|
reg s_sys_clk;
|
75 |
|
|
reg s_sys_rst;
|
76 |
|
|
//
|
77 |
|
|
logic [2:0] wb_m_cti_i [0 : lp_MASTER_Q-1] ;
|
78 |
|
|
logic [1:0] wb_m_bte_i [0 : lp_MASTER_Q-1] ;
|
79 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_cyc_i ;
|
80 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_stb_i ;
|
81 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_we_i ;
|
82 |
|
|
logic [lp_ADDR_W-1 : 0] wb_m_adr_i [0 : lp_MASTER_Q-1] ;
|
83 |
|
|
logic [lp_DATA_W-1 : 0] wb_m_dat_i [0 : lp_MASTER_Q-1] ;
|
84 |
|
|
logic [lp_SEL_W-1 : 0] wb_m_sel_i [0 : lp_MASTER_Q-1] ;
|
85 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_ack_o ;
|
86 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_err_o ;
|
87 |
|
|
logic [lp_MASTER_Q-1 : 0] wb_m_rty_o ;
|
88 |
|
|
logic [lp_DATA_W-1 : 0] wb_m_dat_o [0 : lp_MASTER_Q-1] ;
|
89 |
|
|
|
90 |
|
|
logic [2:0] wb_s_cti_o [0 : lp_SLAVE_Q-1] ;
|
91 |
|
|
logic [1:0] wb_s_bte_o [0 : lp_SLAVE_Q-1] ;
|
92 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_ack_i ;
|
93 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_err_i ;
|
94 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_rty_i ;
|
95 |
|
|
logic [lp_DATA_W-1 : 0] wb_s_dat_i [0 : lp_SLAVE_Q-1] ;
|
96 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_cyc_o ;
|
97 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_stb_o ;
|
98 |
|
|
logic [lp_SLAVE_Q-1 : 0] wb_s_we_o ;
|
99 |
|
|
logic [lp_ADDR_W-1 : 0] wb_s_adr_o [0 : lp_SLAVE_Q-1] ;
|
100 |
|
|
logic [lp_DATA_W-1 : 0] wb_s_dat_o [0 : lp_SLAVE_Q-1] ;
|
101 |
|
|
logic [lp_SEL_W-1 : 0] wb_s_sel_o [0 : lp_SLAVE_Q-1] ;
|
102 |
|
|
//
|
103 |
|
|
int err_cnt = 0;
|
104 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
105 |
|
|
//
|
106 |
|
|
// Use CLASS
|
107 |
|
|
//
|
108 |
|
|
`include "wb_tb_simple_master.sv"
|
109 |
|
|
|
110 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
111 |
|
|
//
|
112 |
|
|
// System Clock:
|
113 |
|
|
//
|
114 |
|
|
always
|
115 |
|
|
begin : SYS_CLK
|
116 |
|
|
#(p_Tclk/2) s_sys_clk <= !s_sys_clk;
|
117 |
|
|
end
|
118 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
119 |
|
|
//
|
120 |
|
|
// Instaniate WB_SLAVEs:
|
121 |
|
|
//
|
122 |
|
|
generate
|
123 |
|
|
for (genvar i = 0; i < lp_SLAVE_Q; i++) begin : slave_ram_gen
|
124 |
|
|
wb_tb_simple_ram_slave
|
125 |
|
|
#(
|
126 |
|
|
.pA_W ( lp_ADDR_W ) ,
|
127 |
|
|
.pD_W ( lp_DATA_W ) ,
|
128 |
|
|
.pSEL_W ( lp_SEL_W )
|
129 |
|
|
)
|
130 |
|
|
ram_slave
|
131 |
|
|
(
|
132 |
|
|
.clk ( s_sys_clk ) ,
|
133 |
|
|
.rst ( s_sys_rst ) ,
|
134 |
|
|
//
|
135 |
|
|
.cyc_i ( wb_s_cyc_o [i] ) ,
|
136 |
|
|
.stb_i ( wb_s_stb_o [i] ) ,
|
137 |
|
|
.we_i ( wb_s_we_o [i] ) ,
|
138 |
|
|
.adr_i ( {20'b0, wb_s_adr_o [i][11:0]} ) , // NB!!! 4KB WORD-ADDR ROUTE for now
|
139 |
|
|
.dat_i ( wb_s_dat_o [i] ) ,
|
140 |
|
|
.sel_i ( wb_s_sel_o [i] ) ,
|
141 |
|
|
//
|
142 |
|
|
.ack_o ( wb_s_ack_i [i] ) ,
|
143 |
|
|
.err_o ( wb_s_err_i [i] ) ,
|
144 |
|
|
.rty_o ( wb_s_rty_i [i] ) ,
|
145 |
|
|
.dat_o ( wb_s_dat_i [i] )
|
146 |
|
|
);
|
147 |
|
|
end
|
148 |
|
|
endgenerate
|
149 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
150 |
|
|
//
|
151 |
|
|
// Deal with WB MASTER stuff:
|
152 |
|
|
//
|
153 |
|
|
// wb_master if:
|
154 |
|
|
wb_m_if #(lp_ADDR_W, lp_DATA_W, lp_SEL_W) m_if[0 : lp_MASTER_Q-1] (s_sys_clk, s_sys_rst);
|
155 |
|
|
// wb master class:
|
156 |
|
|
wb_tb_simple_master wbm [lp_MASTER_Q];
|
157 |
|
|
// route wires
|
158 |
|
|
generate
|
159 |
|
|
for (genvar i = 0; i < lp_MASTER_Q ; i++) begin : WBM_ROUTE
|
160 |
|
|
assign wb_m_cyc_i[i] = m_if[i].cyc_o;
|
161 |
|
|
assign wb_m_stb_i[i] = m_if[i].stb_o;
|
162 |
|
|
assign wb_m_we_i [i] = m_if[i].we_o ;
|
163 |
|
|
assign wb_m_adr_i[i] = m_if[i].adr_o;
|
164 |
|
|
assign wb_m_dat_i[i] = m_if[i].dat_o;
|
165 |
|
|
assign wb_m_sel_i[i] = m_if[i].sel_o;
|
166 |
|
|
|
167 |
|
|
assign m_if[i].ack_i = wb_m_ack_o[i];
|
168 |
|
|
assign m_if[i].err_i = wb_m_err_o[i];
|
169 |
|
|
assign m_if[i].rty_i = wb_m_rty_o[i];
|
170 |
|
|
assign m_if[i].dat_i = wb_m_dat_o[i];
|
171 |
|
|
end
|
172 |
|
|
endgenerate
|
173 |
|
|
//
|
174 |
|
|
generate
|
175 |
|
|
for (genvar i = 0; i < lp_MASTER_Q; i++) begin : CRE_WBM
|
176 |
|
|
initial begin : menthor_hack
|
177 |
|
|
wbm[i] = new("master", m_if[i]);
|
178 |
|
|
end
|
179 |
|
|
end
|
180 |
|
|
endgenerate
|
181 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
182 |
|
|
//
|
183 |
|
|
// Instaniate DEFAULT CLOCKING BLOCK:
|
184 |
|
|
//
|
185 |
|
|
default clocking cb @(s_sys_clk);
|
186 |
|
|
endclocking
|
187 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
188 |
|
|
//
|
189 |
|
|
// Local Initial PowerOnReset:
|
190 |
|
|
//
|
191 |
|
|
initial
|
192 |
|
|
begin : init_POR
|
193 |
|
|
//
|
194 |
|
|
$timeformat(-9, 3, " ns", 10);
|
195 |
|
|
//
|
196 |
|
|
s_sys_clk <= 0;
|
197 |
|
|
s_sys_rst <= 0;
|
198 |
|
|
|
199 |
|
|
// PowerOnReset case
|
200 |
|
|
s_sys_rst <= 1; #p_Trst;
|
201 |
|
|
s_sys_rst <= 0;
|
202 |
|
|
|
203 |
|
|
end
|
204 |
|
|
|
205 |
|
|
initial
|
206 |
|
|
begin : CRE_WB_CTI_BTE
|
207 |
|
|
|
208 |
|
|
for (int i=0;i<lp_MASTER_Q;i++)
|
209 |
|
|
begin
|
210 |
|
|
wb_m_cti_i[i] = i+$urandom_range(0, lp_MASTER_Q-1);
|
211 |
|
|
wb_m_bte_i[i] = i+1+$urandom_range(0, lp_MASTER_Q-1);
|
212 |
|
|
end
|
213 |
|
|
|
214 |
|
|
end
|
215 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
216 |
|
|
//
|
217 |
|
|
// Test:
|
218 |
|
|
//
|
219 |
|
|
initial
|
220 |
|
|
begin : TB
|
221 |
|
|
// Init MSG:
|
222 |
|
|
$display("==> test start.");
|
223 |
|
|
// Provide WB_MASTERs INIT:
|
224 |
|
|
foreach (wbm[i]) begin
|
225 |
|
|
wbm[i].init();
|
226 |
|
|
end;
|
227 |
|
|
// W8 PowerOnReset:
|
228 |
|
|
do @(posedge s_sys_clk);
|
229 |
|
|
while (s_sys_rst); #1us;
|
230 |
|
|
// Main tests:
|
231 |
|
|
single_master_multi_slave_test(1); //
|
232 |
|
|
multi_master_single_slave_test(1, 0); // nlock
|
233 |
|
|
multi_master_single_slave_test(1, 1); // lock
|
234 |
|
|
multi_master_multi_slave_test (1, 0); // nlock
|
235 |
|
|
multi_master_multi_slave_test (1, 1); // lock
|
236 |
|
|
/**/
|
237 |
|
|
// Final:
|
238 |
|
|
$display("==> test done. errors = %0d", err_cnt);
|
239 |
|
|
#100ns;
|
240 |
|
|
$finish(2);
|
241 |
|
|
end
|
242 |
|
|
|
243 |
|
|
initial
|
244 |
|
|
begin : WB_CTI_BTE_PROCESS
|
245 |
|
|
//
|
246 |
|
|
// W8 PowerOnReset:
|
247 |
|
|
do @(posedge s_sys_clk);
|
248 |
|
|
while (s_sys_rst); #1us;
|
249 |
|
|
//
|
250 |
|
|
// START req stuff:
|
251 |
|
|
for (int i=0;i<lp_MASTER_Q;i++)
|
252 |
|
|
monitor_wb_cti_bte(i);
|
253 |
|
|
|
254 |
|
|
end
|
255 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
256 |
|
|
//
|
257 |
|
|
//
|
258 |
|
|
//
|
259 |
|
|
wb_conmax_top DUT
|
260 |
|
|
(
|
261 |
|
|
// SYS_CON
|
262 |
|
|
.clk_i ( s_sys_clk ),
|
263 |
|
|
.rst_i ( s_sys_rst ),
|
264 |
|
|
//
|
265 |
|
|
// Master #0
|
266 |
|
|
// Wishbone Master interface
|
267 |
|
|
.m0_data_i ( wb_m_dat_i[0] ),
|
268 |
|
|
.m0_addr_i ( wb_m_adr_i[0] ),
|
269 |
|
|
.m0_sel_i ( wb_m_sel_i[0] ),
|
270 |
|
|
.m0_we_i ( wb_m_we_i [0] ),
|
271 |
|
|
.m0_cyc_i ( wb_m_cyc_i[0] ),
|
272 |
|
|
.m0_stb_i ( wb_m_stb_i[0] ),
|
273 |
|
|
.m0_cti_i ( wb_m_cti_i[0] ),
|
274 |
|
|
.m0_bte_i ( wb_m_bte_i[0] ),
|
275 |
|
|
|
276 |
|
|
.m0_data_o ( wb_m_dat_o[0] ),
|
277 |
|
|
.m0_ack_o ( wb_m_ack_o[0] ),
|
278 |
|
|
.m0_err_o ( wb_m_err_o[0] ),
|
279 |
|
|
.m0_rty_o ( wb_m_rty_o[0] ),
|
280 |
|
|
//
|
281 |
|
|
// Master #1
|
282 |
|
|
// Wishbone Master interface
|
283 |
|
|
.m1_data_i ( wb_m_dat_i[1] ),
|
284 |
|
|
.m1_addr_i ( wb_m_adr_i[1] ),
|
285 |
|
|
.m1_sel_i ( wb_m_sel_i[1] ),
|
286 |
|
|
.m1_we_i ( wb_m_we_i [1] ),
|
287 |
|
|
.m1_cyc_i ( wb_m_cyc_i[1] ),
|
288 |
|
|
.m1_stb_i ( wb_m_stb_i[1] ),
|
289 |
|
|
.m1_cti_i ( wb_m_cti_i[1] ),
|
290 |
|
|
.m1_bte_i ( wb_m_bte_i[1] ),
|
291 |
|
|
|
292 |
|
|
.m1_data_o ( wb_m_dat_o[1] ),
|
293 |
|
|
.m1_ack_o ( wb_m_ack_o[1] ),
|
294 |
|
|
.m1_err_o ( wb_m_err_o[1] ),
|
295 |
|
|
.m1_rty_o ( wb_m_rty_o[1] ),
|
296 |
|
|
//
|
297 |
|
|
// Master #2
|
298 |
|
|
// Wishbone Master interface
|
299 |
|
|
.m2_data_i ( wb_m_dat_i[2] ),
|
300 |
|
|
.m2_addr_i ( wb_m_adr_i[2] ),
|
301 |
|
|
.m2_sel_i ( wb_m_sel_i[2] ),
|
302 |
|
|
.m2_we_i ( wb_m_we_i [2] ),
|
303 |
|
|
.m2_cyc_i ( wb_m_cyc_i[2] ),
|
304 |
|
|
.m2_stb_i ( wb_m_stb_i[2] ),
|
305 |
|
|
.m2_cti_i ( wb_m_cti_i[2] ),
|
306 |
|
|
.m2_bte_i ( wb_m_bte_i[2] ),
|
307 |
|
|
|
308 |
|
|
.m2_data_o ( wb_m_dat_o[2] ),
|
309 |
|
|
.m2_ack_o ( wb_m_ack_o[2] ),
|
310 |
|
|
.m2_err_o ( wb_m_err_o[2] ),
|
311 |
|
|
.m2_rty_o ( wb_m_rty_o[2] ),
|
312 |
|
|
//
|
313 |
|
|
// Master #3
|
314 |
|
|
// Wishbone Master interface
|
315 |
|
|
.m3_data_i ( wb_m_dat_i[3] ),
|
316 |
|
|
.m3_addr_i ( wb_m_adr_i[3] ),
|
317 |
|
|
.m3_sel_i ( wb_m_sel_i[3] ),
|
318 |
|
|
.m3_we_i ( wb_m_we_i [3] ),
|
319 |
|
|
.m3_cyc_i ( wb_m_cyc_i[3] ),
|
320 |
|
|
.m3_stb_i ( wb_m_stb_i[3] ),
|
321 |
|
|
.m3_cti_i ( wb_m_cti_i[3] ),
|
322 |
|
|
.m3_bte_i ( wb_m_bte_i[3] ),
|
323 |
|
|
|
324 |
|
|
.m3_data_o ( wb_m_dat_o[3] ),
|
325 |
|
|
.m3_ack_o ( wb_m_ack_o[3] ),
|
326 |
|
|
.m3_err_o ( wb_m_err_o[3] ),
|
327 |
|
|
.m3_rty_o ( wb_m_rty_o[3] ),
|
328 |
|
|
//
|
329 |
|
|
// Master #4
|
330 |
|
|
// Wishbone Master interface
|
331 |
|
|
.m4_data_i ( wb_m_dat_i[4] ),
|
332 |
|
|
.m4_addr_i ( wb_m_adr_i[4] ),
|
333 |
|
|
.m4_sel_i ( wb_m_sel_i[4] ),
|
334 |
|
|
.m4_we_i ( wb_m_we_i [4] ),
|
335 |
|
|
.m4_cyc_i ( wb_m_cyc_i[4] ),
|
336 |
|
|
.m4_stb_i ( wb_m_stb_i[4] ),
|
337 |
|
|
.m4_cti_i ( wb_m_cti_i[4] ),
|
338 |
|
|
.m4_bte_i ( wb_m_bte_i[4] ),
|
339 |
|
|
|
340 |
|
|
.m4_data_o ( wb_m_dat_o[4] ),
|
341 |
|
|
.m4_ack_o ( wb_m_ack_o[4] ),
|
342 |
|
|
.m4_err_o ( wb_m_err_o[4] ),
|
343 |
|
|
.m4_rty_o ( wb_m_rty_o[4] ),
|
344 |
|
|
//
|
345 |
|
|
// Master #5
|
346 |
|
|
// Wishbone Master interface
|
347 |
|
|
.m5_data_i ( wb_m_dat_i[5] ),
|
348 |
|
|
.m5_addr_i ( wb_m_adr_i[5] ),
|
349 |
|
|
.m5_sel_i ( wb_m_sel_i[5] ),
|
350 |
|
|
.m5_we_i ( wb_m_we_i [5] ),
|
351 |
|
|
.m5_cyc_i ( wb_m_cyc_i[5] ),
|
352 |
|
|
.m5_stb_i ( wb_m_stb_i[5] ),
|
353 |
|
|
.m5_cti_i ( wb_m_cti_i[5] ),
|
354 |
|
|
.m5_bte_i ( wb_m_bte_i[5] ),
|
355 |
|
|
|
356 |
|
|
.m5_data_o ( wb_m_dat_o[5] ),
|
357 |
|
|
.m5_ack_o ( wb_m_ack_o[5] ),
|
358 |
|
|
.m5_err_o ( wb_m_err_o[5] ),
|
359 |
|
|
.m5_rty_o ( wb_m_rty_o[5] ),
|
360 |
|
|
//
|
361 |
|
|
// Master #6
|
362 |
|
|
// Wishbone Master interfac
|
363 |
|
|
.m6_data_i ( wb_m_dat_i[6] ),
|
364 |
|
|
.m6_addr_i ( wb_m_adr_i[6] ),
|
365 |
|
|
.m6_sel_i ( wb_m_sel_i[6] ),
|
366 |
|
|
.m6_we_i ( wb_m_we_i [6] ),
|
367 |
|
|
.m6_cyc_i ( wb_m_cyc_i[6] ),
|
368 |
|
|
.m6_stb_i ( wb_m_stb_i[6] ),
|
369 |
|
|
.m6_cti_i ( wb_m_cti_i[6] ),
|
370 |
|
|
.m6_bte_i ( wb_m_bte_i[6] ),
|
371 |
|
|
|
372 |
|
|
.m6_data_o ( wb_m_dat_o[6] ),
|
373 |
|
|
.m6_ack_o ( wb_m_ack_o[6] ),
|
374 |
|
|
.m6_err_o ( wb_m_err_o[6] ),
|
375 |
|
|
.m6_rty_o ( wb_m_rty_o[6] ),
|
376 |
|
|
//
|
377 |
|
|
// Master #7
|
378 |
|
|
// Wishbone Master interface
|
379 |
|
|
.m7_data_i ( wb_m_dat_i[7] ),
|
380 |
|
|
.m7_addr_i ( wb_m_adr_i[7] ),
|
381 |
|
|
.m7_sel_i ( wb_m_sel_i[7] ),
|
382 |
|
|
.m7_we_i ( wb_m_we_i [7] ),
|
383 |
|
|
.m7_cyc_i ( wb_m_cyc_i[7] ),
|
384 |
|
|
.m7_stb_i ( wb_m_stb_i[7] ),
|
385 |
|
|
.m7_cti_i ( wb_m_cti_i[7] ),
|
386 |
|
|
.m7_bte_i ( wb_m_bte_i[7] ),
|
387 |
|
|
|
388 |
|
|
.m7_data_o ( wb_m_dat_o[7] ),
|
389 |
|
|
.m7_ack_o ( wb_m_ack_o[7] ),
|
390 |
|
|
.m7_err_o ( wb_m_err_o[7] ),
|
391 |
|
|
.m7_rty_o ( wb_m_rty_o[7] ),
|
392 |
|
|
|
393 |
|
|
//
|
394 |
|
|
// Slave #0
|
395 |
|
|
// Wishbone Slave interface
|
396 |
|
|
.s0_data_o ( wb_s_dat_o[0] ),
|
397 |
|
|
.s0_addr_o ( wb_s_adr_o[0] ),
|
398 |
|
|
.s0_sel_o ( wb_s_sel_o[0] ),
|
399 |
|
|
.s0_we_o ( wb_s_we_o [0] ),
|
400 |
|
|
.s0_cyc_o ( wb_s_cyc_o[0] ),
|
401 |
|
|
.s0_stb_o ( wb_s_stb_o[0] ),
|
402 |
|
|
.s0_cti_o ( wb_s_cti_o[0] ),
|
403 |
|
|
.s0_bte_o ( wb_s_bte_o[0] ),
|
404 |
|
|
|
405 |
|
|
.s0_data_i ( wb_s_dat_i[0] ),
|
406 |
|
|
.s0_ack_i ( wb_s_ack_i[0] ),
|
407 |
|
|
.s0_err_i ( wb_s_err_i[0] ),
|
408 |
|
|
.s0_rty_i ( wb_s_rty_i[0] ),
|
409 |
|
|
//
|
410 |
|
|
// Slave #1
|
411 |
|
|
// Wishbone Slave interface
|
412 |
|
|
.s1_data_o ( wb_s_dat_o[1] ),
|
413 |
|
|
.s1_addr_o ( wb_s_adr_o[1] ),
|
414 |
|
|
.s1_sel_o ( wb_s_sel_o[1] ),
|
415 |
|
|
.s1_we_o ( wb_s_we_o [1] ),
|
416 |
|
|
.s1_cyc_o ( wb_s_cyc_o[1] ),
|
417 |
|
|
.s1_stb_o ( wb_s_stb_o[1] ),
|
418 |
|
|
.s1_cti_o ( wb_s_cti_o[1] ),
|
419 |
|
|
.s1_bte_o ( wb_s_bte_o[1] ),
|
420 |
|
|
|
421 |
|
|
.s1_data_i ( wb_s_dat_i[1] ),
|
422 |
|
|
.s1_ack_i ( wb_s_ack_i[1] ),
|
423 |
|
|
.s1_err_i ( wb_s_err_i[1] ),
|
424 |
|
|
.s1_rty_i ( wb_s_rty_i[1] ),
|
425 |
|
|
//
|
426 |
|
|
// Slave #2
|
427 |
|
|
// Wishbone Slave interface
|
428 |
|
|
.s2_data_o ( wb_s_dat_o[2] ),
|
429 |
|
|
.s2_addr_o ( wb_s_adr_o[2] ),
|
430 |
|
|
.s2_sel_o ( wb_s_sel_o[2] ),
|
431 |
|
|
.s2_we_o ( wb_s_we_o [2] ),
|
432 |
|
|
.s2_cyc_o ( wb_s_cyc_o[2] ),
|
433 |
|
|
.s2_stb_o ( wb_s_stb_o[2] ),
|
434 |
|
|
.s2_cti_o ( wb_s_cti_o[2] ),
|
435 |
|
|
.s2_bte_o ( wb_s_bte_o[2] ),
|
436 |
|
|
|
437 |
|
|
.s2_data_i ( wb_s_dat_i[2] ),
|
438 |
|
|
.s2_ack_i ( wb_s_ack_i[2] ),
|
439 |
|
|
.s2_err_i ( wb_s_err_i[2] ),
|
440 |
|
|
.s2_rty_i ( wb_s_rty_i[2] ),
|
441 |
|
|
//
|
442 |
|
|
// Slave #3
|
443 |
|
|
// Wishbone Slave interface
|
444 |
|
|
.s3_data_o ( wb_s_dat_o[3] ),
|
445 |
|
|
.s3_addr_o ( wb_s_adr_o[3] ),
|
446 |
|
|
.s3_sel_o ( wb_s_sel_o[3] ),
|
447 |
|
|
.s3_we_o ( wb_s_we_o [3] ),
|
448 |
|
|
.s3_cyc_o ( wb_s_cyc_o[3] ),
|
449 |
|
|
.s3_stb_o ( wb_s_stb_o[3] ),
|
450 |
|
|
.s3_cti_o ( wb_s_cti_o[3] ),
|
451 |
|
|
.s3_bte_o ( wb_s_bte_o[3] ),
|
452 |
|
|
|
453 |
|
|
.s3_data_i ( wb_s_dat_i[3] ),
|
454 |
|
|
.s3_ack_i ( wb_s_ack_i[3] ),
|
455 |
|
|
.s3_err_i ( wb_s_err_i[3] ),
|
456 |
|
|
.s3_rty_i ( wb_s_rty_i[3] ),
|
457 |
|
|
//
|
458 |
|
|
// Slave #4
|
459 |
|
|
// Wishbone Slave interface
|
460 |
|
|
.s4_data_o ( wb_s_dat_o[4] ),
|
461 |
|
|
.s4_addr_o ( wb_s_adr_o[4] ),
|
462 |
|
|
.s4_sel_o ( wb_s_sel_o[4] ),
|
463 |
|
|
.s4_we_o ( wb_s_we_o [4] ),
|
464 |
|
|
.s4_cyc_o ( wb_s_cyc_o[4] ),
|
465 |
|
|
.s4_stb_o ( wb_s_stb_o[4] ),
|
466 |
|
|
.s4_cti_o ( wb_s_cti_o[4] ),
|
467 |
|
|
.s4_bte_o ( wb_s_bte_o[4] ),
|
468 |
|
|
|
469 |
|
|
.s4_data_i ( wb_s_dat_i[4] ),
|
470 |
|
|
.s4_ack_i ( wb_s_ack_i[4] ),
|
471 |
|
|
.s4_err_i ( wb_s_err_i[4] ),
|
472 |
|
|
.s4_rty_i ( wb_s_rty_i[4] ),
|
473 |
|
|
//
|
474 |
|
|
// Slave #5
|
475 |
|
|
// Wishbone Slave interface
|
476 |
|
|
.s5_data_o ( wb_s_dat_o[5] ),
|
477 |
|
|
.s5_addr_o ( wb_s_adr_o[5] ),
|
478 |
|
|
.s5_sel_o ( wb_s_sel_o[5] ),
|
479 |
|
|
.s5_we_o ( wb_s_we_o [5] ),
|
480 |
|
|
.s5_cyc_o ( wb_s_cyc_o[5] ),
|
481 |
|
|
.s5_stb_o ( wb_s_stb_o[5] ),
|
482 |
|
|
.s5_cti_o ( wb_s_cti_o[5] ),
|
483 |
|
|
.s5_bte_o ( wb_s_bte_o[5] ),
|
484 |
|
|
|
485 |
|
|
.s5_data_i ( wb_s_dat_i[5] ),
|
486 |
|
|
.s5_ack_i ( wb_s_ack_i[5] ),
|
487 |
|
|
.s5_err_i ( wb_s_err_i[5] ),
|
488 |
|
|
.s5_rty_i ( wb_s_rty_i[5] ),
|
489 |
|
|
//
|
490 |
|
|
// Slave #6
|
491 |
|
|
// Wishbone Slave interface
|
492 |
|
|
.s6_data_o ( wb_s_dat_o[6] ),
|
493 |
|
|
.s6_addr_o ( wb_s_adr_o[6] ),
|
494 |
|
|
.s6_sel_o ( wb_s_sel_o[6] ),
|
495 |
|
|
.s6_we_o ( wb_s_we_o [6] ),
|
496 |
|
|
.s6_cyc_o ( wb_s_cyc_o[6] ),
|
497 |
|
|
.s6_stb_o ( wb_s_stb_o[6] ),
|
498 |
|
|
.s6_cti_o ( wb_s_cti_o[6] ),
|
499 |
|
|
.s6_bte_o ( wb_s_bte_o[6] ),
|
500 |
|
|
|
501 |
|
|
.s6_data_i ( wb_s_dat_i[6] ),
|
502 |
|
|
.s6_ack_i ( wb_s_ack_i[6] ),
|
503 |
|
|
.s6_err_i ( wb_s_err_i[6] ),
|
504 |
|
|
.s6_rty_i ( wb_s_rty_i[6] ),
|
505 |
|
|
//
|
506 |
|
|
// Slave #7
|
507 |
|
|
// Wishbone Slave interface
|
508 |
|
|
.s7_data_o ( wb_s_dat_o[7] ),
|
509 |
|
|
.s7_addr_o ( wb_s_adr_o[7] ),
|
510 |
|
|
.s7_sel_o ( wb_s_sel_o[7] ),
|
511 |
|
|
.s7_we_o ( wb_s_we_o [7] ),
|
512 |
|
|
.s7_cyc_o ( wb_s_cyc_o[7] ),
|
513 |
|
|
.s7_stb_o ( wb_s_stb_o[7] ),
|
514 |
|
|
.s7_cti_o ( wb_s_cti_o[7] ),
|
515 |
|
|
.s7_bte_o ( wb_s_bte_o[7] ),
|
516 |
|
|
|
517 |
|
|
.s7_data_i ( wb_s_dat_i[7] ),
|
518 |
|
|
.s7_ack_i ( wb_s_ack_i[7] ),
|
519 |
|
|
.s7_err_i ( wb_s_err_i[7] ),
|
520 |
|
|
.s7_rty_i ( wb_s_rty_i[7] ),
|
521 |
|
|
//
|
522 |
|
|
// Slave #8
|
523 |
|
|
// Wishbone Slave interface
|
524 |
|
|
.s8_data_o ( wb_s_dat_o[8] ),
|
525 |
|
|
.s8_addr_o ( wb_s_adr_o[8] ),
|
526 |
|
|
.s8_sel_o ( wb_s_sel_o[8] ),
|
527 |
|
|
.s8_we_o ( wb_s_we_o [8] ),
|
528 |
|
|
.s8_cyc_o ( wb_s_cyc_o[8] ),
|
529 |
|
|
.s8_stb_o ( wb_s_stb_o[8] ),
|
530 |
|
|
.s8_cti_o ( wb_s_cti_o[8] ),
|
531 |
|
|
.s8_bte_o ( wb_s_bte_o[8] ),
|
532 |
|
|
|
533 |
|
|
.s8_data_i ( wb_s_dat_i[8] ),
|
534 |
|
|
.s8_ack_i ( wb_s_ack_i[8] ),
|
535 |
|
|
.s8_err_i ( wb_s_err_i[8] ),
|
536 |
|
|
.s8_rty_i ( wb_s_rty_i[8] ),
|
537 |
|
|
//
|
538 |
|
|
// Slave #9
|
539 |
|
|
// Wishbone Slave interface
|
540 |
|
|
.s9_data_o ( wb_s_dat_o[9] ),
|
541 |
|
|
.s9_addr_o ( wb_s_adr_o[9] ),
|
542 |
|
|
.s9_sel_o ( wb_s_sel_o[9] ),
|
543 |
|
|
.s9_we_o ( wb_s_we_o [9] ),
|
544 |
|
|
.s9_cyc_o ( wb_s_cyc_o[9] ),
|
545 |
|
|
.s9_stb_o ( wb_s_stb_o[9] ),
|
546 |
|
|
.s9_cti_o ( wb_s_cti_o[9] ),
|
547 |
|
|
.s9_bte_o ( wb_s_bte_o[9] ),
|
548 |
|
|
|
549 |
|
|
.s9_data_i ( wb_s_dat_i[9] ),
|
550 |
|
|
.s9_ack_i ( wb_s_ack_i[9] ),
|
551 |
|
|
.s9_err_i ( wb_s_err_i[9] ),
|
552 |
|
|
.s9_rty_i ( wb_s_rty_i[9] ),
|
553 |
|
|
//
|
554 |
|
|
// Slave #10
|
555 |
|
|
// Wishbone Slave interface
|
556 |
|
|
.s10_data_o ( wb_s_dat_o[10] ),
|
557 |
|
|
.s10_addr_o ( wb_s_adr_o[10] ),
|
558 |
|
|
.s10_sel_o ( wb_s_sel_o[10] ),
|
559 |
|
|
.s10_we_o ( wb_s_we_o [10] ),
|
560 |
|
|
.s10_cyc_o ( wb_s_cyc_o[10] ),
|
561 |
|
|
.s10_stb_o ( wb_s_stb_o[10] ),
|
562 |
|
|
.s10_cti_o ( wb_s_cti_o[10] ),
|
563 |
|
|
.s10_bte_o ( wb_s_bte_o[10] ),
|
564 |
|
|
|
565 |
|
|
.s10_data_i ( wb_s_dat_i[10] ),
|
566 |
|
|
.s10_ack_i ( wb_s_ack_i[10] ),
|
567 |
|
|
.s10_err_i ( wb_s_err_i[10] ),
|
568 |
|
|
.s10_rty_i ( wb_s_rty_i[10] ),
|
569 |
|
|
//
|
570 |
|
|
// Slave #11
|
571 |
|
|
// Wishbone Slave interface
|
572 |
|
|
.s11_data_o ( wb_s_dat_o[11] ),
|
573 |
|
|
.s11_addr_o ( wb_s_adr_o[11] ),
|
574 |
|
|
.s11_sel_o ( wb_s_sel_o[11] ),
|
575 |
|
|
.s11_we_o ( wb_s_we_o [11] ),
|
576 |
|
|
.s11_cyc_o ( wb_s_cyc_o[11] ),
|
577 |
|
|
.s11_stb_o ( wb_s_stb_o[11] ),
|
578 |
|
|
.s11_cti_o ( wb_s_cti_o[11] ),
|
579 |
|
|
.s11_bte_o ( wb_s_bte_o[11] ),
|
580 |
|
|
|
581 |
|
|
.s11_data_i ( wb_s_dat_i[11] ),
|
582 |
|
|
.s11_ack_i ( wb_s_ack_i[11] ),
|
583 |
|
|
.s11_err_i ( wb_s_err_i[11] ),
|
584 |
|
|
.s11_rty_i ( wb_s_rty_i[11] ),
|
585 |
|
|
//
|
586 |
|
|
// Slave #12
|
587 |
|
|
// Wishbone Slave interface
|
588 |
|
|
.s12_data_o ( wb_s_dat_o[12] ),
|
589 |
|
|
.s12_addr_o ( wb_s_adr_o[12] ),
|
590 |
|
|
.s12_sel_o ( wb_s_sel_o[12] ),
|
591 |
|
|
.s12_we_o ( wb_s_we_o [12] ),
|
592 |
|
|
.s12_cyc_o ( wb_s_cyc_o[12] ),
|
593 |
|
|
.s12_stb_o ( wb_s_stb_o[12] ),
|
594 |
|
|
.s12_cti_o ( wb_s_cti_o[12] ),
|
595 |
|
|
.s12_bte_o ( wb_s_bte_o[12] ),
|
596 |
|
|
|
597 |
|
|
.s12_data_i ( wb_s_dat_i[12] ),
|
598 |
|
|
.s12_ack_i ( wb_s_ack_i[12] ),
|
599 |
|
|
.s12_err_i ( wb_s_err_i[12] ),
|
600 |
|
|
.s12_rty_i ( wb_s_rty_i[12] ),
|
601 |
|
|
//
|
602 |
|
|
// Slave #13
|
603 |
|
|
// Wishbone Slave interface
|
604 |
|
|
.s13_data_o ( wb_s_dat_o[13] ),
|
605 |
|
|
.s13_addr_o ( wb_s_adr_o[13] ),
|
606 |
|
|
.s13_sel_o ( wb_s_sel_o[13] ),
|
607 |
|
|
.s13_we_o ( wb_s_we_o [13] ),
|
608 |
|
|
.s13_cyc_o ( wb_s_cyc_o[13] ),
|
609 |
|
|
.s13_stb_o ( wb_s_stb_o[13] ),
|
610 |
|
|
.s13_cti_o ( wb_s_cti_o[13] ),
|
611 |
|
|
.s13_bte_o ( wb_s_bte_o[13] ),
|
612 |
|
|
|
613 |
|
|
.s13_data_i ( wb_s_dat_i[13] ),
|
614 |
|
|
.s13_ack_i ( wb_s_ack_i[13] ),
|
615 |
|
|
.s13_err_i ( wb_s_err_i[13] ),
|
616 |
|
|
.s13_rty_i ( wb_s_rty_i[13] ),
|
617 |
|
|
//
|
618 |
|
|
// Slave #14
|
619 |
|
|
// Wishbone Slave interface
|
620 |
|
|
.s14_data_o ( wb_s_dat_o[14] ),
|
621 |
|
|
.s14_addr_o ( wb_s_adr_o[14] ),
|
622 |
|
|
.s14_sel_o ( wb_s_sel_o[14] ),
|
623 |
|
|
.s14_we_o ( wb_s_we_o [14] ),
|
624 |
|
|
.s14_cyc_o ( wb_s_cyc_o[14] ),
|
625 |
|
|
.s14_stb_o ( wb_s_stb_o[14] ),
|
626 |
|
|
.s14_cti_o ( wb_s_cti_o[14] ),
|
627 |
|
|
.s14_bte_o ( wb_s_bte_o[14] ),
|
628 |
|
|
|
629 |
|
|
.s14_data_i ( wb_s_dat_i[14] ),
|
630 |
|
|
.s14_ack_i ( wb_s_ack_i[14] ),
|
631 |
|
|
.s14_err_i ( wb_s_err_i[14] ),
|
632 |
|
|
.s14_rty_i ( wb_s_rty_i[14] ),
|
633 |
|
|
//
|
634 |
|
|
// Slave #15
|
635 |
|
|
// Wishbone Slave interface
|
636 |
|
|
.s15_data_o ( wb_s_dat_o[15] ),
|
637 |
|
|
.s15_addr_o ( wb_s_adr_o[15] ),
|
638 |
|
|
.s15_sel_o ( wb_s_sel_o[15] ),
|
639 |
|
|
.s15_we_o ( wb_s_we_o [15] ),
|
640 |
|
|
.s15_cyc_o ( wb_s_cyc_o[15] ),
|
641 |
|
|
.s15_stb_o ( wb_s_stb_o[15] ),
|
642 |
|
|
.s15_cti_o ( wb_s_cti_o[15] ),
|
643 |
|
|
.s15_bte_o ( wb_s_bte_o[15] ),
|
644 |
|
|
|
645 |
|
|
.s15_data_i ( wb_s_dat_i[15] ),
|
646 |
|
|
.s15_ack_i ( wb_s_ack_i[15] ),
|
647 |
|
|
.s15_err_i ( wb_s_err_i[15] ),
|
648 |
|
|
.s15_rty_i ( wb_s_rty_i[15] )
|
649 |
|
|
);
|
650 |
|
|
defparam DUT.dw = 64;
|
651 |
|
|
defparam DUT.aw = 32;
|
652 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
653 |
|
|
//
|
654 |
|
|
//
|
655 |
|
|
//
|
656 |
|
|
task monitor_wb_cti_bte (int ii_master_num);
|
657 |
|
|
//
|
658 |
|
|
fork
|
659 |
|
|
//
|
660 |
|
|
automatic int master_num = ii_master_num;
|
661 |
|
|
//
|
662 |
|
|
$display("[%t]: %m START, MASTER idx=%h", $time, master_num[7:0]);
|
663 |
|
|
forever
|
664 |
|
|
begin
|
665 |
|
|
##1;
|
666 |
|
|
if (wb_m_ack_o[master_num])
|
667 |
|
|
begin : WB_ACK
|
668 |
|
|
// WB_CTI:
|
669 |
|
|
if (wb_m_cti_i[master_num]!=wb_s_cti_o[get_slave_idx(wb_m_adr_i[master_num])])
|
670 |
|
|
begin : WB_CTI_ERR
|
671 |
|
|
$display("[%t]: %m, wb_m_cti_i[master_num]==%b", $time, wb_m_cti_i[master_num]);
|
672 |
|
|
$display("[%t]: %m, wb_m_adr_i[master_num]==%h", $time, wb_m_adr_i[master_num]);
|
673 |
|
|
$display("[%t]: %m, get_slave_idx(wb_s_adr_o[master_num])==%h", $time, get_slave_idx(wb_s_adr_o[master_num]));
|
674 |
|
|
$display("[%t]: %m, wb_s_cti_o[get_slave_idx(wb_s_adr_o[master_num])==%b",
|
675 |
|
|
$time,
|
676 |
|
|
wb_s_cti_o[get_slave_idx(wb_s_adr_o[master_num])]
|
677 |
|
|
);
|
678 |
|
|
|
679 |
|
|
$display("[%t]: %m, master_num==%h", $time, master_num[7:0]); #1ns;
|
680 |
|
|
$stop;
|
681 |
|
|
end
|
682 |
|
|
// WB_BTE:
|
683 |
|
|
if (wb_m_bte_i[master_num]!=wb_s_bte_o[get_slave_idx(wb_s_adr_o[master_num])])
|
684 |
|
|
begin : WB_BTE_ERR
|
685 |
|
|
$display("[%t]: %m, master_num==%h", $time, master_num[7:0]);
|
686 |
|
|
$stop;
|
687 |
|
|
end
|
688 |
|
|
end
|
689 |
|
|
end
|
690 |
|
|
join_none
|
691 |
|
|
//
|
692 |
|
|
endtask
|
693 |
|
|
/**/
|
694 |
|
|
//
|
695 |
|
|
// test when only 1 master is active and access to all slaves, NB!!! ==> USE ==> 512 WORDS
|
696 |
|
|
//
|
697 |
|
|
task single_master_multi_slave_test (int num = 1);
|
698 |
|
|
$display("%t single master multi slave test begin", $time);
|
699 |
|
|
test_begin();
|
700 |
|
|
//
|
701 |
|
|
for (int i = 0; i < num; i++) begin
|
702 |
|
|
for (int m = 0; m < lp_MASTER_Q; m++) begin
|
703 |
|
|
for (int j=0;j<lp_SLAVE_Q;j++) begin
|
704 |
|
|
//$display("[%t]: %m, SLAVE[%h] & MASTER[%h] begin", $time, j[7:0], m[7:0]);
|
705 |
|
|
// WBS#i check
|
706 |
|
|
wbm[m].generate_data_packet(lp_MY_MEM_SIZE); // ==> operate with lp_MY_MEM_SIZE WORDS
|
707 |
|
|
wbm[m].max_ws = 2+$urandom_range(0, j);
|
708 |
|
|
// use rnd mode
|
709 |
|
|
wbm[m].write_data_packet_locked(lp_SLAVE_ADDR_BASE[j], 1);
|
710 |
|
|
wbm[m].read_data_packet_locked(lp_SLAVE_ADDR_BASE[j], 1);
|
711 |
|
|
##10;
|
712 |
|
|
wbm[m].write_data_packet_nlocked(lp_SLAVE_ADDR_BASE[j], 1);
|
713 |
|
|
wbm[m].read_data_packet_nlocked(lp_SLAVE_ADDR_BASE[j], 1);
|
714 |
|
|
##10;
|
715 |
|
|
//$display("[%t]: %m, SLAVE[%h] & MASTER[%h] end", $time, j[7:0], m[7:0]);
|
716 |
|
|
end
|
717 |
|
|
end
|
718 |
|
|
end
|
719 |
|
|
//
|
720 |
|
|
$display("%t single master multi slave test end", $time);
|
721 |
|
|
test_end();
|
722 |
|
|
endtask
|
723 |
|
|
|
724 |
|
|
//
|
725 |
|
|
// test when multi masters is active and access to 1 slave
|
726 |
|
|
//
|
727 |
|
|
task multi_master_single_slave_test (int num = 1, lock = 0);
|
728 |
|
|
int slave_size;
|
729 |
|
|
int master_size;
|
730 |
|
|
int start_address ;
|
731 |
|
|
begin
|
732 |
|
|
if (lock)
|
733 |
|
|
$display("%t multi master single slave test with lock begin", $time);
|
734 |
|
|
else
|
735 |
|
|
$display("%t multi master single slave test with nlock begin", $time);
|
736 |
|
|
test_begin();
|
737 |
|
|
//
|
738 |
|
|
slave_size = lp_MY_MEM_SIZE/lp_SLAVE_Q; // let's all slaves have same size NB!!! ==> USE lp_MY_MEM_SIZE WORDS
|
739 |
|
|
master_size = slave_size/lp_MASTER_Q; // let's each master use same size of slave
|
740 |
|
|
//$display("%m, slave_size==%h", slave_size); $display("%m, master_size==%h", master_size);
|
741 |
|
|
for (int i = 0; i < num; i++) begin
|
742 |
|
|
for (int s = 0; s < lp_SLAVE_Q; s++) begin
|
743 |
|
|
for (int m = 0; m < lp_MASTER_Q; m++) begin
|
744 |
|
|
wbm[m].generate_data_packet(master_size);
|
745 |
|
|
wbm[m].max_ws = 2;
|
746 |
|
|
start_address = lp_SLAVE_ADDR_BASE[s] + m*master_size;
|
747 |
|
|
|
748 |
|
|
fork
|
749 |
|
|
automatic int _m = m;
|
750 |
|
|
automatic int _start_address = start_address;
|
751 |
|
|
begin
|
752 |
|
|
if (lock) begin
|
753 |
|
|
wbm[_m].write_data_packet_locked (_start_address, 1);
|
754 |
|
|
wbm[_m].read_data_packet_locked (_start_address, 1);
|
755 |
|
|
end
|
756 |
|
|
else begin
|
757 |
|
|
wbm[_m].write_data_packet_nlocked (_start_address, 1);
|
758 |
|
|
wbm[_m].read_data_packet_nlocked (_start_address, 1);
|
759 |
|
|
end
|
760 |
|
|
end
|
761 |
|
|
join_none
|
762 |
|
|
|
763 |
|
|
end
|
764 |
|
|
wait fork;
|
765 |
|
|
end
|
766 |
|
|
end
|
767 |
|
|
//
|
768 |
|
|
if (lock)
|
769 |
|
|
$display("%t multi master single slave with lock test end", $time);
|
770 |
|
|
else
|
771 |
|
|
$display("%t multi master single slave with nlock test end", $time);
|
772 |
|
|
test_end();
|
773 |
|
|
end
|
774 |
|
|
endtask
|
775 |
|
|
|
776 |
|
|
//
|
777 |
|
|
// test when multi masters is active and access to multi slave
|
778 |
|
|
//
|
779 |
|
|
|
780 |
|
|
task multi_master_multi_slave_test (int num = 1, lock = 0);
|
781 |
|
|
int ram_size;
|
782 |
|
|
int master_size;
|
783 |
|
|
int slave_size;
|
784 |
|
|
int start_address ;
|
785 |
|
|
begin
|
786 |
|
|
if (lock)
|
787 |
|
|
$display("%t multi master multi slave test with lock begin", $time);
|
788 |
|
|
else
|
789 |
|
|
$display("%t multi master multi slave test with nlock begin", $time);
|
790 |
|
|
test_begin();
|
791 |
|
|
//
|
792 |
|
|
ram_size = lp_MY_MEM_SIZE; // --> NB!!! ==> USE lp_MY_MEM_SIZE WORDS
|
793 |
|
|
master_size = ram_size/lp_MASTER_Q; // let's each master use same size of ram address
|
794 |
|
|
slave_size = ram_size/lp_SLAVE_Q; // let's each slave use same size or ram address
|
795 |
|
|
//
|
796 |
|
|
for (int i = 0; i < num; i++) begin
|
797 |
|
|
for (int s = 0; s < lp_SLAVE_Q; s++) begin
|
798 |
|
|
for (int m = 0; m < lp_MASTER_Q; m++) begin
|
799 |
|
|
wbm[m].generate_data_packet(master_size); //$display("%m, s==%h, master_size==%h", s, master_size);
|
800 |
|
|
wbm[m].max_ws = 2;
|
801 |
|
|
start_address = (s*slave_size + m*master_size) % ram_size;
|
802 |
|
|
|
803 |
|
|
fork
|
804 |
|
|
automatic int _m = m;
|
805 |
|
|
automatic int _start_address = start_address;
|
806 |
|
|
begin
|
807 |
|
|
if (lock) begin
|
808 |
|
|
wbm[_m].write_data_packet_locked (_start_address, 1);
|
809 |
|
|
wbm[_m].read_data_packet_locked (_start_address, 1);
|
810 |
|
|
end
|
811 |
|
|
else begin
|
812 |
|
|
wbm[_m].write_data_packet_nlocked (_start_address, 1); //$display("%m, write_data_packet_nlocked, _m==%h, _start_address==%h", _m, _start_address);
|
813 |
|
|
wbm[_m].read_data_packet_nlocked (_start_address, 1); //$display("%m, read_data_packet_nlocked, _m==%h, _start_address==%h", _m, _start_address);
|
814 |
|
|
end
|
815 |
|
|
end
|
816 |
|
|
join_none
|
817 |
|
|
|
818 |
|
|
end // m
|
819 |
|
|
wait fork;
|
820 |
|
|
end // s
|
821 |
|
|
end // i
|
822 |
|
|
//
|
823 |
|
|
if (lock)
|
824 |
|
|
$display("%t multi master multi slave with lock test end", $time);
|
825 |
|
|
else
|
826 |
|
|
$display("%t multi master multi slave with nlock test end", $time);
|
827 |
|
|
test_end();
|
828 |
|
|
end
|
829 |
|
|
endtask
|
830 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
831 |
|
|
//
|
832 |
|
|
// service functions
|
833 |
|
|
//
|
834 |
|
|
|
835 |
|
|
function void test_begin ();
|
836 |
|
|
foreach (wbm[i]) begin
|
837 |
|
|
wbm[i].err_cnt = 0;
|
838 |
|
|
end
|
839 |
|
|
endfunction
|
840 |
|
|
|
841 |
|
|
function void test_end ();
|
842 |
|
|
foreach (wbm[i]) begin
|
843 |
|
|
wbm[i].log();
|
844 |
|
|
err_cnt += wbm[i].err_cnt;
|
845 |
|
|
end
|
846 |
|
|
endfunction
|
847 |
|
|
/**/
|
848 |
|
|
function automatic int get_slave_idx( input bit [lp_ADDR_W-1:0] iv_addr);
|
849 |
|
|
//
|
850 |
|
|
for (int i=1;i<lp_SLAVE_Q;i++) // process all slaves
|
851 |
|
|
begin
|
852 |
|
|
if (iv_addr>=lp_SLAVE_ADDR_BASE[i-1] & iv_addr<lp_SLAVE_ADDR_BASE[i]) // ADDR in slave[i] range
|
853 |
|
|
return (i-1);
|
854 |
|
|
end
|
855 |
|
|
// ELSE - return MAX_VALUE
|
856 |
|
|
return ('1);
|
857 |
|
|
//
|
858 |
|
|
endfunction
|
859 |
|
|
/**/
|
860 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
861 |
|
|
endmodule
|