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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [branches/] [gpu_16_cores/] [test_bench/] [TestBench_THEIA.v] - Blame information for rev 137

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 77 diegovalve
 
2
 
3 111 diegovalve
/**********************************************************************************
4
Theia, Ray Cast Programable graphic Processing Unit.
5
Copyright (C) 2010  Diego Valverde (diego.valverde.g@gmail.com)
6 84 diegovalve
 
7 111 diegovalve
This program is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License
9
as published by the Free Software Foundation; either version 2
10
of the License, or (at your option) any later version.
11 77 diegovalve
 
12 111 diegovalve
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20
 
21
***********************************************************************************/
22
 
23
 
24
/*******************************************************************************
25
Module Description:
26
 
27
This is the Main test bench of the GPU. It simulates the behavior of
28
an external control unit or CPU that sends configuration information into DUT.
29
It also implements a second processs that simulates a Wishbone slave that sends
30
data from an external memory. These blocks are just behavioral CTE and therefore
31
are not meant to be synthethized.
32
 
33
*******************************************************************************/
34
 
35
 
36
 
37
`timescale 1ns / 1ps
38
`include "aDefinitions.v"
39
`define RESOLUTION_WIDTH                                                        (rSceneParameters[13] >> `SCALE)
40
`define RESOLUTION_HEIGHT                                                       (rSceneParameters[14] >> `SCALE)
41
`define DELTA_ROW                                                                       (32'h1 << `SCALE)
42
`define DELTA_COL                                                                       (32'h1 << `SCALE)
43
`define TEXTURE_BUFFER_SIZE                                             (256*256*3)
44
`define MAX_WIDTH                                                                       200
45
`define MAX_SCREENBUFFER                                                        (`MAX_WIDTH*`MAX_WIDTH*3)
46
module TestBench_Theia;
47
 
48
 
49
        //------------------------------------------------------------------------
50
        //**WARNING: Declare all of your varaibles at the begining
51
        //of the file. I hve noticed that sometimes the verilog
52
        //simulator allows you to use some regs even if they have not been 
53
        //previously declared, leadeing to crahses or unexpected behavior
54
        // Inputs
55
        reg Clock;
56
        reg Reset;
57
        wire [`WB_WIDTH-1:0]             DAT_O;
58
        reg                                                             ACK_O;
59
        wire                                                            ACK_I;
60
        wire [`WB_WIDTH-1:0]             ADR_I,ADR_O;
61
        wire                                                            WE_I,STB_I;
62
        wire                                                            CYC_O,WE_O,TGC_O,STB_O;
63
        //wire [1:0]                                            TGC_I;
64
        wire [1:0]                                               TGA_O;
65
        wire [1:0]                                               TGA_I;
66
        //wire [`WB_WIDTH-1:0]          DAT_I;
67
        reg [`WB_WIDTH-1:0]                      TMADR_O,TMDAT_O;
68
        reg [`MAX_TMEM_BANKS-1:0]        TMSEL_O;
69
        reg                                                             TMWE_O;
70
        reg [31:0]                                               rControlRegister[2:0];
71
        integer                                                         file, log;
72 137 diegovalve
        reg [31:0] rSceneParameters[128:0];
73 111 diegovalve
        reg [31:0]                                               rVertexBuffer[6000:0];
74
        reg [31:0]                                               rInstructionBuffer[512:0];
75
        reg [31:0]                                       rTextures[`TEXTURE_BUFFER_SIZE:0];               //Lets asume we use 256*256 textures
76
        reg [7:0]                                                rScreen[`MAX_SCREENBUFFER-1:0];
77
        wire [`MAX_CORES-1:0]            wCoreSelect;
78
        wire [3:0]                                               CYC_I,GNT_O;
79
        wire                                                            MST_O;
80
        wire                                                            wDone;
81
        wire [`MAX_CORES-1:0]            RENDREN_O;
82
        reg [`MAX_CORE_BITS-1:0]         wOMEMBankSelect;
83
        reg [`WB_WIDTH-1:0]                      wOMEMReadAddr;  //Output adress (relative to current bank)
