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

Subversion Repositories 1g_ethernet_dpi

[/] [1g_ethernet_dpi/] [trunk/] [hw/] [src/] [tb/] [bfm_ublaze/] [base_microblaze_design_microblaze_0_0.sv] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 kuzmi4
//ENTITY base_microblaze_design_microblaze_0_0
2
module base_microblaze_design_microblaze_0_0
3
(
4
    input   Clk ,// IN STD_LOGIC;
5
    input   Reset ,// IN STD_LOGIC;
6
    input   Interrupt ,// IN STD_LOGIC;
7
    input   [0:31]  Interrupt_Address ,// IN STD_LOGIC_VECTOR(0 TO 31);
8
    output  [0: 1]  Interrupt_Ack ,// OUT STD_LOGIC_VECTOR(0 TO 1);
9
    output  [0:31]  Instr_Addr ,// OUT STD_LOGIC_VECTOR(0 TO 31);
10
    input   [0:31]  Instr ,// IN STD_LOGIC_VECTOR(0 TO 31);
11
    output  IFetch ,// OUT STD_LOGIC;
12
    output  I_AS ,// OUT STD_LOGIC;
13
    input   IReady ,// IN STD_LOGIC;
14
    input   IWAIT ,// IN STD_LOGIC;
15
    input   ICE ,// IN STD_LOGIC;
16
    input   IUE ,// IN STD_LOGIC;
17
    output  [0:31]  Data_Addr ,// OUT STD_LOGIC_VECTOR(0 TO 31);
18
    output  [0:31]  Data_Read ,// IN STD_LOGIC_VECTOR(0 TO 31);
19
    output  [0:31]  Data_Write ,// OUT STD_LOGIC_VECTOR(0 TO 31);
20
    output  D_AS ,// OUT STD_LOGIC;
21
    output  Read_Strobe ,// OUT STD_LOGIC;
22
    output  Write_Strobe ,// OUT STD_LOGIC;
23
    input   DReady ,// IN STD_LOGIC;
24
    input   DWait ,// IN STD_LOGIC;
25
    input   DCE ,// IN STD_LOGIC;
26
    input   DUE ,// IN STD_LOGIC;
27
    output  [0:3]   Byte_Enable ,// OUT STD_LOGIC_VECTOR(0 TO 3);
28
 
29
    output  [31:0]  M_AXI_DP_AWADDR ,// OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
30
    output  [ 2:0]  M_AXI_DP_AWPROT ,// OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
31
    output          M_AXI_DP_AWVALID ,// OUT STD_LOGIC;
32
    input           M_AXI_DP_AWREADY ,// IN STD_LOGIC;
33
    output  [31:0]  M_AXI_DP_WDATA ,// OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
34
    output  [ 3:0]  M_AXI_DP_WSTRB ,// OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
35
    output          M_AXI_DP_WVALID ,// OUT STD_LOGIC;
36
    input           M_AXI_DP_WREADY ,// IN STD_LOGIC;
37
    input   [ 1:0]  M_AXI_DP_BRESP ,// IN STD_LOGIC_VECTOR(1 DOWNTO 0);
38
    input           M_AXI_DP_BVALID ,// IN STD_LOGIC;
39
    output          M_AXI_DP_BREADY ,// OUT STD_LOGIC;
40
    output  [31:0]  M_AXI_DP_ARADDR ,// OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
41
    output  [ 2:0]  M_AXI_DP_ARPROT ,// OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
42
    output          M_AXI_DP_ARVALID ,// OUT STD_LOGIC;
43
    input           M_AXI_DP_ARREADY ,// IN STD_LOGIC;
44
    input   [31:0]  M_AXI_DP_RDATA ,// IN STD_LOGIC_VECTOR(31 DOWNTO 0);
45
    input   [ 1:0]  M_AXI_DP_RRESP ,// IN STD_LOGIC_VECTOR(1 DOWNTO 0);
46
    input           M_AXI_DP_RVALID ,// IN STD_LOGIC;
47
    output          M_AXI_DP_RREADY ,// OUT STD_LOGIC;
48
 
49
    input   Dbg_Clk ,// IN STD_LOGIC;
50
    input   Dbg_TDI ,// IN STD_LOGIC;
51
    output  Dbg_TDO ,// OUT STD_LOGIC;
52
    output  [0:7]   Dbg_Reg_En ,// IN STD_LOGIC_VECTOR(0 TO 7);
53
    input   Dbg_Shift ,// IN STD_LOGIC;
54
    input   Dbg_Capture ,// IN STD_LOGIC;
55
    input   Dbg_Update ,// IN STD_LOGIC;
56
    input   Debug_Rst // IN STD_LOGIC
57
);
58
//////////////////////////////////////////////////////////////////////////////////
59
// axi-req/resp def
60
import bfm_ublaze_pkg::*;
61
//////////////////////////////////////////////////////////////////////////////////
62
    // axi-req/resp mbox
