OpenCores
URL https://opencores.org/ocsvn/1g_ethernet_dpi/1g_ethernet_dpi/trunk

Subversion Repositories 1g_ethernet_dpi

[/] [1g_ethernet_dpi/] [tags/] [v0.0/] [hw/] [src/] [tb/] [bfm_ublaze/] [axi4_lite_master_bfm.sv] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 kuzmi4
//////////////////////////////////////////////////////////////////////////////////
2
// Company:         ;)
3
// Engineer:        IK
4
//
5
// Create Date:     11:35:01 03/21/2013
6
// Design Name:
7
// Module Name:     axi4_lite_master_bfm
8
// Project Name:
9
// Target Devices:
10
// Tool versions:
11
// Description:
12
//                  USAGE:
13
//                      READ()
14
//                      WRITE()
15
//
16
//
17
// Revision:
18
// Revision 0.01 - File Created,
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
`timescale 1ns / 1ps
22
 
23
module axi4_lite_master_bfm #
24
(
25
parameter   p_ADDRESS_BUS_WIDTH         =   32,
26
parameter   p_DATA_BUS_WIDTH            =   32,
27
parameter   p_AXI4_LITE_PROT_BUS_WIDTH  =    3,
28
parameter   p_AXI4_LITE_RESP_BUS_WIDTH  =    2,
29
parameter   p_RESPONSE_TIMEOUT          =   64
30
)
31
(
32
    // SYS_CON
33
    input   ACLK,
34
    input   ARESETn,
35
    //
36
    // Write Address Channel Signals
37
    output logic [p_ADDRESS_BUS_WIDTH-1:0]          AWADDR, // Master Write address
38
    output logic [p_AXI4_LITE_PROT_BUS_WIDTH-1:0]   AWPROT, // Master Protection type
39
    output logic                                    AWVALID,// Master Write address valid
40
    input                                           AWREADY,// Slave Write address ready
41
    // Write Data Channel Signals
42
    output logic [p_DATA_BUS_WIDTH-1:0]             WDATA,  // Master Write data
43
    output logic [(p_DATA_BUS_WIDTH/8)-1:0]         WSTRB,  // Master Write strobes
44
    output logic                                    WVALID, // Master Write valid
45
    input                                           WREADY, // Slave Write ready
46
    // Write Response Channel Signals
47
    input        [p_AXI4_LITE_RESP_BUS_WIDTH-1:0]   BRESP,  // Slave Write response
48
    input                                           BVALID, // Slave Write response valid
49
    output logic                                    BREADY, // Master Response ready
50
    //
51
    // Read Address Channel Signals
52
    output logic [p_ADDRESS_BUS_WIDTH-1:0]          ARADDR, // Master Read address
53
    output logic [p_AXI4_LITE_PROT_BUS_WIDTH-1:0]   ARPROT, // Master Protection type
54
    output logic                                    ARVALID,// Master Read address valid
55
    input                                           ARREADY,// Slave Read address ready
56
    // Read Data Channel Signals
57
    input        [p_DATA_BUS_WIDTH-1:0]             RDATA,  // Slave Read data
58
    input        [p_AXI4_LITE_RESP_BUS_WIDTH-1:0]   RRESP,  // Slave Read response
59
    input                                           RVALID, // Slave Read valid
60
    output logic                                    RREADY  // Master Read ready
61
);
62
//////////////////////////////////////////////////////////////////////////////////
63
    // AXI-internals
64
    int timeout_counter;
65
 
66
//////////////////////////////////////////////////////////////////////////////////
67
//
68
// BFM CLOCKING
69
//
70
default clocking cb @(posedge ACLK);
71
    input #1ns AWREADY, WREADY, BVALID;
72
    input #1ns ARREADY, RVALID, RDATA, RRESP;
73
endclocking : cb
74
//////////////////////////////////////////////////////////////////////////////////
75
//
76
// Initialize AXI-signals/internals
77
//
78
initial
79
begin   :   INIT
80
    // axi-signals
81
    AWADDR = 0;
82
    AWPROT = 0; // !!!
83
    AWVALID = 0;
84
    WDATA = 0;
85
    WSTRB = 0;
86
    WVALID = 0;
87
    BREADY = 0;
88
 
89
    ARADDR = 0;
90
    ARPROT = 0; // !!!
91
    ARVALID = 0;
92
    RREADY = 0;
93
    // axi-internal
94
    timeout_counter = 0;
95
    // Final
96
end
97
//////////////////////////////////////////////////////////////////////////////////
98
//
99
// AXI4-LITE READ
100
//
101
task READ ( input   [p_ADDRESS_BUS_WIDTH-1:0]           iv_addr,
102
            output  [p_DATA_BUS_WIDTH-1:0]              ov_data,
103
            output  [p_AXI4_LITE_RESP_BUS_WIDTH-1:0]    ov_resp);
104
    // addr
105
    PROC_RADDR(iv_addr);
106
    // data
107
    PROC_RDATA(ov_data, ov_resp);
108
    // Final
109
endtask : READ
110
//////////////////////////////////////////////////////////////////////////////////
111
//
112
// AXI4-LITE WRITE
113
//
114
task WRITE (input   [p_ADDRESS_BUS_WIDTH-1:0]           iv_addr,
115
            input   [p_DATA_BUS_WIDTH-1:0]              iv_data,
116
            input   [(p_DATA_BUS_WIDTH/8)-1:0]          iv_be,
117
            output  [p_AXI4_LITE_RESP_BUS_WIDTH-1:0]    ov_resp);
118
    // addr
119
    PROC_WADDR(iv_addr);
120
    // data
121
    PROC_WDATA(iv_data, iv_be);
122
    // resp
123
    PROC_WRESP(ov_resp);
124
    // Final
125
endtask : WRITE
126
//////////////////////////////////////////////////////////////////////////////////
127
//
128
// SUPPORT: READ()
129
//
130
task PROC_RADDR(input [p_ADDRESS_BUS_WIDTH-1:0] iv_addr);
131
    //
132
    // #0 - Drive the Read Address Channel with ARVALID asserted
133
    ARADDR <= iv_addr;
134
    ARPROT <= 0; // !!!TBD
135
    ARVALID <= 1;
136
    // #1 - Wait for handshake on the next clk edge
137
    do begin @cb; end
138
    while (cb.ARREADY == 0);
139
    // #2 - de-assert ARVALID
140
    ARVALID <= 0;
141
    // #3 - clr on exit
142
    //ARADDR <= 0;
143
    ARPROT <= 0; @cb;
144
    // Final
145
endtask : PROC_RADDR
146
 
147
task PROC_RDATA(output [p_DATA_BUS_WIDTH-1:0] ov_data, output [p_AXI4_LITE_RESP_BUS_WIDTH-1:0] ov_resp);
148
    //
149
    // #0 - Drive RREADY and Wait for RVALID to be asserted
150
    timeout_counter = 0;
151
    RREADY <= 1;
152
    do begin : RDATA_RVALID
153
        @cb;
154
        // t-out check
155
        if (timeout_counter++ == p_RESPONSE_TIMEOUT)
156
            begin : TOUT
157
                $display("[%t]: %m: READ DATA transfer ERROR!!!", $time);
158
                $stop;
159
            end
160
 
161
    end while (cb.RVALID == 0);
162
    // #1 - sample RDATA and RRESP
163
    ov_data = cb.RDATA;
164
    ov_resp = cb.RRESP;
165
    // #2 - check RRESP
166
    if (ov_resp) // {RRESP_OK == 0}
167
        begin   :   RRESP
168
            $display("[%t]: %m: READ DATA transfer ERROR!!!", $time);
169
            $stop;
170
        end
171
    // #3 - if RRESP == OK, then de-assert RREADY
172
    RREADY <= 0;
173
    // Final
174
endtask : PROC_RDATA
175
//////////////////////////////////////////////////////////////////////////////////
176
//
177
// SUPPORT: WRITE()
178
//
179
task PROC_WADDR(input [p_ADDRESS_BUS_WIDTH-1:0] iv_addr);
180
    //
181
    // #0 - Drive the Write Address Channel with AWVALID asserted
182
    AWADDR <= iv_addr;
183
    AWPROT <= 0; // !!!TBD
184
    AWVALID <= 1;
185
    // #1 - Wait for handshake on the next clk edge
186
    @cb;
187
    while (cb.AWREADY == 0) @cb;
188
    // #2 - de-assert AWVALID
189
    AWVALID <= 0;
190
    // Final
191
endtask : PROC_WADDR
192
 
193
task PROC_WDATA(input [p_DATA_BUS_WIDTH-1:0] iv_data, input [(p_DATA_BUS_WIDTH/8)-1:0] iv_be);
194
    //
195
    // #0 - Drive the Write Data Channel with WVALID asserted
196
    WSTRB <= iv_be;
197
    WDATA <= iv_data;
198
    WVALID <= 1;
199
    // #1 - Wait for handshake on the next clk edge
200
    @cb;
201
    while (cb.WREADY == 0) @cb;
202
    // #2 - de-assert WVALID
203
    WVALID <= 0;
204
    // #3 - clr on exit
205
    //WSTRB <= 0;
206
    //WDATA <= 0;
207
    @cb;
208
    // Final
209
endtask : PROC_WDATA
210
 
211
task PROC_WRESP(output [p_AXI4_LITE_RESP_BUS_WIDTH-1:0] ov_resp);
212
    //
213
    // #0 - Drive BREADY and Wait for BVALID to be asserted
214
    timeout_counter = 0;
215
    BREADY <= 1;
216
    do begin : WRESP_BVALID
217
        @cb;
218
        // t-out check
219
        if (timeout_counter++ == p_RESPONSE_TIMEOUT)
220
            begin : TOUT
221
                $display("[%t]: %m: WRITE RESPONSE transfer ERROR!!!", $time);
222
                $stop;
223
            end
224
    end while(cb.BVALID == 0);
225
    // #1 - Sample the BRESP signal
226
    ov_resp = BRESP;
227
    // #2 - check RRESP
228
    if (ov_resp) // {BRESP_OK == 0}
229
        begin   :   RRESP
230
            $display("[%t]: %m: WRITE RESPONSE transfer ERROR!!!", $time);
231
            $stop;
232
        end
233
    // #3 - if BRESP == OK, then de-assert BREADY
234
    BREADY <= 0;
235
    // Final
236
endtask : PROC_WRESP
237
//////////////////////////////////////////////////////////////////////////////////
238
endmodule

powered by: WebSVN 2.1.0

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