84
        wire [`WB_WIDTH-1:0]       wOMEMData;            //Output data bus (Wishbone)
85
        reg                                                             rHostEnable;
86
        integer                                                 k,out2;
87
        wire GRDY_I;
88
        wire GACK_O;
89
        wire STDONE_O;
90
        wire wGPUCommitedResults;
91
        wire wHostDataAvailable;
92
 
93
 
94
THEIA GPU
95
                (
96
                .CLK_I( Clock ),
97 77 diegovalve
                .RST_I( Reset ),
98 111 diegovalve
                .RENDREN_I( RENDREN_O ),
99
                .DAT_I( DAT_O ),
100
        //      .ADR_O( ADR_I ),
101
                .ACK_I( ACK_O ),
102
                //.WE_O ( WE_I ),
103
                //.STB_O( STB_I ),
104
 
105
                .CYC_I( CYC_O ),
106
        //      .TGC_O( TGC_I ),
107
                .MST_I( MST_O ),
108
                .TGA_I( TGA_O ),
109
                .ACK_O( ACK_I ),
110
                .ADR_I( ADR_O ),
111
        //      .DAT_O( DAT_I ),
112 77 diegovalve
                .WE_I(  WE_O  ),
113 111 diegovalve
                .SEL_I( wCoreSelect ),
114
                .STB_I( STB_O ),
115
//              .TGA_O(TGA_I),
116
 
117
                //Output memory
118
                .OMBSEL_I( wOMEMBankSelect ),
119
                .OMADR_I( wOMEMReadAddr ),
120
                .OMEM_O( wOMEMData ),
121
                .TMDAT_I( TMDAT_O ),
122
                .TMADR_I( TMADR_O ),
123
                .TMWE_I(  TMWE_O ),
124
                .TMSEL_I( TMSEL_O ),
125
 
126
                .GRDY_O( GRDY_I ),
127
                .GACK_I( GACK_O ),
128
                .STDONE_I( STDONE_O ),
129
                .RCOMMIT_O( wGPUCommitedResults ),
130
                .HDA_I( wHostDataAvailable ),
131
 
132
                //Control register
133
                .CREG_I( rControlRegister[0][15:0] ),
134 77 diegovalve
                //Other stuff
135 111 diegovalve
                .DONE_O( wDone )
136 77 diegovalve
 
137 111 diegovalve
        );
138 77 diegovalve
 
139 111 diegovalve
wire[`WB_WIDTH-1:0] wHostReadAddress;
140
wire[`WB_WIDTH-1:0] wHostReadData;
141
wire[`WB_WIDTH-1:0] wMemorySize;
142
wire[1:0] wMemSelect;
143 77 diegovalve
 
144 111 diegovalve
MUXFULLPARALELL_2SEL_GENERIC # ( `WB_WIDTH ) MUX1
145
 (
146
.Sel( wMemSelect ),
147
.I1(  rInstructionBuffer[wHostReadAddress] ),
148
.I2(  rSceneParameters[wHostReadAddress]   ),
149
.I3(  rVertexBuffer[wHostReadAddress]      ),
150
.I4(0),
151
.O1(wHostReadData)
152
 );
153 84 diegovalve
 
154 111 diegovalve
MUXFULLPARALELL_2SEL_GENERIC # ( `WB_WIDTH ) MUX2
155
 (
156
.Sel( wMemSelect ),
157
.I1(  rInstructionBuffer[0] ),
158
.I2(  rSceneParameters[0]   ),
159
.I3(  rVertexBuffer[0]      ),
160
.I4(0),
161
.O1(wMemorySize)
162
 );
163 84 diegovalve
 
164 111 diegovalve
Module_Host HOST
165
(
166
        .Clock( Clock ),
167
        .Reset( Reset ),
168
        .iEnable( rHostEnable ),
169
        .oHostDataAvailable( wHostDataAvailable ),
170
        .iHostDataReadConfirmed( GRDY_I ),
171
        .iMemorySize( wMemorySize ),
172
        .iPrimitiveCount( (rVertexBuffer[6]+1) *7 ),
173
        .iGPUCommitedResults( wGPUCommitedResults ),
174
        .STDONE_O( STDONE_O ),
175
        .iGPUDone( wDone ),
176 84 diegovalve
 
177 111 diegovalve
        //To Memory
178
.oReadAddress( wHostReadAddress ),
179
.iReadData(    wHostReadData ),
180
 
181
        //To Hub/Switch
182
.oCoreSelectMask( wCoreSelect ),
183
.oMemSelect( wMemSelect ),
184
.DAT_O( DAT_O),
185
.ADR_O( ADR_O ),
186
.TGA_O( TGA_O ),
187
.RENDREN_O( RENDREN_O ),
188
.CYC_O( CYC_O ),
189
.STB_O( STB_O ),
190
.MST_O( MST_O ),
191 84 diegovalve
 
192 111 diegovalve
.GRDY_I( GRDY_I ),
193
.GACK_O( GACK_O ),
194 84 diegovalve
 
195 111 diegovalve
.WE_O(  WE_O  ),
196 84 diegovalve
 
197
 
198 111 diegovalve
.ACK_I( ACK_I )
199
);
200
        //---------------------------------------------
201
        //generate the clock signal here
202
        always begin
203
                #`CLOCK_CYCLE  Clock =  ! Clock;
204
 
205
        end
206
        //---------------------------------------------
207 77 diegovalve
 
208 111 diegovalve
 
209
`define PARTITION_SIZE `RESOLUTION_HEIGHT/`MAX_CORES
210
integer i,j,kk;
211
reg [31:0] R;
212
always @ ( * )
213
begin
214
 
215
 
216
if (wDone == 1'b1)
217
begin
218
 
219
        $display("Partition Size = %d",`PARTITION_SIZE);
220 137 diegovalve
        for (kk = 0; kk < `MAX_CORES; kk = kk+1)
221 77 diegovalve
                        begin
222 111 diegovalve
                        wOMEMBankSelect = kk;
223
                                $display("wOMEMBankSelect = %d\n",wOMEMBankSelect);
224
                                for (j=0; j < `PARTITION_SIZE; j=j+1)//for (j = 0; j < 15; j = j+1)                                                                      //LOOK OUT 15 is hardcoded!!!!!!!!
