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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [trunk/] [test_bench/] [TestBench_THEIA.v] - Blame information for rev 143

Go to most recent revision | 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 143 diegovalve
        reg [31:0] rSceneParameters[120:0];
73
        reg [31:0]                                               rVertexBuffer[7000:0];
74 111 diegovalve
        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 143 diegovalve
                .HDL_O( GRDY_I ),
127
                .HDLACK_I( GACK_O ),
128 111 diegovalve
                .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 143 diegovalve
        .iPrimitiveCount( (rVertexBuffer[6]+1) *7 ),  //This is wrong I think
173 111 diegovalve
        .iGPUCommitedResults( wGPUCommitedResults ),
174
        .STDONE_O( STDONE_O ),
175
        .iGPUDone( wDone ),
176 143 diegovalve
 
177
`ifndef NO_DISPLAY_STATS
178
        .iDebugWidth( `RESOLUTION_WIDTH ),
179
 `endif
180 84 diegovalve
 
181 111 diegovalve
        //To Memory
182
.oReadAddress( wHostReadAddress ),
183
.iReadData(    wHostReadData ),
184
 
185
        //To Hub/Switch
186
.oCoreSelectMask( wCoreSelect ),
187
.oMemSelect( wMemSelect ),
188
.DAT_O( DAT_O),
189
.ADR_O( ADR_O ),
190
.TGA_O( TGA_O ),
191
.RENDREN_O( RENDREN_O ),
192
.CYC_O( CYC_O ),
193
.STB_O( STB_O ),
194
.MST_O( MST_O ),
195 84 diegovalve
 
196 111 diegovalve
.GRDY_I( GRDY_I ),
197
.GACK_O( GACK_O ),
198 84 diegovalve
 
199 111 diegovalve
.WE_O(  WE_O  ),
200 84 diegovalve
 
201
 
202 111 diegovalve
.ACK_I( ACK_I )
203
);
204
        //---------------------------------------------
205
        //generate the clock signal here
206
        always begin
207
                #`CLOCK_CYCLE  Clock =  ! Clock;
208
 
209
        end
210
        //---------------------------------------------
211 143 diegovalve
 
212 77 diegovalve
 
213 143 diegovalve
//-------------------------------------------------------------------------------------
214
/*
215
This makes sure the simulation actually writes the results to the PPM image file
216
once all the cores are done executing
217
*/
218 111 diegovalve
`define PARTITION_SIZE `RESOLUTION_HEIGHT/`MAX_CORES
219
integer i,j,kk;
220
reg [31:0] R;
221
always @ ( * )
222
begin
223
 
224
 
225
if (wDone == 1'b1)
226
begin
227
 
228
        $display("Partition Size = %d",`PARTITION_SIZE);
229 143 diegovalve
        for (kk = 0; kk < `MAX_CORES; kk = kk+1)
230 77 diegovalve
                        begin
231 111 diegovalve
                        wOMEMBankSelect = kk;
232
                                $display("wOMEMBankSelect = %d\n",wOMEMBankSelect);
233
                                for (j=0; j < `PARTITION_SIZE; j=j+1)//for (j = 0; j < 15; j = j+1)                                                                      //LOOK OUT 15 is hardcoded!!!!!!!!
234
                                begin
235
 
