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

Subversion Repositories aoocs

[/] [aoocs/] [trunk/] [tests/] [tb_blitter.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
`timescale 10ns / 1ns
2
 
3
module tb_blitter();
4
 
5
reg CLK_I;
6
reg reset_n;
7
 
8
reg [31:0] master_DAT_I;
9
reg ACK_I;
10
wire CYC_O;
11
wire STB_O;
12
wire WE_O;
13
wire [29:0] ADR_O;
14
wire [3:0] SEL_O;
15
wire [31:0] master_DAT_O;
16
 
17
reg CYC_I;
18
reg STB_I;
19
reg WE_I;
20
reg [8:2] ADR_I;
21
reg [3:0] SEL_I;
22
reg [31:0] slave_DAT_I;
23
wire ACK_O;
24
 
25
reg [10:0] dma_con;
26
wire blitter_irq;
27
wire blitter_zero;
28
wire blitter_busy;
29
 
30
ocs_blitter blitter_inst(
31
    .CLK_I(CLK_I),
32
    .reset_n(reset_n),
33
 
34
    // WISHBONE master
35
    .CYC_O(CYC_O),
36
    .STB_O(STB_O),
37
    .WE_O(WE_O),
38
    .ADR_O(ADR_O),
39
    .SEL_O(SEL_O),
40
    .master_DAT_O(master_DAT_O),
41
    .master_DAT_I(master_DAT_I),
42
    .ACK_I(ACK_I),
43
 
44
    // WISHBONE slave
45
    .CYC_I(CYC_I),
46
    .STB_I(STB_I),
47
    .WE_I(WE_I),
48
    .ADR_I(ADR_I),
49
    .SEL_I(SEL_I),
50
    .slave_DAT_I(slave_DAT_I),
51
    .ACK_O(ACK_O),
52
 
53
    // dma enable
54
    .dma_con(dma_con),
55
    .blitter_irq(blitter_irq),
56
    .blitter_zero(blitter_zero),
57
    .blitter_busy(blitter_busy)
58
);
59
 
60
initial begin
61
        CLK_I = 1'b0;
62
        forever #5 CLK_I = ~CLK_I;
63
end
64
 
65
/*
66
function [31:0] get_argument(input [87:0] name);
67
reg [31:0] result;
68
begin
69
        if( $value$plusargs({name, "=%h"}, result) == 0 ) begin
70
                $display("Missing argument: %s", name);
71
                $finish_and_return(-1);
72
        end
73
        get_argument = result;
74
end
75
endfunction
76
 
77
function [255:0] get_argument_as_string(input [87:0] name);
78
reg [255:0] result;
79
begin
80
        if( $value$plusargs({name, "=%s"}, result) == 0 ) begin
81
                $display("Missing argument: %s", name);
82
                $finish_and_return(-1);
83
        end
84
        get_argument_as_string = result;
85
end
86
endfunction
87
 
88
reg [255:0] string;
89
reg [31:0] write_data_selected;
90
 
91
reg [3:0] mem_valid[749:0];
92
reg [31:0] mem[749:0];
93
reg [31:0] mem_arg;
94
 
95
always @(posedge CLK_I) begin
96
    if(STB_O == 1'b1 && WE_O == 1'b0) begin
97
                $display("memory read: address=%h, select=%h", {ADR_O, 2'b0}, SEL_O);
98
 
99
                $sformat(string, "MEM%h", {ADR_O, 2'b0});
100
 
101
                #5
102
                mem_arg = get_argument(string);
103
                master_DAT_I = mem_arg;
104
                if(ADR_O < 30'd750) begin
105
                    if(mem_valid[ADR_O][0] == 1'b1) master_DAT_I[7:0] = mem[ADR_O][7:0]; else master_DAT_I[7:0] = mem_arg[7:0];
106
                    if(mem_valid[ADR_O][1] == 1'b1) master_DAT_I[15:8] = mem[ADR_O][15:8]; else master_DAT_I[15:8] = mem_arg[15:8];
107
                    if(mem_valid[ADR_O][2] == 1'b1) master_DAT_I[23:16] = mem[ADR_O][23:16]; else master_DAT_I[23:16] = mem_arg[23:16];
108
                    if(mem_valid[ADR_O][3] == 1'b1) master_DAT_I[31:24] = mem[ADR_O][31:24]; else master_DAT_I[31:24] = mem_arg[31:24];
109
                end
110
 
111
                ACK_I = 1'b1;
112
                #10
113
                master_DAT_I = 32'd0;
114
                ACK_I = 1'b0;
115
        end
116
    else if(STB_O == 1'b1 && WE_O == 1'b1) begin
117
                if(SEL_O == 4'd0) write_data_selected = 32'd0;
118
                else if(SEL_O == 4'd1) write_data_selected = { 24'd0, master_DAT_O[7:0] };
119
                else if(SEL_O == 4'd2) write_data_selected = { 16'd0, master_DAT_O[15:8], 8'd0 };
120
                else if(SEL_O == 4'd3) write_data_selected = { 16'd0, master_DAT_O[15:0] };
121
                else if(SEL_O == 4'd4) write_data_selected = { 8'd0, master_DAT_O[23:16], 16'd0 };
122
                else if(SEL_O == 4'd5) write_data_selected = { 8'd0, master_DAT_O[23:16], 8'd0, master_DAT_O[7:0] };
123
                else if(SEL_O == 4'd6) write_data_selected = { 8'd0, master_DAT_O[23:8], 8'd0 };
124
                else if(SEL_O == 4'd7) write_data_selected = { 8'd0, master_DAT_O[23:0] };
125
                else if(SEL_O == 4'd8) write_data_selected = { master_DAT_O[31:24], 24'd0 };
126
                else if(SEL_O == 4'd9) write_data_selected = { master_DAT_O[31:24], 16'd0, master_DAT_O[7:0] };
127
                else if(SEL_O == 4'd10) write_data_selected = { master_DAT_O[31:24], 8'd0, master_DAT_O[15:8], 8'd0 };
128
                else if(SEL_O == 4'd11) write_data_selected = { master_DAT_O[31:24], 8'd0, master_DAT_O[15:0] };
129
                else if(SEL_O == 4'd12) write_data_selected = { master_DAT_O[31:16], 16'd0 };
130
                else if(SEL_O == 4'd13) write_data_selected = { master_DAT_O[31:16], 8'd0, master_DAT_O[7:0] };
131
                else if(SEL_O == 4'd14) write_data_selected = { master_DAT_O[31:8], 8'd0 };
132
                else if(SEL_O == 4'd15) write_data_selected = master_DAT_O[31:0];
133
 
134
                $display("memory write: address=%h, select=%h, value=%h", { ADR_O, 2'b0 }, SEL_O, write_data_selected);
135
 
136
        if(ADR_O < 30'd750) begin
137
            if(SEL_O[0] == 1'b1) begin mem[ADR_O][7:0] = write_data_selected[7:0]; mem_valid[ADR_O][0] = 1'b1; end
138
            if(SEL_O[1] == 1'b1) begin mem[ADR_O][15:8] = write_data_selected[15:8]; mem_valid[ADR_O][1] = 1'b1; end
139
            if(SEL_O[2] == 1'b1) begin mem[ADR_O][23:16] = write_data_selected[23:16]; mem_valid[ADR_O][2] = 1'b1; end
140
            if(SEL_O[3] == 1'b1) begin mem[ADR_O][31:24] = write_data_selected[31:24]; mem_valid[ADR_O][3] = 1'b1; end
141
        end
142
 
143
                #5
144
                ACK_I = 1'b1;
145
                #10
146
                ACK_I = 1'b0;
147
        end
148
end
149
 
150
task init_blitter;
151
integer count;
152
integer i;
153
reg [31:0] adr;
154
reg [31:0] value;
155
reg [3:0] sel;
156
integer read_count;
157
begin
158
    count = get_argument("init_writes");
159
    dma_con = get_argument("dma_con");
160
 
161
    for(i=0; i<count; i=i+1) begin
162
        $sformat(string, "SLV%h", i);
163
        string = get_argument_as_string(string);
164
        read_count = $sscanf(string, "%h:%h:%h", adr,sel,value);
165
 
166
        ADR_I = adr[7:2];
167
        slave_DAT_I = value;
168
        STB_I = 1'b1;
169
        CYC_I = 1'b1;
170
        WE_I = 1'b1;
171
        SEL_I = sel;
172
 
173
        while(ACK_O == 1'b0) #10;
174
        while(ACK_O == 1'b1) #10;
175
 
176
        STB_I = 1'b0;
177
        CYC_I = 1'b0;
178
 
179
        if(read_count != 2) begin
180
            $display("Invalid SLV arguments.");
181
            $finish_and_return(-1);
182
        end
183
    end
184
 
185
 
186
end
187
endtask
188
 
189
integer j;
190
initial begin
191
        #10
192
        for(j=0; j<100000; j=j+1) begin
193
            if(blitter_irq == 1'b1) begin
194
                $display("blitter_done.");
195
 
196
                $display("aph: %04x", blitter_inst.a_address[31:16]);
197
                $display("apl: %04x", blitter_inst.a_address[15:0]);
198
                $display("bph: %04x", blitter_inst.b_address[31:16]);
199
                $display("bpl: %04x", blitter_inst.b_address[15:0]);
200
                $display("cph: %04x", blitter_inst.c_address[31:16]);
201
                $display("cpl: %04x", blitter_inst.c_address[15:0]);
202
                $display("dph: %04x", blitter_inst.d_address[31:16]);
203
                $display("dpl: %04x", blitter_inst.d_address[15:0]);
204
 
205
                $display("adh: %08x", blitter_inst.a_dat[63:32]);
206
                $display("adl: %08x", blitter_inst.a_dat[31:0]);
207
 
208
                $display("bdh: %08x", blitter_inst.b_dat[63:32]);
209
                $display("bdl: %08x", blitter_inst.b_dat[31:0]);
210
 
211
                $display("cdh: %04x", blitter_inst.c_dat[47:32]);
212
                $display("cdl: %08x", blitter_inst.c_dat[31:0]);
213
 
214
            $finish_and_return(0);
215
            end
216
            #10 ;
217
        end
218
        $finish_and_return(-1);
219
end
220
*/
221
 
222
integer i;
223
integer j;
224
reg [255:0] string;
225
reg [31:0] adr;
226
reg [3:0] sel;
227
reg [31:0] val;
228
parameter [31:0]    STDIN = 32'h8000_0000,
229
                    STDOUT = 32'h8000_0001;
230
 
231
initial begin
232
    $dumpfile("tb_blitter.vcd");
233
        $dumpvars(0);
234
        $dumpon();
235
 
236
    reset_n = 1'b0;
237
    ACK_I = 1'b0;
238
    dma_con = 11'h7FF;
239
        #10 reset_n = 1'b1;
240
 
241
    //write register: adr=1, sel=2, val=3
242
    forever begin
243
        i = $fscanf(STDIN, "write register: adr=%h, sel=%h, val=%h", adr, sel, val);
244
        if(i != 3) begin
245
            $display("error: invalid write register input: %d", i);
246
            $finish_and_return(-1);
247
        end
248
        i = $fgetc(STDIN);
249
 
250
        ADR_I = adr[8:2];
251
        slave_DAT_I = val;
252
        STB_I = 1'b1;
253
        CYC_I = 1'b1;
254
        WE_I = 1'b1;
255
        SEL_I = sel;
256
 
257
        while(ACK_O == 1'b0) #10;
258
        while(ACK_O == 1'b1) #10;
259
 
260
        STB_I = 1'b0;
261
        CYC_I = 1'b0;
262
 
263
        if(adr == 32'h058) begin
264
            #10
265
                for(j=0; j<1000000; j=j+1) begin
266
                    if(CYC_O == 1'b1 && STB_O == 1'b1 && WE_O == 1'b0) begin
267
                        $display("read memory: adr=%h", {ADR_O, 2'b0});
268
                        $fflush(STDOUT);
269
 
270
                        i = $fscanf(STDIN, "memory: adr=%h, val=%h", adr, val);
271
                        if(i != 2) begin
272
                            $display("error: invalid memory input: %d\n", i);
273
                        $finish_and_return(-1);
274
                        end
275
                        i = $fgetc(STDIN);
276
 
277
                        #5
278
                            master_DAT_I = val;
279
                            ACK_I = 1'b1;
280
 
281
                            #10
282
                            master_DAT_I = 32'd0;
283
                            ACK_I = 1'b0;
284
 
285
                            #5 ;
286
                    end
287
                    else if(CYC_O == 1'b1 && STB_O == 1'b1 && WE_O == 1'b1) begin
288
                        $display("write memory: adr=%h, sel=%h, val=%h", {ADR_O, 2'b0}, SEL_O, master_DAT_O);
289
                        $fflush(STDOUT);
290
 
291
                        #5
292
                            ACK_I = 1'b1;
293
 
294
                            #10
295
                            ACK_I = 1'b0;
296
 
297
                            #5 ;
298
                    end
299
                    if(blitter_irq == 1'b1) begin
300
                        $dumpflush();
301
                        $display("done");
302
                        $fflush(STDOUT);
303
                        j = 2000000;
304
                    end
305
 
306
                    #10 ;
307
                end
308
                if(j == 1000000) begin
309
                    $display("error: loop timeout.\n");
310
                $finish_and_return(-1);
311
                end
312
        end
313
    end
314
 
315
 
316
    /*
317
 
318
 
319
 
320
    #30
321
    for(i=0; i<750; i=i+1) mem_valid[i] = 4'b0;
322
 
323
    blitter_inst.a_dat[63:32] = get_argument("adh");
324
    blitter_inst.a_dat[31:0] = get_argument("adl");
325
    blitter_inst.b_dat[63:32] = get_argument("bdh");
326
    blitter_inst.b_dat[31:0] = get_argument("bdl");
327
    blitter_inst.c_dat[47:32] = get_argument("cdh");
328
    blitter_inst.c_dat[31:0] = get_argument("cdl");
329
    init_blitter();
330
 
331
    forever #10 ;
332
 
333
        $dumpoff();
334
 
335
        $finish();
336
        */
337
end
338
 
339
endmodule
340
 

powered by: WebSVN 2.1.0

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