225
                                begin
226
 
227
                                        for (i = 0; i < `RESOLUTION_HEIGHT*3; i = i +1)
228
                                        begin
229
                                        wOMEMReadAddr = i+j*`RESOLUTION_WIDTH*3;
230
                                        #`CLOCK_PERIOD;
231
                                        #1;
232
                                        R = ((wOMEMData >> (`SCALE-8)) > 255) ? 255 : (wOMEMData >>  (`SCALE-8));
233
                                        $fwrite(out2,"%d " , R );
234 77 diegovalve
 
235 111 diegovalve
                                                if ((i %3) == 0)
236
                                                                $fwrite(out2,"\n# %d %d\n",i/3,j);
237
 
238
                                        end
239
                                end
240
                        end
241
 
242 77 diegovalve
 
243 84 diegovalve
 
244 111 diegovalve
                        $fclose(out2);
245
                        $fwrite(log, "Simulation end time : %dns\n",$time);
246
                        $fclose(log);
247 84 diegovalve
 
248 111 diegovalve
 
249
                        $stop();
250 84 diegovalve
 
251
 
252 111 diegovalve
end
253 84 diegovalve
end
254
 
255 111 diegovalve
 
256
reg [15:0] rTimeOut;
257 77 diegovalve
 
258 137 diegovalve
        //      `define MAX_INSTRUCTIONS 2
259 84 diegovalve
 
260 111 diegovalve
        initial begin
261
                // Initialize Inputs
262
 
263
 
264
                Clock                                   = 0;
265
                Reset                                   = 0;
266
                rTimeOut             = 0;
267
                rHostEnable                     = 0;
268
                //Read Config register values
269
                $write("Loading control register.... ");
270
                $readmemh("Creg.mem",rControlRegister);
271
                $display("Done");
272
 
273
 
274
 
275
                //Read configuration Data
276
                $write("Loading scene parameters.... ");
277
                $readmemh("Params.mem", rSceneParameters        );
278
                $display("Done");
279
 
280
 
281
                //Read Scene Data
282
                $write("Loading scene geometry.... ");
283
                $readmemh("Vertex.mem",rVertexBuffer);
284
                $display("Done");
285
 
286
                //Read Texture Data
287
                $write("Loading scene texture.... ");
288
                $readmemh("Textures.mem",rTextures);
289
                $display("Done");
290
 
291
 
292
                //Read instruction data
293
                $write("Loading code allocation table and user shaders.... ");
294
                $readmemh("Instructions.mem",rInstructionBuffer);
295
                $display("Done");
296
 
297
                $display("Control Register : %b",rControlRegister[0]);
298
                $display("Resolution       : %d X %d",`RESOLUTION_WIDTH, `RESOLUTION_HEIGHT );
299
 
300
                //Open output file
301
        //      file = $fopen("Output.ppm");
302
                log  = $fopen("Simulation.log");
303
                $fwrite(log, "Simulation start time : %dns\n",$time);
304
                $fwrite(log, "Width : %d\n",`RESOLUTION_WIDTH);
305
                $fwrite(log, "Height : %d\n",`RESOLUTION_HEIGHT);
306
 
307
        //      $fwrite(file,"P3\n");
308
        //      $fwrite(file,"#This file was generated by Theia's RTL simulation\n");
309
        //      $fwrite(file,"%d %d\n",`RESOLUTION_WIDTH, `RESOLUTION_HEIGHT );
310
        //      $fwrite(file,"255\n");
311
 
312
                //Open output file
313
                out2 = $fopen("Output.ppm");
314
 
315
                $fwrite(out2,"P3\n");
316
                $fwrite(out2,"#This file was generated by Theia's RTL simulation\n");
317
                $fwrite(out2,"%d %d\n",`RESOLUTION_WIDTH, `RESOLUTION_HEIGHT );
318
                $fwrite(out2,"255\n");
319
 
320
                #10
321
                Reset = 1;
322
 
323
 
324
                // Wait 100 ns for global reset to finish
325
                TMWE_O = 1;
326
                #100  Reset = 0;
327
                TMWE_O = 1;
328
 
329
                $display("Intilializing TMEM @ %dns",$time);
330
                //starts in 2 to skip Width and Height
331
                for (k = 0;k < `TEXTURE_BUFFER_SIZE; k = k + 1)
332
                begin
333
 
334 137 diegovalve
                        TMADR_O <= (k >> (`MAX_CORE_BITS));
335
                        TMSEL_O <= (k & (`MAX_TMEM_BANKS-1));           //X mod 2^n == X & (2^n - 1)
336 111 diegovalve
                        TMDAT_O <= rTextures[k];
337
                        #10;
338
                end
339
                $display("Done Intilializing TMEM @ %dns",$time);
340
                TMWE_O = 0;
341
                rHostEnable = 1;
342
 
343
        end
344
 
345
 
346
endmodule

powered by: WebSVN 2.1.0

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