OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [avalon_lib/] [sim/] [src/] [amm_bfm/] [amm_slave_bfm_if.sv] - Blame information for rev 31

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 31 qaztronic
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2015 Authors and OPENCORES.ORG                 ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 2.1 of the License, or (at your option) any   ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27
 
28
 
29
interface
30
  amm_slave_bfm_if
31
  #(
32
    A = 32, // address bus width
33
    N = 8   // data bus width in bytes
34
  )
35
  (
36
    amm_if amm_m,
37
    output reset,
38
    output clk
39
  );
40
 
41
        logic [(A-1):0]   address;
42
        logic             read;
43
        logic   [(8*N)-1:0] readdata;
44
        logic             write;
45
        logic   [(8*N)-1:0] writedata;
46
        logic   [N-1:0]     byteenable;
47
        logic             begintransfer;
48
        logic             waitrequest;
49
        logic             arbiterlock;
50
        logic             readdatavalid;
51
        logic   [6:0]       burstcount;
52
        logic               beginbursttransfer;
53
        logic               readyfordata;
54
        logic               dataavailable;
55
        logic               resetrequest;
56
 
57
 
58
  // --------------------------------------------------------------------
59
  //
60
  default clocking cb @(posedge clk);
61
    input   address;
62
    input   read;
63
    output  readdata;
64
    input   write;
65
    input   writedata;
66
    input   byteenable;
67
    input   begintransfer;
68
    output  waitrequest;
69
    input   arbiterlock;
70
    output  readdatavalid;
71
    input   burstcount;
72
    input   beginbursttransfer;
73
    output  readyfordata;
74
    output  dataavailable;
75
    output  resetrequest;
76
    input   reset;
77
    input   clk;
78
  endclocking
79
 
80
 
81
  // --------------------------------------------------------------------
82
  //
83
  assign address              = amm_m.address;
84
  assign read                 = amm_m.read;
85
  assign amm_m.readdata       = readdata;
86
  assign write                = amm_m.write;
87
  assign writedata            = amm_m.writedata;
88
  assign byteenable           = amm_m.byteenable;
89
  assign begintransfer        = amm_m.begintransfer;
90
  assign amm_m.waitrequest    = waitrequest;
91
  assign arbiterlock          = amm_m.arbiterlock;
92
  assign amm_m.readdatavalid  = readdatavalid;
93
  assign burstcount           = amm_m.burstcount;
94
  assign beginbursttransfer   = amm_m.beginbursttransfer;
95
  assign amm_m.readyfordata   = readyfordata;
96
  assign amm_m.dataavailable  = dataavailable;
97
  assign amm_m.resetrequest   = resetrequest;
98
 
99
 
100
  // --------------------------------------------------------------------
101
  //
102
  function void
103
    set_address_default;
104
 
105
    waitrequest   = 1;
106
 
107
  endfunction: set_address_default
108
 
109
 
110
  // --------------------------------------------------------------------
111
  //
112
  function void
113
    set_data_default;
114
 
115
    readdata      = 'bx;
116
    readdatavalid = 0;
117
 
118
  endfunction: set_data_default
119
 
120
 
121
  // --------------------------------------------------------------------
122
  //
123
  function void
124
    init;
125
 
126
    readyfordata  = 'bz;
127
    dataavailable = 'bz;
128
    resetrequest  = 'bz;
129
 
130
    set_address_default();
131
    set_data_default();
132
 
133
  endfunction: init
134
 
135
 
136
  // --------------------------------------------------------------------
137
  //
138
  task
139
    zero_cycle_delay;
140
 
141
    ##0;
142
 
143
  endtask: zero_cycle_delay
144
 
145
 
146
  // --------------------------------------------------------------------
147
  //
148
  import q_pkg::*;
149
  import axi4_transaction_pkg::*;
150
 
151
 
152
  // --------------------------------------------------------------------
153
  //
154
  class slave_write_transaction_class #(A = 32, N = 8, I = 1)
155
    extends blocking_transmission_q_class #(axi4_transaction_class);