63
    typedef mailbox#(mailbox_t) mbox_t;
64
    // ??
65
    mbox_t axi_req_mailbox = new(1);
66
    mbox_t axi_resp_mailbox = new(1);
67
    int axi_trans_idx=0;
68
 
69
//////////////////////////////////////////////////////////////////////////////////
70
//
71
// SYS-CLK
72
//
73
default clocking cb @(posedge Clk);
74
endclocking : cb
75
//////////////////////////////////////////////////////////////////////////////////
76
//
77
//  AXI4-LITE MASTER BFM
78
//
79
axi4_lite_master_bfm // use DEFAULT-params
80
            U_AXI_BFM
81
(
82
// Global Clock Input. All signals are sampled on the rising edge.
83
.ACLK       (Clk),
84
// Global Reset Input. Active Low.
85
.ARESETn    (!Reset),
86
 
87
// Write Address Channel Signals
88
.AWADDR     (M_AXI_DP_AWADDR),  // Master Write address
89
.AWPROT     (M_AXI_DP_AWPROT),  // Master Protection type
90
.AWVALID    (M_AXI_DP_AWVALID), // Master Write address valid
91
.AWREADY    (M_AXI_DP_AWREADY), // Slave Write address ready
92
 
93
// Write Data Channel Signals
94
.WDATA      (M_AXI_DP_WDATA),  // Master Write data
95
.WSTRB      (M_AXI_DP_WSTRB),  // Master Write strobes
96
.WVALID     (M_AXI_DP_WVALID), // Master Write valid
97
.WREADY     (M_AXI_DP_WREADY), // Slave Write ready
98
 
99
// Write Response Channel Signals
100
.BRESP      (M_AXI_DP_BRESP),  // Slave Write response
101
.BVALID     (M_AXI_DP_BVALID), // Slave Write response valid
102
.BREADY     (M_AXI_DP_BREADY), // Master Response ready
103
 
104
// Read Address Channel Signals
105
.ARADDR     (M_AXI_DP_ARADDR),  // Master Read address
106
.ARPROT     (M_AXI_DP_ARPROT),  // Master Protection type
107
.ARVALID    (M_AXI_DP_ARVALID), // Master Read address valid
108
.ARREADY    (M_AXI_DP_ARREADY), // Slave Read address ready
109
 
110
// Read Data Channel Signals
111
.RDATA      (M_AXI_DP_RDATA),  // Slave Read data
112
.RRESP      (M_AXI_DP_RRESP),  // Slave Read response
113
.RVALID     (M_AXI_DP_RVALID), // Slave Read valid
114
.RREADY     (M_AXI_DP_RREADY)  // Master Read ready
115
);
116
//////////////////////////////////////////////////////////////////////////////////
117
//
118
// uBLAZE internal AXI logic
119
//
120
 
121
initial
122
begin   :   AXI_LOGIC
123
    // proc axi-req
124
    forever
125
        begin   :   WRK
126
            @cb; proc_axi_req();
127
        end
128
end
129
 
130
task proc_axi_req;
131
    // declare
132
    mailbox_t axi_req;
133
    mailbox_t axi_resp;
134
    logic [1:0] responce;
135
    int sv_data;
136
    // chk-req
137
    if (axi_req_mailbox.num()) // req-posted by nios2-sw
138
        begin   :   WRK
139
            // get-req
140
            axi_req_mailbox.get(axi_req);
141
            // proc-cmd
142
            if (axi_req.trans == READ)
143
                U_AXI_BFM.READ(axi_req.trans_param.addr, sv_data, responce);
144
            else // axi_req.trans == WRITE
145
                U_AXI_BFM.WRITE(axi_req.trans_param.addr, axi_req.trans_param.data, axi_req.trans_param.be, responce);
146
            // cre resp
147
            axi_resp.trans = axi_req.trans;
148
            axi_resp.trans_idx = axi_req.trans_idx;
