1 |
37 |
diegovalve |
/**********************************************************************************
|
2 |
|
|
Theaia, Ray Cast Programable graphic Processing Unit.
|
3 |
|
|
Copyright (C) 2009 Diego Valverde (diego.valverde.g@gmail.com)
|
4 |
|
|
|
5 |
|
|
This program is free software; you can redistribute it and/or
|
6 |
|
|
modify it under the terms of the GNU General Public License
|
7 |
|
|
as published by the Free Software Foundation; either version 2
|
8 |
|
|
of the License, or (at your option) any later version.
|
9 |
|
|
|
10 |
|
|
This program is distributed in the hope that it will be useful,
|
11 |
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
|
|
GNU General Public License for more details.
|
14 |
|
|
|
15 |
|
|
You should have received a copy of the GNU General Public License
|
16 |
|
|
along with this program; if not, write to the Free Software
|
17 |
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
18 |
|
|
|
19 |
|
|
***********************************************************************************/
|
20 |
|
|
|
21 |
|
|
|
22 |
|
|
/*******************************************************************************
|
23 |
|
|
Module Description:
|
24 |
|
|
|
25 |
|
|
This module defines constants that are going to be used
|
26 |
120 |
diegovalve |
all over the code. By now you have may noticed that all
|
27 |
37 |
diegovalve |
constants are pre-compilation define directives. This is
|
28 |
|
|
for simulation perfomance reasons mainly.
|
29 |
|
|
*******************************************************************************/
|
30 |
|
|
|
31 |
119 |
diegovalve |
`define MAX_CORES 4 //The number of cores, make sure you update MAX_CORE_BITS!
|
32 |
|
|
`define MAX_CORE_BITS 2 // 2 ^ MAX_CORE_BITS = MAX_CORES
|
33 |
|
|
`define MAX_TMEM_BANKS 4 //The number of memory banks for TMEM
|
34 |
37 |
diegovalve |
//---------------------------------------------------------------------------------
|
35 |
|
|
//Verilog provides a `default_nettype none compiler directive. When
|
36 |
|
|
//this directive is set, implicit data types are disabled, which will make any
|
37 |
|
|
//undeclared signal name a syntax error.This is very usefull to avoid annoying
|
38 |
|
|
//automatic 1 bit long wire declaration where you don't want them to be!
|
39 |
|
|
`default_nettype none
|
40 |
60 |
diegovalve |
|
41 |
|
|
//The clock cycle
|
42 |
119 |
diegovalve |
`define CLOCK_CYCLE 5
|
43 |
60 |
diegovalve |
`define CLOCK_PERIOD 10
|
44 |
37 |
diegovalve |
//---------------------------------------------------------------------------------
|
45 |
120 |
diegovalve |
//Defines the Scale. This very important because it sets the fixed point precision.
|
46 |
37 |
diegovalve |
//The Scale defines the number bits that are used as the decimal part of the number.
|
47 |
|
|
//The code has been written in such a way that allows you to change the value of the
|
48 |
120 |
diegovalve |
//Scale, so that it is possible to experiment with different scenarios. SCALE can be
|
49 |
37 |
diegovalve |
//no smaller that 1 and no bigger that WIDTH.
|
50 |
119 |
diegovalve |
`define SCALE 17
|
51 |
37 |
diegovalve |
|
52 |
120 |
diegovalve |
//The next section defines the length of the registers, buses and other structures,
|
53 |
37 |
diegovalve |
//do not change this valued unless you really know what you are doing (seriously!)
|
54 |
119 |
diegovalve |
`define WIDTH 32
|
55 |
37 |
diegovalve |
`define WB_WIDTH 32 //width of wish-bone buses
|
56 |
119 |
diegovalve |
`define LONG_WIDTH 64
|
57 |
37 |
diegovalve |
|
58 |
119 |
diegovalve |
`define WB_SIMPLE_READ_CYCLE 0
|
59 |
37 |
diegovalve |
`define WB_SIMPLE_WRITE_CYCLE 1
|
60 |
|
|
//---------------------------------------------------------------------------------
|
61 |
|
|
//Next are the constants that define the size of the instructions.
|
62 |
|
|
//instructions are formed like this:
|
63 |
|
|
// Tupe I:
|
64 |
120 |
diegovalve |
// Operand (of size INSTRUCTION_OP_LENGTH )
|
65 |
37 |
diegovalve |
// DestinationAddr (of size DATA_ADDRESS_WIDTH )
|
66 |
120 |
diegovalve |
// SourceAddrr1 (of size DATA_ADDRESS_WIDTH )
|
67 |
|
|
// SourceAddrr2 (of size DATA_ADDRESS_WIDTH )
|
68 |
37 |
diegovalve |
//Type II:
|
69 |
120 |
diegovalve |
// Operand (of size INSTRUCTION_OP_LENGTH )
|
70 |
37 |
diegovalve |
// DestinationAddr (of size DATA_ADDRESS_WIDTH )
|
71 |
120 |
diegovalve |
// InmeadiateValue (of size WIDTH = DATA_ADDRESS_WIDTH * 2 )
|
72 |
|
|
//
|
73 |
37 |
diegovalve |
//You can play around with the size of instuctions, but keep
|
74 |
|
|
//in mind that Bits 3 and 4 of the Operand have a special meaning
|
75 |
|
|
//that is used for the jump familiy of instructions (see Documentation).
|
76 |
|
|
//Also the MSB of Operand is used by the decoder to distinguish
|
77 |
|
|
//between Type I and Type II instructions.
|
78 |
119 |
diegovalve |
`define INSTRUCTION_WIDTH 64
|
79 |
|
|
`define INSTRUCTION_OP_LENGTH 16
|
80 |
|
|
`define INSTRUCTION_IMM_BITPOS 54
|
81 |
|
|
`define INSTRUCTION_IMM_BIT 6 //don't change this!
|
82 |
37 |
diegovalve |
|
83 |
|
|
//Defines the Lenght of Memory blocks
|
84 |
119 |
diegovalve |
`define DATA_ROW_WIDTH 96
|
85 |
|
|
`define DATA_ADDRESS_WIDTH 16
|
86 |
|
|
`define ROM_ADDRESS_WIDTH 16
|
87 |
60 |
diegovalve |
`define ROM_ADDRESS_SEL_MASK `ROM_ADDRESS_WIDTH'h8000
|
88 |
37 |
diegovalve |
|
89 |
|
|
//---------------------------------------------------------------------------------
|
90 |
120 |
diegovalve |
//The next section defines the code memory entry point for the various code routines
|
91 |
63 |
diegovalve |
//Please keep this syntax ENTRYPOINT_ADDR_* because the perl script that
|
92 |
|
|
//parses the user code expects this pattern in order to read in the tokens
|
93 |
37 |
diegovalve |
|
94 |
63 |
diegovalve |
//Internal Entry points (default ROM Address)
|
95 |
118 |
diegovalve |
`define ENTRYPOINT_ADRR_INITIAL `ROM_ADDRESS_WIDTH'd0 //0 - This should always be zero
|
96 |
|
|
`define ENTRYPOINT_ADRR_CPPU `ROM_ADDRESS_WIDTH'd44
|
97 |
|
|
`define ENTRYPOINT_ADRR_RGU `ROM_ADDRESS_WIDTH'd47
|
98 |
|
|
`define ENTRYPOINT_ADRR_AABBIU `ROM_ADDRESS_WIDTH'd69
|
99 |
|
|
`define ENTRYPOINT_ADRR_BIU `ROM_ADDRESS_WIDTH'd157
|
100 |
|
|
`define ENTRYPOINT_ADRR_PSU `ROM_ADDRESS_WIDTH'd232
|
101 |
|
|
`define ENTRYPOINT_ADRR_PSU2 `ROM_ADDRESS_WIDTH'd248
|
102 |
|
|
`define ENTRYPOINT_ADRR_TCC `ROM_ADDRESS_WIDTH'd190
|
103 |
|
|
`define ENTRYPOINT_ADRR_NPG `ROM_ADDRESS_WIDTH'd55
|
104 |
63 |
diegovalve |
//User Entry points (default ROM Address)
|
105 |
118 |
diegovalve |
`define ENTRYPOINT_ADRR_USERCONSTANTS `ROM_ADDRESS_WIDTH'd276
|
106 |
|
|
`define ENTRYPOINT_ADRR_PIXELSHADER `ROM_ADDRESS_WIDTH'd278
|
107 |
|
|
`define ENTRYPOINT_ADRR_MAIN `ROM_ADDRESS_WIDTH'd37
|
108 |
60 |
diegovalve |
|
109 |
63 |
diegovalve |
//Please keep this syntax ENTRYPOINT_INDEX_* because the perl script that
|
110 |
|
|
//parses the user code expects this pattern in order to read in the tokens
|
111 |
|
|
//Internal subroutines
|
112 |
118 |
diegovalve |
`define ENTRYPOINT_INDEX_INITIAL `ROM_ADDRESS_WIDTH'h8000
|
113 |
|
|
`define ENTRYPOINT_INDEX_CPPU `ROM_ADDRESS_WIDTH'h8001
|
114 |
|
|
`define ENTRYPOINT_INDEX_RGU `ROM_ADDRESS_WIDTH'h8002
|
115 |
|
|
`define ENTRYPOINT_INDEX_AABBIU `ROM_ADDRESS_WIDTH'h8003
|
116 |
|
|
`define ENTRYPOINT_INDEX_BIU `ROM_ADDRESS_WIDTH'h8004
|
117 |
|
|
`define ENTRYPOINT_INDEX_PSU `ROM_ADDRESS_WIDTH'h8005
|
118 |
|
|
`define ENTRYPOINT_INDEX_PSU2 `ROM_ADDRESS_WIDTH'h8006
|
119 |
|
|
`define ENTRYPOINT_INDEX_TCC `ROM_ADDRESS_WIDTH'h8007
|
120 |
|
|
`define ENTRYPOINT_INDEX_NPG `ROM_ADDRESS_WIDTH'h8008
|
121 |
63 |
diegovalve |
//User defined subroutines
|
122 |
|
|
`define ENTRYPOINT_INDEX_USERCONSTANTS `ROM_ADDRESS_WIDTH'h8009
|
123 |
104 |
diegovalve |
`define ENTRYPOINT_INDEX_PIXELSHADER `ROM_ADDRESS_WIDTH'h800A
|
124 |
|
|
`define ENTRYPOINT_INDEX_MAIN `ROM_ADDRESS_WIDTH'h800B
|
125 |
60 |
diegovalve |
|
126 |
37 |
diegovalve |
`define USER_AABBIU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'b1000000000000000
|
127 |
|
|
//---------------------------------------------------------------------------------
|
128 |
|
|
//This handy little macro allows me to print stuff either to STDOUT or a file.
|
129 |
|
|
//Notice that the compilation vairable DUMP_CODE must be set if you want to print
|
130 |
|
|
//to a file. In XILINX right click 'Simulate Beahvioral Model' -> Properties and
|
131 |
120 |
diegovalve |
//under 'Specify `define macro name and value' type 'DEBUG=1|DUMP_CODE=1|DEBUG_CORE=<core you want to dump>'
|
132 |
37 |
diegovalve |
`ifdef DUMP_CODE
|
133 |
|
|
|
134 |
|
|
`define LOGME $fwrite(ucode_file,
|
135 |
|
|
`else
|
136 |
|
|
`define LOGME $write(
|
137 |
|
|
`endif
|
138 |
104 |
diegovalve |
//---------------------------------------------------------------------------------
|
139 |
119 |
diegovalve |
`define TRUE 32'h1
|
140 |
|
|
`define FALSE 32'h0
|
141 |
|
|
`define RT_TRUE 48'b1
|
142 |
37 |
diegovalve |
`define RT_FALSE 48'b0
|
143 |
|
|
//---------------------------------------------------------------------------------
|
144 |
70 |
diegovalve |
|
145 |
|
|
`define GENERAL_PURPOSE_REG_ADDR_MASK `DATA_ADDRESS_WIDTH'h1F
|
146 |
119 |
diegovalve |
`define VOID `DATA_ADDRESS_WIDTH'd0 //0000
|
147 |
37 |
diegovalve |
//** Control register bits **//
|
148 |
|
|
`define CR_EN_LIGHTS 0
|
149 |
|
|
`define CR_EN_TEXTURE 1
|
150 |
|
|
`define CR_USER_AABBIU 2
|
151 |
70 |
diegovalve |
/** Swapping registers **/
|
152 |
|
|
//** Configuration Registers **//
|
153 |
119 |
diegovalve |
`define CREG_LIGHT_INFO `DATA_ADDRESS_WIDTH'd0
|
154 |
|
|
`define CREG_CAMERA_POSITION `DATA_ADDRESS_WIDTH'd1
|
155 |
|
|
`define CREG_PROJECTION_WINDOW_MIN `DATA_ADDRESS_WIDTH'd2
|
156 |
|
|
`define CREG_PROJECTION_WINDOW_MAX `DATA_ADDRESS_WIDTH'd3
|
157 |
|
|
`define CREG_RESOLUTION `DATA_ADDRESS_WIDTH'd4
|
158 |
|
|
`define CREG_TEXTURE_SIZE `DATA_ADDRESS_WIDTH'd5
|
159 |
|
|
`define CREG_PIXEL_2D_INITIAL_POSITION `DATA_ADDRESS_WIDTH'd6
|
160 |
|
|
`define CREG_PIXEL_2D_FINAL_POSITION `DATA_ADDRESS_WIDTH'd7
|
161 |
|
|
`define CREG_FIRST_LIGTH `DATA_ADDRESS_WIDTH'd8
|
162 |
|
|
`define CREG_FIRST_LIGTH_DIFFUSE `DATA_ADDRESS_WIDTH'd8
|
163 |
37 |
diegovalve |
//OK, so from address 0x06 to 0x0F is where the lights are,watch out values are harcoded
|
164 |
|
|
//for now!! (look in ROM.v for hardcoded values!!!)
|
165 |
|
|
|
166 |
|
|
|
167 |
70 |
diegovalve |
//Don't change the order of the registers. CREG_V* and CREG_UV* registers
|
168 |
|
|
//need to be in that specific order for the triangle fetcher to work
|
169 |
|
|
//correctly!
|
170 |
37 |
diegovalve |
|
171 |
119 |
diegovalve |
`define CREG_AABBMIN `DATA_ADDRESS_WIDTH'd42
|
172 |
|
|
`define CREG_AABBMAX `DATA_ADDRESS_WIDTH'd43
|
173 |
|
|
`define CREG_V0 `DATA_ADDRESS_WIDTH'd44
|
174 |
|
|
`define CREG_UV0 `DATA_ADDRESS_WIDTH'd45
|
175 |
|
|
`define CREG_V1 `DATA_ADDRESS_WIDTH'd46
|
176 |
|
|
`define CREG_UV1 `DATA_ADDRESS_WIDTH'd47
|
177 |
|
|
`define CREG_V2 `DATA_ADDRESS_WIDTH'd48
|
178 |
|
|
`define CREG_UV2 `DATA_ADDRESS_WIDTH'd49
|
179 |
|
|
`define CREG_TRI_DIFFUSE `DATA_ADDRESS_WIDTH'd50
|
180 |
|
|
`define CREG_TEX_COLOR1 `DATA_ADDRESS_WIDTH'd53
|
181 |
|
|
`define CREG_TEX_COLOR2 `DATA_ADDRESS_WIDTH'd54
|
182 |
|
|
`define CREG_TEX_COLOR3 `DATA_ADDRESS_WIDTH'd55
|
183 |
|
|
`define CREG_TEX_COLOR4 `DATA_ADDRESS_WIDTH'd56
|
184 |
|
|
`define CREG_TEX_COLOR5 `DATA_ADDRESS_WIDTH'd57
|
185 |
|
|
`define CREG_TEX_COLOR6 `DATA_ADDRESS_WIDTH'd58
|
186 |
|
|
`define CREG_TEX_COLOR7 `DATA_ADDRESS_WIDTH'd59
|
187 |
37 |
diegovalve |
|
188 |
|
|
|
189 |
70 |
diegovalve |
/** Non-Swapping registers **/
|
190 |
37 |
diegovalve |
// ** User Registers **//
|
191 |
|
|
//General Purpose registers, the user may put what ever he/she
|
192 |
|
|
//wants in here...
|
193 |
70 |
diegovalve |
`define C1 `DATA_ADDRESS_WIDTH'd64
|
194 |
|
|
`define C2 `DATA_ADDRESS_WIDTH'd65
|
195 |
|
|
`define C3 `DATA_ADDRESS_WIDTH'd66
|
196 |
|
|
`define C4 `DATA_ADDRESS_WIDTH'd67
|
197 |
|
|
`define C5 `DATA_ADDRESS_WIDTH'd68
|
198 |
|
|
`define C6 `DATA_ADDRESS_WIDTH'd69
|
199 |
|
|
`define C7 `DATA_ADDRESS_WIDTH'd70
|
200 |
119 |
diegovalve |
`define R1 `DATA_ADDRESS_WIDTH'd71
|
201 |
|
|
`define R2 `DATA_ADDRESS_WIDTH'd72
|
202 |
|
|
`define R3 `DATA_ADDRESS_WIDTH'd73
|
203 |
70 |
diegovalve |
`define R4 `DATA_ADDRESS_WIDTH'd74
|
204 |
|
|
`define R5 `DATA_ADDRESS_WIDTH'd75
|
205 |
|
|
`define R6 `DATA_ADDRESS_WIDTH'd76
|
206 |
|
|
`define R7 `DATA_ADDRESS_WIDTH'd77
|
207 |
|
|
`define R8 `DATA_ADDRESS_WIDTH'd78
|
208 |
|
|
`define R9 `DATA_ADDRESS_WIDTH'd79
|
209 |
|
|
`define R10 `DATA_ADDRESS_WIDTH'd80
|
210 |
|
|
`define R11 `DATA_ADDRESS_WIDTH'd81
|
211 |
|
|
`define R12 `DATA_ADDRESS_WIDTH'd82
|
212 |
37 |
diegovalve |
|
213 |
70 |
diegovalve |
//** Internal Registers **//
|
214 |
119 |
diegovalve |
`define CREG_PROJECTION_WINDOW_SCALE `DATA_ADDRESS_WIDTH'd83
|
215 |
|
|
`define CREG_UNORMALIZED_DIRECTION `DATA_ADDRESS_WIDTH'd84
|
216 |
|
|
`define CREG_RAY_DIRECTION `DATA_ADDRESS_WIDTH'd85
|
217 |
|
|
`define CREG_E1_LAST `DATA_ADDRESS_WIDTH'd86
|
218 |
|
|
`define CREG_E2_LAST `DATA_ADDRESS_WIDTH'd87
|
219 |
|
|
`define CREG_T `DATA_ADDRESS_WIDTH'd88
|
220 |
|
|
`define CREG_P `DATA_ADDRESS_WIDTH'd89
|
221 |
|
|
`define CREG_Q `DATA_ADDRESS_WIDTH'd90
|
222 |
|
|
`define CREG_UV0_LAST `DATA_ADDRESS_WIDTH'd91
|
223 |
|
|
`define CREG_UV1_LAST `DATA_ADDRESS_WIDTH'd92
|
224 |
|
|
`define CREG_UV2_LAST `DATA_ADDRESS_WIDTH'd93
|
225 |
|
|
`define CREG_TRI_DIFFUSE_LAST `DATA_ADDRESS_WIDTH'd94
|
226 |
|
|
`define CREG_LAST_t `DATA_ADDRESS_WIDTH'd95
|
227 |
|
|
`define CREG_LAST_u `DATA_ADDRESS_WIDTH'd96
|
228 |
|
|
`define CREG_LAST_v `DATA_ADDRESS_WIDTH'd97
|
229 |
|
|
`define CREG_COLOR_ACC `DATA_ADDRESS_WIDTH'd98
|
230 |
|
|
`define CREG_t `DATA_ADDRESS_WIDTH'd99
|
231 |
|
|
`define CREG_E1 `DATA_ADDRESS_WIDTH'd100
|
232 |
|
|
`define CREG_E2 `DATA_ADDRESS_WIDTH'd101
|
233 |
|
|
`define CREG_DELTA `DATA_ADDRESS_WIDTH'd102
|
234 |
|
|
`define CREG_u `DATA_ADDRESS_WIDTH'd103
|
235 |
|
|
`define CREG_v `DATA_ADDRESS_WIDTH'd104
|
236 |
|
|
`define CREG_H1 `DATA_ADDRESS_WIDTH'd105
|
237 |
|
|
`define CREG_H2 `DATA_ADDRESS_WIDTH'd106
|
238 |
|
|
`define CREG_H3 `DATA_ADDRESS_WIDTH'd107
|
239 |
|
|
`define CREG_PIXEL_PITCH `DATA_ADDRESS_WIDTH'd108
|
240 |
76 |
diegovalve |
|
241 |
119 |
diegovalve |
`define CREG_LAST_COL `DATA_ADDRESS_WIDTH'd109 //the last valid column, simply CREG_RESOLUTIONX - 1
|
242 |
70 |
diegovalve |
`define CREG_TEXTURE_COLOR `DATA_ADDRESS_WIDTH'd110
|
243 |
119 |
diegovalve |
`define CREG_PIXEL_2D_POSITION `DATA_ADDRESS_WIDTH'd111
|
244 |
|
|
`define CREG_TEXWEIGHT1 `DATA_ADDRESS_WIDTH'd112
|
245 |
|
|
`define CREG_TEXWEIGHT2 `DATA_ADDRESS_WIDTH'd113
|
246 |
|
|
`define CREG_TEXWEIGHT3 `DATA_ADDRESS_WIDTH'd114
|
247 |
|
|
`define CREG_TEXWEIGHT4 `DATA_ADDRESS_WIDTH'd115
|
248 |
104 |
diegovalve |
`define CREG_TEX_COORD1 `DATA_ADDRESS_WIDTH'd116
|
249 |
|
|
`define CREG_TEX_COORD2 `DATA_ADDRESS_WIDTH'd117
|
250 |
|
|
`define R99 `DATA_ADDRESS_WIDTH'd118
|
251 |
|
|
`define CREG_ZERO `DATA_ADDRESS_WIDTH'd119
|
252 |
119 |
diegovalve |
`define CREG_CURRENT_OUTPUT_PIXEL `DATA_ADDRESS_WIDTH'd120
|
253 |
|
|
`define CREG_3 `DATA_ADDRESS_WIDTH'd121
|
254 |
115 |
diegovalve |
`define CREG_012 `DATA_ADDRESS_WIDTH'd122
|
255 |
37 |
diegovalve |
|
256 |
70 |
diegovalve |
//** Ouput registers **//
|
257 |
37 |
diegovalve |
|
258 |
119 |
diegovalve |
`define OREG_PIXEL_COLOR `DATA_ADDRESS_WIDTH'd128
|
259 |
|
|
`define OREG_TEX_COORD1 `DATA_ADDRESS_WIDTH'd129
|
260 |
|
|
`define OREG_TEX_COORD2 `DATA_ADDRESS_WIDTH'd130
|
261 |
|
|
`define OREG_ADDR_O `DATA_ADDRESS_WIDTH'd131
|
262 |
37 |
diegovalve |
//-------------------------------------------------------------
|
263 |
|
|
//*** Instruction Set ***
|
264 |
120 |
diegovalve |
//The order of the instructions is important here!. Don't change
|
265 |
|
|
//it unless you know what you are doing. For example all the 'SET'
|
266 |
37 |
diegovalve |
//family of instructions have the MSB bit in 1. This means that
|
267 |
|
|
//if you add an instruction and the MSB=1, this instruction will treated
|
268 |
|
|
//as type II (see manual) meaning the second 32bit argument is expected to be
|
269 |
|
|
//an inmediate value instead of a register address!
|
270 |
|
|
//Another example is that in the JUMP family Bits 3 and 4 have a special
|
271 |
|
|
//meaning: b4b3 = 01 => X jump type, b4b3 = 10 => Y jump type, finally
|
272 |
|
|
//b4b3 = 11 means Z jump type.
|
273 |
|
|
//All this is just to tell you: Don't play with these values!
|
274 |
|
|
|
275 |
|
|
// *** Type I Instructions (OP DST REG1 REG2) ***
|
276 |
119 |
diegovalve |
`define NOP `INSTRUCTION_OP_LENGTH'b0_000000 //0
|
277 |
37 |
diegovalve |
`define ADD `INSTRUCTION_OP_LENGTH'b0_000001 //1
|
278 |
|
|
`define SUB `INSTRUCTION_OP_LENGTH'b0_000010 //2
|
279 |
|
|
`define DIV `INSTRUCTION_OP_LENGTH'b0_000011 //3
|
280 |
|
|
`define MUL `INSTRUCTION_OP_LENGTH'b0_000100 //4
|
281 |
|
|
`define MAG `INSTRUCTION_OP_LENGTH'b0_000101 //5
|
282 |
|
|
`define COPY `INSTRUCTION_OP_LENGTH'b0_000111 //7
|
283 |
|
|
`define JGX `INSTRUCTION_OP_LENGTH'b0_001_000 //8
|
284 |
|
|
`define JLX `INSTRUCTION_OP_LENGTH'b0_001_001 //9
|
285 |
70 |
diegovalve |
`define JEQX `INSTRUCTION_OP_LENGTH'b0_001_010 //10 - A
|
286 |
|
|
`define JNEX `INSTRUCTION_OP_LENGTH'b0_001_011 //11 - B
|
287 |
|
|
`define JGEX `INSTRUCTION_OP_LENGTH'b0_001_100 //12 - C
|
288 |
|
|
`define JLEX `INSTRUCTION_OP_LENGTH'b0_001_101 //13 - D
|
289 |
|
|
`define INC `INSTRUCTION_OP_LENGTH'b0_001_110 //14 - E
|
290 |
|
|
`define ZERO `INSTRUCTION_OP_LENGTH'b0_001_111 //15 - F
|
291 |
37 |
diegovalve |
`define JGY `INSTRUCTION_OP_LENGTH'b0_010_000 //16
|
292 |
|
|
`define JLY `INSTRUCTION_OP_LENGTH'b0_010_001 //17
|
293 |
|
|
`define JEQY `INSTRUCTION_OP_LENGTH'b0_010_010 //18
|
294 |
|
|
`define JNEY `INSTRUCTION_OP_LENGTH'b0_010_011 //19
|
295 |
|
|
`define JGEY `INSTRUCTION_OP_LENGTH'b0_010_100 //20
|
296 |
|
|
`define JLEY `INSTRUCTION_OP_LENGTH'b0_010_101 //21
|
297 |
|
|
`define CROSS `INSTRUCTION_OP_LENGTH'b0_010_110 //22
|
298 |
|
|
`define DOT `INSTRUCTION_OP_LENGTH'b0_010_111 //23
|
299 |
|
|
`define JGZ `INSTRUCTION_OP_LENGTH'b0_011_000 //24
|
300 |
|
|
`define JLZ `INSTRUCTION_OP_LENGTH'b0_011_001 //25
|
301 |
|
|
`define JEQZ `INSTRUCTION_OP_LENGTH'b0_011_010 //26
|
302 |
|
|
`define JNEZ `INSTRUCTION_OP_LENGTH'b0_011_011 //27
|
303 |
|
|
`define JGEZ `INSTRUCTION_OP_LENGTH'b0_011_100 //28
|
304 |
|
|
`define JLEZ `INSTRUCTION_OP_LENGTH'b0_011_101 //29
|
305 |
|
|
|
306 |
|
|
//The next instruction is for simulation debug only
|
307 |
|
|
//not to be synthetized! Pretty much behaves the same
|
308 |
|
|
//as a NOP, only that prints the register value to
|
309 |
|
|
//a log file called 'Registers.log'
|
310 |
|
|
`ifdef DEBUG
|
311 |
|
|
`define DEBUG_PRINT `INSTRUCTION_OP_LENGTH'b0_011_110 //30
|
312 |
|
|
`endif
|
313 |
|
|
|
314 |
119 |
diegovalve |
`define MULP `INSTRUCTION_OP_LENGTH'b0_011_111 //31 R1.z = S1.x * S1.y
|
315 |
|
|
`define MOD `INSTRUCTION_OP_LENGTH'b0_100_000 //32 R = MODULO( S1,S2 )
|
316 |
|
|
`define FRAC `INSTRUCTION_OP_LENGTH'b0_100_001 //33 R =FractionalPart( S1 )
|
317 |
|
|
`define INTP `INSTRUCTION_OP_LENGTH'b0_100_010 //34 R =IntergerPart( S1 )
|
318 |
|
|
`define NEG `INSTRUCTION_OP_LENGTH'b0_100_011 //35 R = -S1
|
319 |
|
|
`define DEC `INSTRUCTION_OP_LENGTH'b0_100_100 //36 R = S1--
|
320 |
37 |
diegovalve |
`define XCHANGEX `INSTRUCTION_OP_LENGTH'b0_100_101 // R.x = S2.x, R.y = S1.y, R.z = S1.z
|
321 |
|
|
`define XCHANGEY `INSTRUCTION_OP_LENGTH'b0_100_110 // R.x = S1.x, R.y = S2.y, R.z = S1.z
|
322 |
|
|
`define XCHANGEZ `INSTRUCTION_OP_LENGTH'b0_100_111 // R.x = S1.x, R.y = S1.y, R.z = S2.z
|
323 |
|
|
`define IMUL `INSTRUCTION_OP_LENGTH'b0_101_000 // R = INTEGER( S1 * S2 )
|
324 |
|
|
`define UNSCALE `INSTRUCTION_OP_LENGTH'b0_101_001 // R = S1 >> SCALE
|
325 |
|
|
`define RESCALE `INSTRUCTION_OP_LENGTH'b0_101_010 // R = S1 << SCALE
|
326 |
|
|
`define INCX `INSTRUCTION_OP_LENGTH'b0_101_011 // R.X = S1.X + 1
|
327 |
|
|
`define INCY `INSTRUCTION_OP_LENGTH'b0_101_100 // R.Y = S1.Y + 1
|
328 |
104 |
diegovalve |
`define INCZ `INSTRUCTION_OP_LENGTH'b0_101_101 // R.Z = S1.Z + 1
|
329 |
|
|
`define OMWRITE `INSTRUCTION_OP_LENGTH'b0_101_111 //47 IO write to O memory
|
330 |
119 |
diegovalve |
`define TMREAD `INSTRUCTION_OP_LENGTH'b0_110_000 //48 IO read from T memory
|
331 |
104 |
diegovalve |
`define LEA `INSTRUCTION_OP_LENGTH'b0_110_001 //49 Load effective address
|
332 |
37 |
diegovalve |
|
333 |
|
|
//*** Type II Instructions (OP DST REG1 IMM) ***
|
334 |
60 |
diegovalve |
`define RETURN `INSTRUCTION_OP_LENGTH'b1_000000 //64 0x40
|
335 |
119 |
diegovalve |
`define SETX `INSTRUCTION_OP_LENGTH'b1_000001 //65 0x41
|
336 |
|
|
`define SETY `INSTRUCTION_OP_LENGTH'b1_000010 //66
|
337 |
|
|
`define SETZ `INSTRUCTION_OP_LENGTH'b1_000011 //67
|
338 |
|
|
`define SWIZZLE3D `INSTRUCTION_OP_LENGTH'b1_000100 //68
|
339 |
|
|
`define JMP `INSTRUCTION_OP_LENGTH'b1_011000 //56
|
340 |
104 |
diegovalve |
`define CALL `INSTRUCTION_OP_LENGTH'b1_011001 //57
|
341 |
|
|
`define RET `INSTRUCTION_OP_LENGTH'b1_011010 //58
|
342 |
60 |
diegovalve |
|
343 |
37 |
diegovalve |
//-------------------------------------------------------------
|
344 |
|
|
|
345 |
120 |
diegovalve |
//All the posible values for the SWIZZLE3D instruction are defined next
|
346 |
37 |
diegovalve |
`define SWIZZLE_XXX 32'd0
|
347 |
|
|
`define SWIZZLE_YYY 32'd1
|
348 |
|
|
`define SWIZZLE_ZZZ 32'd2
|
349 |
|
|
`define SWIZZLE_XYY 32'd3
|
350 |
|
|
`define SWIZZLE_XXY 32'd4
|
351 |
|
|
`define SWIZZLE_XZZ 32'd5
|
352 |
|
|
`define SWIZZLE_XXZ 32'd6
|
353 |
|
|
`define SWIZZLE_YXX 32'd7
|
354 |
|
|
`define SWIZZLE_YYX 32'd8
|
355 |
|
|
`define SWIZZLE_YZZ 32'd9
|
356 |
|
|
`define SWIZZLE_YYZ 32'd10
|
357 |
|
|
`define SWIZZLE_ZXX 32'd11
|
358 |
|
|
`define SWIZZLE_ZZX 32'd12
|
359 |
|
|
`define SWIZZLE_ZYY 32'd13
|
360 |
|
|
`define SWIZZLE_ZZY 32'd14
|
361 |
|
|
`define SWIZZLE_XZX 32'd15
|
362 |
|
|
`define SWIZZLE_XYX 32'd16
|
363 |
|
|
`define SWIZZLE_YXY 32'd17
|
364 |
|
|
`define SWIZZLE_YZY 32'd18
|
365 |
|
|
`define SWIZZLE_ZXZ 32'd19
|
366 |
|
|
`define SWIZZLE_ZYZ 32'd20
|
367 |
|
|
`define SWIZZLE_YXZ 32'd21
|
368 |
|
|
|
369 |
|
|
|