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

Subversion Repositories warp

[/] [warp/] [test/] [tb_tmu.v] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 lekernel
/*
2
 * Milkymist VJ SoC
3
 * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
4
 *
5
 * This program is free and excepted software; you can use it, redistribute it
6
 * and/or modify it under the terms of the Exception General Public License as
7
 * published by the Exception License Foundation; either version 2 of the
8
 * License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful, but WITHOUT
11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
 * FOR A PARTICULAR PURPOSE. See the Exception General Public License for more
13
 * details.
14
 *
15
 * You should have received a copy of the Exception General Public License along
16
 * with this project; if not, write to the Exception License Foundation.
17
 */
18
 
19
module tb_tmu();
20
 
21
parameter fml_depth = 26;
22
parameter wbm_depth = 26;
23
 
24
reg sys_clk;
25
reg sys_rst;
26
 
27
reg [13:0] csr_a;
28
reg csr_we;
29
reg [31:0] csr_di;
30
wire [31:0] csr_do;
31
 
32
wire irq;
33
 
34
wire [31:0] wbm_adr_o;
35
wire [2:0] wbm_cti_o;
36
wire wbm_cyc_o;
37
wire wbm_stb_o;
38
reg wbm_ack_i;
39
reg [31:0] wbm_dat_i;
40
 
41
wire [fml_depth-1:0] fmlr_adr;
42
wire fmlr_stb;
43
reg fmlr_ack;
44
reg [63:0] fmlr_di;
45
 
46
wire [fml_depth-1:0] fmlw_adr;
47
wire fmlw_stb;
48
reg fmlw_ack;
49
wire [7:0] fmlw_sel;
50
wire [63:0] fmlw_do;
51
 
52
/* 100MHz system clock */
53
initial sys_clk = 1'b0;
54
always #5 sys_clk = ~sys_clk;
55
 
56
tmu #(
57
        .fml_depth(fml_depth),
58
        .pixin_cache_depth(12)
59
) dut (
60
        .sys_clk(sys_clk),
61
        .sys_rst(sys_rst),
62
 
63
        .csr_a(csr_a),
64
        .csr_we(csr_we),
65
        .csr_di(csr_di),
66
        .csr_do(csr_do),
67
 
68
        .irq(irq),
69
 
70
        .wbm_adr_o(wbm_adr_o),
71
        .wbm_cti_o(wbm_cti_o),
72
        .wbm_cyc_o(wbm_cyc_o),
73
        .wbm_stb_o(wbm_stb_o),
74
        .wbm_ack_i(wbm_ack_i),
75
        .wbm_dat_i(wbm_dat_i),
76
 
77
        .fmlr_adr(fmlr_adr),
78
        .fmlr_stb(fmlr_stb),
79
        .fmlr_ack(fmlr_ack),
80
        .fmlr_di(fmlr_di),
81
 
82
        .fmlw_adr(fmlw_adr),
83
        .fmlw_stb(fmlw_stb),
84
        .fmlw_ack(fmlw_ack),
85
        .fmlw_sel(fmlw_sel),
86
        .fmlw_do(fmlw_do)
87
);
88
 
89
task waitclock;
90
begin
91
        @(posedge sys_clk);
92
        #1;
93
end
94
endtask
95
 
96
task csrwrite;
97
input [31:0] address;
98
input [31:0] data;
99
begin
100
        csr_a = address[16:2];
101
        csr_di = data;
102
        csr_we = 1'b1;
103
        waitclock;
104
        $display("Configuration Write: %x=%x", address, data);
105
        csr_we = 1'b0;
106
end
107
endtask
108
 
109
task csrread;
110
input [31:0] address;
111
begin
112
        csr_a = address[16:2];
113
        waitclock;
114
        $display("Configuration Read : %x=%x", address, csr_do);
115
end
116
endtask
117
 
118
/* Handle WB master for mesh reads */
119
reg [6:0] x;
120
reg [6:0] y;
121
always @(posedge sys_clk) begin
122
        if(wbm_stb_o & ~wbm_ack_i) begin
123
                x = wbm_adr_o[8:2];
124
                y = wbm_adr_o[15:9];
125
                wbm_dat_i[15:0] = x*20+y*7;
126
                wbm_dat_i[31:16] = y*20;
127
                $display("Mesh Read: %d,%d", x, y);
128
                wbm_ack_i = 1'b1;
129
        end else
130
                wbm_ack_i = 1'b0;
131
end
132
 
