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
|