156
 
157
    // --------------------------------------------------------------------
158
    //
159
    task automatic
160
      transmit
161
      (
162
        ref T tr_h
163
      );
164
 
165
      ->this.start;
166
 
167
      foreach(tr_h.payload_h.w[i])
168
      begin
169
        ##(tr_h.delay_h.next());
170
 
171
        cb.waitrequest <= 0;
172
        ##1;
173
        wait(cb.write);
174
        $display("^^^ %16.t | %m | AMM slave write  | %0d | 0x%016x |", $time, i, tr_h.payload_h.w[i]);
175
        cb.waitrequest <= 1;
176
      end
177
 
178
      set_address_default();
179
      set_data_default();
180
 
181
      ->this.done;
182
 
183
    endtask: transmit
184
 
185
 
186
  // --------------------------------------------------------------------
187
  //
188
  endclass: slave_write_transaction_class
189
 
190
 
191
  // --------------------------------------------------------------------
192
  //
193
  class slave_read_data_transaction_class #(A = 32, N = 8, I = 1)
194
    extends blocking_transmission_q_class #(axi4_transaction_class);
195
 
196
    // --------------------------------------------------------------------
197
    //
198
    task automatic
199
      transmit
200
      (
201
        ref T tr_h
202
      );
203
 
204
      ->this.start;
205
 
206
      foreach(tr_h.payload_h.w[i])
207
      begin
208
        if(tr_h.payload_h.w.size > 1)
209
          ##1;  // slave burst response must be at lease one cycle after read address phase
210
 
211
        ##(tr_h.delay_h.next());
212
 
213
        cb.readdata <= tr_h.payload_h.w[i];
214
        cb.readdatavalid <= 1;
215
        ##1;
216
        $display("^^^ %16.t | %m | AMM slave read data  | %0d of %0d | 0x%016x |", $time, i + 1, tr_h.payload_h.w.size, tr_h.payload_h.w[i]);
217
        cb.readdatavalid <= 0;
218
        cb.readdata <= 'bx;
219
      end
220
 
221
      set_data_default();
222
 
223
      ->this.done;
224
 
225
    endtask: transmit
226
 
227
  // --------------------------------------------------------------------
228
  //
229
  endclass: slave_read_data_transaction_class
230
 
231
 
232
  // --------------------------------------------------------------------
233
  //
234
  slave_read_data_transaction_class #(.A(A), .N(N), .I(1)) r_h;
235
 
236
  class slave_read_address_transaction_class #(A = 32, N = 8, I = 1)
237
    extends blocking_transmission_q_class #(axi4_transaction_class);
238
 
239
    // --------------------------------------------------------------------
240
    //
241
    task automatic
242
      transmit
243
      (
244
        ref T tr_h
245
      );
246
 
247
      ->this.start;
248
 
249
      ##(tr_h.delay_h.next());
250
      cb.waitrequest <= 0;
251
      ##1;
252
 
253
      wait(cb.read)
254
      ##0;
255
      $display("^^^ %16.t | %m | AMM slave read address | 0x%08x | %0d |", $time, tr_h.addr, tr_h.len + 1);
256
 
257
      r_h.put(tr_h);
258
 
259
      set_address_default();
260
      ->this.done;
261
 
262
    endtask: transmit
263
 
264
 
265
  // --------------------------------------------------------------------
266
  //
267
  endclass: slave_read_address_transaction_class
268
 
269
 
270
  // --------------------------------------------------------------------
271
  //
272
  slave_write_transaction_class #(.A(A), .N(N), .I(1)) w_h;
273
  slave_read_address_transaction_class #(.A(A), .N(N), .I(1)) ar_h;
274
 
275
  initial
276
  begin
277
    init();
278
    w_h = new;
279
    w_h.init();
280
    ar_h = new;
281
    ar_h.init();
282
    r_h = new;
283
    r_h.init();
284
  end
285
 
286
 
287
// --------------------------------------------------------------------
288
//
289
 
290
endinterface
291
 
292
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.