133
/* Handle FML master for pixel reads */
134
integer read_burstcount;
135
integer read_addr;
136
 
137
task handle_read;
138
integer read_addr2;
139
integer x;
140
integer y;
141
reg [15:0] p1; /* work around bugs/problems if we assign */
142
reg [15:0] p2; /* directly to fmlr_di[xx:xx] in $image_get... */
143
reg [15:0] p3;
144
reg [15:0] p4;
145
begin
146
        read_addr2 = read_addr[20:0]/2;
147
        x = read_addr2 % 640;
148
        y = read_addr2 / 640;
149
        $image_get(x + 0, y, p1);
150
        $image_get(x + 1, y, p2);
151
        $image_get(x + 2, y, p3);
152
        $image_get(x + 3, y, p4);
153
        fmlr_di = {p1, p2, p3, p4};
154
end
155
endtask
156
 
157
initial read_burstcount = 0;
158
always @(posedge sys_clk) begin
159
        fmlr_ack = 1'b0;
160
        if(read_burstcount == 0) begin
161
                if(fmlr_stb) begin
162
                        read_burstcount = 1;
163
                        read_addr = fmlr_adr;
164
 
165
                        handle_read;
166
 
167
                        //$display("Starting   FML burst READ at address %x", read_addr);
168
 
169
                        fmlr_ack = 1'b1;
170
                end
171
        end else begin
172
                read_addr = read_addr + 8;
173
                read_burstcount = read_burstcount + 1;
174
 
175
                handle_read;
176
 
177
                //$display("Continuing FML burst READ at address %x", read_addr);
178
 
179
                if(read_burstcount == 4)
180
                        read_burstcount = 0;
181
        end
182
end
183
 
184
/* Handle FML master for pixel writes */
185
integer write_burstcount;
186
integer write_addr;
187
 
188
task handle_write;
189
integer write_addr2;
190
integer x;
191
integer y;
192
begin
193
        write_addr2 = write_addr[20:0]/2;
194
        x = write_addr2 % 640;
195
        y = write_addr2 / 640;
196
        if(fmlw_sel[7])
197
                $image_set(x + 0, y, fmlw_do[63:48]);
198
        if(fmlw_sel[5])
199
                $image_set(x + 1, y, fmlw_do[47:32]);
200
        if(fmlw_sel[3])
201
                $image_set(x + 2, y, fmlw_do[31:16]);
202
        if(fmlw_sel[1])
203
                $image_set(x + 3, y, fmlw_do[15:0]);
204
end
205
endtask
206
 
207
initial write_burstcount = 0;
208
always @(posedge sys_clk) begin
209
        fmlw_ack = 1'b0;
210
        if(write_burstcount == 0) begin
211
                if(fmlw_stb) begin
212
                        write_burstcount = 1;
213
                        write_addr = fmlw_adr;
214
 
215
                        //$display("Starting   FML burst WRITE at address %x", write_addr);
216
                        handle_write;
217
 
218
                        fmlw_ack = 1'b1;
219
                end
220
        end else begin
221
                write_addr = write_addr + 8;
222
                write_burstcount = write_burstcount + 1;
223
 
224
                //$display("Continuing FML burst WRITE at address %x", write_addr);
225
                handle_write;
226
 
227
                if(write_burstcount == 4)
228
                        write_burstcount = 0;
229
        end
230
end
231
 
232
always begin
233
        $image_open;
234
 
235
        /* Reset / Initialize our logic */
236
        sys_rst = 1'b1;
237
 
238
        csr_a = 14'd0;
239
        csr_di = 32'd0;
240
        csr_we = 1'b0;
241
 
242
        fmlr_di = 64'd0;
243
        fmlr_ack = 1'b0;
244
 
245
        fmlw_ack = 1'b0;
246
 
247
        waitclock;
248
 
249
        sys_rst = 1'b0;
250
 
251
        waitclock;
252
 
253
        /* Setup */
254
        csrwrite(32'h24, 32'h01000000); /* dst addr */
255
 
256
        /* Mesh count */
257
        //csrwrite(32'h08, 32'd1);
258
        //csrwrite(32'h10, 32'd1);
259
 
260
        /* Mesh size */
261
        //csrwrite(32'h0c, 32'd20);
262
        //csrwrite(32'h14, 32'd20);
263
 
264
        /* Start */
265
        csrwrite(32'h00, 32'd1);
266
 
267
        @(posedge irq);
268
 
269
        $image_close;
270
        $finish;
271
end
272
 
273
endmodule

powered by: WebSVN 2.1.0

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