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

Subversion Repositories aoocs

[/] [aoocs/] [trunk/] [tests/] [tb_blitter_old.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
function [31:0] get_argument(input [87:0] name);
66
reg [31:0] result;
67
begin
68
        if( $value$plusargs({name, "=%h"}, result) == 0 ) begin
69
                $display("Missing argument: %s", name);
70
                $finish_and_return(-1);
71
        end
72
        get_argument = result;
73
end
74
endfunction
75
 
76
function [255:0] get_argument_as_string(input [87:0] name);
77
reg [255:0] result;
78
begin
79
        if( $value$plusargs({name, "=%s"}, result) == 0 ) begin
80
                $display("Missing argument: %s", name);
81
                $finish_and_return(-1);
82
        end
83
        get_argument_as_string = result;
84
end
85
endfunction
86
 
87
reg [255:0] string;
88
reg [31:0] write_data_selected;
89
 
90
reg [3:0] mem_valid[749:0];
91
reg [31:0] mem[749:0];
92
reg [31:0] mem_arg;
93
 
94
always @(posedge CLK_I) begin
95
    if(STB_O == 1'b1 && WE_O == 1'b0) begin
96
                $display("memory read: address=%h, select=%h", {ADR_O, 2'b0}, SEL_O);
97
 
98
                $sformat(string, "MEM%h", {ADR_O, 2'b0});
99
 
100
                #5
101
                mem_arg = get_argument(string);
102
                master_DAT_I = mem_arg;
103
                if(ADR_O < 30'd750) begin
104
                    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];
105
                    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];
106
                    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];
107
                    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];
108
                end
109
 
110
                ACK_I = 1'b1;
111
                #10
112
                master_DAT_I = 32'd0;
113
                ACK_I = 1'b0;
114
        end
115
    else if(STB_O == 1'b1 && WE_O == 1'b1) begin
116
                if(SEL_O == 4'd0) write_data_selected = 32'd0;
117
                else if(SEL_O == 4'd1) write_data_selected = { 24'd0, master_DAT_O[7:0] };
118
                else if(SEL_O == 4'd2) write_data_selected = { 16'd0, master_DAT_O[15:8], 8'd0 };
119
                else if(SEL_O == 4'd3) write_data_selected = { 16'd0, master_DAT_O[15:0] };
120
                else if(SEL_O == 4'd4) write_data_selected = { 8'd0, master_DAT_O[23:16], 16'd0 };
121
                else if(SEL_O == 4'd5) write_data_selected = { 8'd0, master_DAT_O[23:16], 8'd0, master_DAT_O[7:0] };
122
                else if(SEL_O == 4'd6) write_data_selected = { 8'd0, master_DAT_O[23:8], 8'd0 };
123
                else if(SEL_O == 4'd7) write_data_selected = { 8'd0, master_DAT_O[23:0] };
124
                else if(SEL_O == 4'd8) write_data_selected = { master_DAT_O[31:24], 24'd0 };
125
                else if(SEL_O == 4'd9) write_data_selected = { master_DAT_O[31:24], 16'd0, master_DAT_O[7:0] };
126
                else if(SEL_O == 4'd10) write_data_selected = { master_DAT_O[31:24], 8'd0, master_DAT_O[15:8], 8'd0 };
127
                else if(SEL_O == 4'd11) write_data_selected = { master_DAT_O[31:24], 8'd0, master_DAT_O[15:0] };
128
                else if(SEL_O == 4'd12) write_data_selected = { master_DAT_O[31:16], 16'd0 };
129
                else if(SEL_O == 4'd13) write_data_selected = { master_DAT_O[31:16], 8'd0, master_DAT_O[7:0] };
130
                else if(SEL_O == 4'd14) write_data_selected = { master_DAT_O[31:8], 8'd0 };
131
                else if(SEL_O == 4'd15) write_data_selected = master_DAT_O[31:0];
132
 
133
                $display("memory write: address=%h, select=%h, value=%h", { ADR_O, 2'b0 }, SEL_O, write_data_selected);
134
 
135
        if(ADR_O < 30'd750) begin
136
            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
137
            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
138
            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
139
            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
140
        end
141
 
142
                #5
143
                ACK_I = 1'b1;
144
                #10
145
                ACK_I = 1'b0;
146
        end
147
end
148
 
149
task init_blitter;
150
integer count;
151
integer i;
152
reg [31:0] adr;
153
reg [31:0] value;
154
integer read_count;
155
begin
156
    count = get_argument("init_writes");
157
    dma_con = get_argument("dma_con");
158
 
159
    for(i=0; i<count; i=i+1) begin
160
        $sformat(string, "SLV%h", i);
161
        string = get_argument_as_string(string);
162
        read_count = $sscanf(string, "%h:%h", adr,value);
163
        //$display("Found: ADR=%h, VALUE=%h", adr,value);
164
 
165
        ADR_I = adr[7:2];
166
        slave_DAT_I = value;
167
        STB_I = 1'b1;
168
        CYC_I = 1'b1;
169
        WE_I = 1'b1;
170
        SEL_I = 4'b1111;
171
 
172
        while(ACK_O == 1'b0) #10;
173
        while(ACK_O == 1'b1) #10;
174
 
175
        STB_I = 1'b0;
176
        CYC_I = 1'b0;
177
 
178
        if(read_count != 2) begin
179
            $display("Invalid SLV arguments.");
180
            $finish_and_return(-1);
181
        end
182
    end
183
 
184
 
185
end
186
endtask
187
 
188
integer j;
189
initial begin
190
        #10
191
        for(j=0; j<100000; j=j+1) begin
192
            if(blitter_irq == 1'b1) begin
193
                $display("blitter_done.");
194
 
195
                $display("aph: %04x", blitter_inst.a_address[31:16]);
196
                $display("apl: %04x", blitter_inst.a_address[15:0]);
197
                $display("bph: %04x", blitter_inst.b_address[31:16]);
198
                $display("bpl: %04x", blitter_inst.b_address[15:0]);
199
                $display("cph: %04x", blitter_inst.c_address[31:16]);
200
                $display("cpl: %04x", blitter_inst.c_address[15:0]);
201
                $display("dph: %04x", blitter_inst.d_address[31:16]);
202
                $display("dpl: %04x", blitter_inst.d_address[15:0]);
203
 
204
                $display("adh: %08x", blitter_inst.a_dat[63:32]);
205
                $display("adl: %08x", blitter_inst.a_dat[31:0]);
206
 
207
                $display("bdh: %08x", blitter_inst.b_dat[63:32]);
208
                $display("bdl: %08x", blitter_inst.b_dat[31:0]);
209
 
210
                $display("cdh: %04x", blitter_inst.c_dat[47:32]);
211
                $display("cdl: %08x", blitter_inst.c_dat[31:0]);
212
 
213
            $finish_and_return(0);
214
            end
215
            #10 ;
216
        end
217
        $finish_and_return(-1);
218
end
219
 
220
integer i;
221
initial begin
222
    $dumpfile("tb_blitter.vcd");
223
        $dumpvars(0);
224
        $dumpon();
225
 
226
        reset_n = 1'b0;
227
        #10 reset_n = 1'b1;
228
 
229
    #30
230
    for(i=0; i<750; i=i+1) mem_valid[i] = 4'b0;
231
 
232
    blitter_inst.a_dat[63:32] = get_argument("adh");
233
    blitter_inst.a_dat[31:0] = get_argument("adl");
234
    blitter_inst.b_dat[63:32] = get_argument("bdh");
235
    blitter_inst.b_dat[31:0] = get_argument("bdl");
236
    blitter_inst.c_dat[47:32] = get_argument("cdh");
237
    blitter_inst.c_dat[31:0] = get_argument("cdl");
238
    init_blitter();
239
 
240
    forever #10 ;
241
 
242
        $dumpoff();
243
 
244
        $finish();
245
end
246
 
247
endmodule
248
 

powered by: WebSVN 2.1.0

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