149
            axi_resp.trans_param.addr = axi_req.trans_param.addr;
150
            axi_resp.trans_param.be = axi_req.trans_param.be;
151
            axi_resp.trans_param.data = (axi_req.trans == READ)? (sv_data) : (-1);
152
            // post resp
153
            axi_resp_mailbox.put(axi_resp);
154
        end
155
    // Final
156
endtask : proc_axi_req
157
//////////////////////////////////////////////////////////////////////////////////
158
//
159
// C/CPP-MAIN / uBLAZE-SW
160
//
161
 
162
// DPC-C import / MAIN
163
import "DPI-C" context task main();
164
 
165
initial
166
begin   :   MAIN
167
    main();
168
end
169
//////////////////////////////////////////////////////////////////////////////////
170
//
171
// CPP-HDL AXI routines
172
//
173
 
174
// DPI-C export / AXI
175
export "DPI-C" task axi_read;
176
export "DPI-C" task axi_write;
177
 
178
task automatic axi_read (input int iv_addr, input int iv_be, output int ov_data);
179
    // declare
180
    mailbox_t rd_req;
181
    mailbox_t rd_resp;
182
    // init-req
183
    rd_req.trans = READ;
184
    rd_req.trans_idx = ++axi_trans_idx;
185
    rd_req.trans_param.addr = iv_addr;
186
    rd_req.trans_param.be = iv_be;
187
    rd_req.trans_param.data = -1;
188
    // post-req
189
    axi_req_mailbox.put(rd_req); // method places a message in a mailbox
190
    // wait
191
    do begin : WAIT_RD_RESP
192
        // prep
193
        rd_resp.trans_idx = 0; @cb;
194
        // chk resp
195
        if (axi_resp_mailbox.num()) // obtain number of messages in a mailbox
196
            axi_resp_mailbox.peek(rd_resp); // copies a message from a mailbox without removing the message from the queue.
197
    end while(rd_resp.trans_idx != rd_req.trans_idx);
198
    // get rd-data
199
    axi_resp_mailbox.get(rd_resp); // retrieves a message from a mailbox
200
    ov_data = rd_resp.trans_param.data;
201
    //$display("[%t]: %m: iv_addr=%x, ov_data=%x", $time, iv_addr, ov_data);
202
    // Final
203
endtask : axi_read
204
 
205
task automatic axi_write (input int iv_addr, input int iv_be, input int iv_data);
206
    // declare
207
    mailbox_t wr_req;
208
    mailbox_t wr_resp;
209
    // init
210
    wr_req.trans = WRITE;
211
    wr_req.trans_idx = ++axi_trans_idx;
212
    wr_req.trans_param.addr = iv_addr;
213
    wr_req.trans_param.be = iv_be;
214
    wr_req.trans_param.data = iv_data;
215
    // post-req
216
    axi_req_mailbox.put(wr_req);
217
    // wait
218
    do begin : WAIT_WR_RESP
219
        // prep
220
        wr_resp.trans_idx = 0; @cb;
221
        // chk resp
222
        if (axi_resp_mailbox.num())
223
            axi_resp_mailbox.peek(wr_resp);
224
    end while (wr_resp.trans_idx != wr_req.trans_idx);
225
    axi_resp_mailbox.get(wr_resp); // dummy-read REQ!!!
226
    // Final
227
endtask : axi_write
228
//////////////////////////////////////////////////////////////////////////////////
229
//
230
// CPP-HDL sync
231
//
232
 
233
// DPI-C export / cpp-hdl
234
export "DPI-C" task ublaze_initial;
235
export "DPI-C" task ublaze_final;
236
export "DPI-C" task ublaze_wait;
237
 
238
task ublaze_initial;
239
    //
240
    do @cb;
241
    while (Reset == 1);
242
    ##100;
243
    $display("[%t]: %m: START", $time);
244
    // Final
245
endtask : ublaze_initial
246
 
247
task ublaze_final;
248
    //
249
    ##100;
250
    $display("[%t]: %m: STOP", $time);
251
    $finish;
252
    // Final
253
endtask : ublaze_final
254
 
255
task ublaze_wait(input int iv_value);
256
    // simple-bfm-dly
257
    repeat(iv_value)
258
        @cb;
259
    // Final
260
endtask : ublaze_wait
261
//////////////////////////////////////////////////////////////////////////////////
262
endmodule

powered by: WebSVN 2.1.0

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