236
                                        for (i = 0; i < `RESOLUTION_HEIGHT*3; i = i +1)
237
                                        begin
238
                                        wOMEMReadAddr = i+j*`RESOLUTION_WIDTH*3;
239
                                        #`CLOCK_PERIOD;
240
                                        #1;
241
                                        R = ((wOMEMData >> (`SCALE-8)) > 255) ? 255 : (wOMEMData >>  (`SCALE-8));
242
                                        $fwrite(out2,"%d " , R );
243 77 diegovalve
 
244 111 diegovalve
                                                if ((i %3) == 0)
245
                                                                $fwrite(out2,"\n# %d %d\n",i/3,j);
246
 
247
                                        end
248
                                end
249
                        end
250
 
251 77 diegovalve
 
252 84 diegovalve
 
253 111 diegovalve
                        $fclose(out2);
254
                        $fwrite(log, "Simulation end time : %dns\n",$time);
255
                        $fclose(log);
256 84 diegovalve
 
257 111 diegovalve
 
258
                        $stop();
259 84 diegovalve
 
260
 
261 111 diegovalve
end
262 84 diegovalve
end
263 143 diegovalve
//-------------------------------------------------------------------------------------
264 84 diegovalve
 
265 111 diegovalve
reg [15:0] rTimeOut;
266 77 diegovalve
 
267 143 diegovalve
        //      `define MAX_INSTRUCTIONS 2
268 84 diegovalve
 
269 111 diegovalve
        initial begin
270
                // Initialize Inputs
271
 
272
 
273
                Clock                                   = 0;
274
                Reset                                   = 0;
275
                rTimeOut             = 0;
276
                rHostEnable                     = 0;
277
                //Read Config register values
278
                $write("Loading control register.... ");
279
                $readmemh("Creg.mem",rControlRegister);
280
                $display("Done");
281
 
282
 
283
 
284
                //Read configuration Data
285
                $write("Loading scene parameters.... ");
286
                $readmemh("Params.mem", rSceneParameters        );
287
                $display("Done");
288
 
289
 
290
                //Read Scene Data
291
                $write("Loading scene geometry.... ");
292
                $readmemh("Vertex.mem",rVertexBuffer);
293
                $display("Done");
294
 
295 143 diegovalve
                $display("Number of primitives(%d): %d",rVertexBuffer[6],(rVertexBuffer[6]+1) *7);
296
 
297
 
298 111 diegovalve
                //Read Texture Data
299
                $write("Loading scene texture.... ");
300
                $readmemh("Textures.mem",rTextures);
301
                $display("Done");
302
 
303
 
304
                //Read instruction data
305
                $write("Loading code allocation table and user shaders.... ");
306
                $readmemh("Instructions.mem",rInstructionBuffer);
307
                $display("Done");
308
 
309
                $display("Control Register : %b",rControlRegister[0]);
310
                $display("Resolution       : %d X %d",`RESOLUTION_WIDTH, `RESOLUTION_HEIGHT );
311
 
312
                //Open output file
313
        //      file = $fopen("Output.ppm");
314
                log  = $fopen("Simulation.log");
315
                $fwrite(log, "Simulation start time : %dns\n",$time);
316
                $fwrite(log, "Width : %d\n",`RESOLUTION_WIDTH);
317
                $fwrite(log, "Height : %d\n",`RESOLUTION_HEIGHT);
318
 
319 143 diegovalve
 
320 111 diegovalve
                //Open output file
321
                out2 = $fopen("Output.ppm");
322
 
323
                $fwrite(out2,"P3\n");
324
                $fwrite(out2,"#This file was generated by Theia's RTL simulation\n");
325
                $fwrite(out2,"%d %d\n",`RESOLUTION_WIDTH, `RESOLUTION_HEIGHT );
326
                $fwrite(out2,"255\n");
327
 
328
                #10
329
                Reset = 1;
330
 
331
 
332
                // Wait 100 ns for global reset to finish
333
                TMWE_O = 1;
334
                #100  Reset = 0;
335
                TMWE_O = 1;
336
 
337
                $display("Intilializing TMEM @ %dns",$time);
338
                //starts in 2 to skip Width and Height
339
                for (k = 0;k < `TEXTURE_BUFFER_SIZE; k = k + 1)
340
                begin
341
 
342 143 diegovalve
                        TMADR_O <= (k >> (`MAX_CORE_BITS));
343
                        TMSEL_O <= (k & (`MAX_TMEM_BANKS-1));           //X mod 2^n == X & (2^n - 1)
344 111 diegovalve
                        TMDAT_O <= rTextures[k];
345
                        #10;
346
                end
347
                $display("Done Intilializing TMEM @ %dns",$time);
348
                TMWE_O = 0;
349
                rHostEnable = 1;
350
 
351
        end
352
 
353
 
354
endmodule

powered by: WebSVN 2.1.0

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