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

Subversion Repositories hive

[/] [hive/] [trunk/] [v04.05/] [boot_code/] [boot_code_v_alu.h] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 ericw
/*
2
--------------------------------------------------------------------------------
3
 
4
Module : boot_code.h
5
 
6
--------------------------------------------------------------------------------
7
 
8
Function:
9
- Boot code for a processor core.
10
 
11
Instantiates:
12
- Nothing.
13
 
14
Notes:
15
- For testing (@ core.v):
16
  CLR_BASE              = 'h0;
17
  CLR_SPAN              = 2;  // gives 4 instructions
18
  INTR_BASE             = 'h20;  // 'd32
19
  INTR_SPAN             = 2;  // gives 4 instructions
20
 
21
 
22
--------------------------------------------------------------------------------
23
*/
24
 
25
        /*
26
        --------------------
27
        -- external stuff --
28
        --------------------
29
        */
30
        `include "op_encode.h"
31
        `include "reg_set_addr.h"
32
        `include "boot_code_defs.h"
33
 
34
        /*
35
        ----------------------------------------
36
        -- initialize: fill with default data --
37
        ----------------------------------------
38
        */
39
        integer i;
40
 
41
        initial begin
42
 
43
/*      // fill with nop (some compilers need this)
44
        for ( i = 0; i < CAPACITY; i = i+1 ) begin
45
                ram[i] = { `nop, `__, `__ };
46
        end
47
*/
48
 
49
        /*
50
        ---------------
51
        -- boot code --
52
        ---------------
53
        */
54
 
55
 
56
        // Thread 0 : test ALU logical functions
57
        // Thread 1 : test ALU arithmetic functions
58
        // Thread 2 : test ALU shift functions
59
        // All other threads : loop forever
60
 
61
        ///////////////
62
        // clr space //
63
        ///////////////
64
 
65
        // thread 0
66
        i='h00;  ram[i] = { `lit_u,            `__, `s2 };  // s2=dat
67
        i=i+1;   ram[i] =                      16'h0100  ;  // addr
68
        i=i+1;   ram[i] = { `gto,              `P2, `__ };  // goto, pop s2 (addr)
69
        // thread 1
70
        i='h04;  ram[i] = { `lit_u,            `__, `s2 };  // s2=dat
71
        i=i+1;   ram[i] =                      16'h0200  ;  // addr
72
        i=i+1;   ram[i] = { `gto,              `P2, `__ };  // goto, pop s2 (addr)
73
        // thread 2
74
        i='h08;  ram[i] = { `lit_u,            `__, `s2 };  // s2=dat
75
        i=i+1;   ram[i] =                      16'h0300  ;  // addr
76
        i=i+1;   ram[i] = { `gto,              `P2, `__ };  // goto, pop s2 (addr)
77
        // and the rest (are here on Gilligan's Isle)
78
        i='h0c;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
79
        i='h10;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
80
        i='h14;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
81
        i='h18;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
82
        i='h1c;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
83
 
84
        ////////////////
85
        // intr space //
86
        ////////////////
87
 
88
        ///////////////////////
89
        // code & data space //
90
        ///////////////////////
91
 
92
 
93
        // test ALU logical functions, result in s0
94
        // Correct functioning is s0 = 'd14 ('he).
95
        //
96
        // s0 : final test result
97
        // s1 : test value
98
        // s2 : test value
99
        // s3 : running test result, subroutine return address
100
        //
101
        // setup running test result:
102
        i='h100; ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
103
        // load s1 & s2 values
104
        i=i+1;   ram[i] = { `dat_is,          6'd1, `s1 };  // s1=1
105
        i=i+1;   ram[i] = { `dat_is,         -6'd1, `s2 };  // s2=-1
106
        // BRA ( &(1)= 0; &(-1)=-1 )
107
        i=i+1;   ram[i] = { `bra,              `s1, `s0 };  // s0=&s1
108
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P0 };  // (s0==0) ? skip, pop s0
109
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
110
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
111
        //
112
        i=i+1;   ram[i] = { `bra,              `s2, `s0 };  // s0=&s2
113
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `P0 };  // (s0!=0) ? skip, pop s0
114
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
115
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
116
        // BRO  ( |(1)=-1; |(-1)=-1 )
117
        i=i+1;   ram[i] = { `bro,              `s1, `s0 };  // s0=|s1
118
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `P0 };  // (s0!=0) ? skip, pop s0
119
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
120
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
121
        //
122
        i=i+1;   ram[i] = { `bro,              `s2, `s0 };  // s0=|s2
123
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `P0 };  // (s0!=0) ? skip, pop s0
124
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
125
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
126
        // BRX ( ^(1)=-1; ^(-1)=0 )
127
        i=i+1;   ram[i] = { `brx,              `s1, `s0 };  // s0=^s1
128
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `P0 };  // (s0!=0) ? skip, pop s0
129
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
130
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
131
        //
132
        i=i+1;   ram[i] = { `brx,              `s2, `s0 };  // s0=^s2
133
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P0 };  // (s0==0) ? skip, pop s0
134
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
135
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
136
        // clean up
137
        i=i+1;   ram[i] = { `pop,           8'b00000110 };  // pop s2 & s1
138
        // load s1 & s2 values
139
        i=i+1;   ram[i] = { `lit_u,            `__, `s1 };  // s1='h36c9,a53c
140
        i=i+1;   ram[i] =                      16'ha53c  ;  //
141
        i=i+1;   ram[i] = { `lit_h,            `__, `P1 };  //
142
        i=i+1;   ram[i] =                      16'h36c9  ;  // 
143
        //
144
        i=i+1;   ram[i] = { `lit_u,            `__, `s2 };  // s2='h5ca3,c396
145
        i=i+1;   ram[i] =                      16'hc396  ;  //
146
        i=i+1;   ram[i] = { `lit_h,            `__, `P2 };  //
147
        i=i+1;   ram[i] =                      16'h5ca3  ;  // 
148
        // AND (s/b 'h1481,8114)
149
        i=i+1;   ram[i] = { `and,              `s2, `s1 };  // s1=s1&s2
150
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h1481,8114
151
        i=i+1;   ram[i] =                      16'h8114  ;  //
152
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
153
        i=i+1;   ram[i] =                      16'h1481  ;  // 
154
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
155
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
156
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
157
        // OR  (s/b 'h7eeb,e7be)
158
        i=i+1;   ram[i] = { `orr,              `s2, `s1 };  // s1=s1|s2
159
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h7eeb,e7be
160
        i=i+1;   ram[i] =                      16'he7be  ;  //
161
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
162
        i=i+1;   ram[i] =                      16'h7eeb  ;  // 
163
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
164
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
165
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
166
        // XOR (s/b 'h6a6a,66aa)
167
        i=i+1;   ram[i] = { `xor,              `s2, `s1 };  // s1=s1^s2
168
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h6a6a,66aa
169
        i=i+1;   ram[i] =                      16'h66aa  ;  //
170
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
171
        i=i+1;   ram[i] =                      16'h6a6a  ;  // 
172
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
173
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
174
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
175
        // NOT (s/b 'hc936,5ac3)
176
        i=i+1;   ram[i] = { `not,              `s1, `s1 };  // s1=~s1
177
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='hc936,5ac3
178
        i=i+1;   ram[i] =                      16'h5ac3  ;  //
179
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
180
        i=i+1;   ram[i] =                      16'hc936  ;  // 
181
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
182
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
183
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
184
        // FLP (s/b 'h3ca5,936c)
185
        i=i+1;   ram[i] = { `flp,              `s1, `s1 };  // s1=flip(s1)
186
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h3ca5,936c
187
        i=i+1;   ram[i] =                      16'h936c  ;  //
188
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
189
        i=i+1;   ram[i] =                      16'h3ca5  ;  // 
190
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
191
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
192
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
193
        // LZC (s/b 'h0000,0002)
194
        i=i+1;   ram[i] = { `lzc,              `s1, `s1 };  // s1=lzc(s1)
195
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h0000,0002
196
        i=i+1;   ram[i] =                      16'h0002  ;  //
197
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
198
        i=i+1;   ram[i] =                      16'h0000  ;  // 
199
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
200
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
201
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
202
        // check for no opcode errors
203
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
204
        i=i+1;   ram[i] =                      16'h0900  ;  //
205
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
206
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
207
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
208
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
209
        // check for no stack errors
210
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
211
        i=i+1;   ram[i] =                      16'h0910  ;  //
212
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
213
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
214
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
215
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
216
        // copy result to s0
217
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
218
        // loop forever
219
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
220
 
221
 
222
        // test ALU arithmetic functions, result in s0
223
        // Correct functioning is s0 = 'd13 ('hd).
224
        //
225
        // s0 : final test result
226
        // s1 : test value
227
        // s2 : test value
228
        // s3 : running test result, subroutine return address
229
        //
230
        // setup running test result:
231
        i='h200; ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
232
        // load s1 & s2 values
233
        i=i+1;   ram[i] = { `lit_u,            `__, `s1 };  // s1='ha53c,36c9
234
        i=i+1;   ram[i] =                      16'h36c9  ;  //
235
        i=i+1;   ram[i] = { `lit_h,            `__, `P1 };  //
236
        i=i+1;   ram[i] =                      16'ha53c  ;  // 
237
        //
238
        i=i+1;   ram[i] = { `lit_u,            `__, `s2 };  // s2='h5ca3,c396
239
        i=i+1;   ram[i] =                      16'hc396  ;  //
240
        i=i+1;   ram[i] = { `lit_h,            `__, `P2 };  //
241
        i=i+1;   ram[i] =                      16'h5ca3  ;  // 
242
        // ADD_I -32 (s/b 'ha53c,36a9)
243
        i=i+1;   ram[i] = { `add_is,        -6'd32, `s1 };  // s1=s1-32
244
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='ha53c,36a9
245
        i=i+1;   ram[i] =                      16'h36a9  ;  //
246
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
247
        i=i+1;   ram[i] =                      16'ha53c  ;  // 
248
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
249
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
250
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
251
        // ADD_I +31 (s/b 'ha53c,36e8)
252
        i=i+1;   ram[i] = { `add_is,         6'd31, `s1 };  // s1=s1+31
253
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='ha53c,36e8
254
        i=i+1;   ram[i] =                      16'h36e8  ;  //
255
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
256
        i=i+1;   ram[i] =                      16'ha53c  ;  // 
257
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
258
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
259
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
260
        // ADD (s/b 'h01df,fa5f)
261
        i=i+1;   ram[i] = { `add,              `s2, `s1 };  // s1=s1+s2
262
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h01df,fa5f
263
        i=i+1;   ram[i] =                      16'hfa5f  ;  //
264
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
265
        i=i+1;   ram[i] =                      16'h01df  ;  // 
266
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
267
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
268
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
269
        // ADD_XS (s/b 0)
270
        i=i+1;   ram[i] = { `add_xs,           `s2, `s1 };  // s1=s1+s2
271
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
272
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
273
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
274
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
275
        // ADD_XU (s/b 1)
276
        i=i+1;   ram[i] = { `add_xu,           `s2, `s1 };  // s1=s1+s2
277
        i=i+1;   ram[i] = { `dat_is,          6'd1, `s0 };  // s0=1
278
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
279
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
280
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
281
        // SUB (s/b 'h4898,7333)
282
        i=i+1;   ram[i] = { `sub,              `s2, `s1 };  // s1=s1-s2
283
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h4898,7333
284
        i=i+1;   ram[i] =                      16'h7333  ;  //
285
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
286
        i=i+1;   ram[i] =                      16'h4898  ;  // 
287
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
288
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
289
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
290
        // SUB_XS (s/b -1)
291
        i=i+1;   ram[i] = { `sub_xs,           `s2, `s1 };  // s1=s1-s2
292
        i=i+1;   ram[i] = { `dat_is,         -6'd1, `s0 };  // s0=-1
293
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
294
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
295
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
296
        // SUB_XU (s/b 0)
297
        i=i+1;   ram[i] = { `sub_xu,           `s2, `s1 };  // s1=s1-s2
298
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
299
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
300
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
301
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
302
        // MUL (s/b 'hccfe,34c6)
303
        i=i+1;   ram[i] = { `mul,              `s2, `s1 };  // s1=s1*s2
304
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='hccfe,34c6
305
        i=i+1;   ram[i] =                      16'h34c6  ;  //
306
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
307
        i=i+1;   ram[i] =                      16'hccfe  ;  // 
308
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
309
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
310
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
311
        // MUL_XS (s/b 'hdf27,93ae)
312
        i=i+1;   ram[i] = { `mul_xs,           `s2, `s1 };  // s1=s1*s2
313
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='hdf27,93ae
314
        i=i+1;   ram[i] =                      16'h93ae  ;  //
315
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
316
        i=i+1;   ram[i] =                      16'hdf27  ;  // 
317
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
318
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
319
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
320
        // MUL_XU (s/b 'h3bcb,5744)
321
        i=i+1;   ram[i] = { `mul_xu,           `s2, `s1 };  // s1=s1*s2
322
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h3bcb,5744
323
        i=i+1;   ram[i] =                      16'h5744  ;  //
324
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
325
        i=i+1;   ram[i] =                      16'h3bcb  ;  // 
326
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
327
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
328
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
329
        // check for no opcode errors
330
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
331
        i=i+1;   ram[i] =                      16'h0900  ;  //
332
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
333
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
334
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
335
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
336
        // check for no stack errors
337
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
338
        i=i+1;   ram[i] =                      16'h0910  ;  //
339
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
340
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
341
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
342
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
343
        // copy result to s0
344
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
345
        // loop forever
346
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
347
 
348
 
349
        // test ALU shift functions, result in s0
350
        // Correct functioning is s0 = 'd12 ('hc).
351
        //
352
        // s0 : final test result
353
        // s1 : test value
354
        // s2 : test value
355
        // s3 : running test result, subroutine return address
356
        //
357
        // setup running test result:
358
        i='h300; ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
359
        // load s1 test value
360
        i=i+1;   ram[i] = { `lit_u,            `__, `s1 };  // s1='ha53c,36c9
361
        i=i+1;   ram[i] =                      16'h36c9  ;  // hi data
362
        i=i+1;   ram[i] = { `lit_h,            `__, `P1 };  // lit => s1, pop combine
363
        i=i+1;   ram[i] =                      16'ha53c  ;  // lo data
364
        // SHL_IS -28 (s/b 'hffff,fffa)
365
        i=i+1;   ram[i] = { `shl_is,        -6'd28, `s1 };  // s1>>=28
366
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='hffff,fffa
367
        i=i+1;   ram[i] =                      16'hfffa  ;  //
368
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
369
        i=i+1;   ram[i] =                      16'hffff  ;  // 
370
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
371
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
372
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
373
        // SHL_IS +28 (s/b 'h9000,0000)
374
        i=i+1;   ram[i] = { `shl_is,         6'd28, `s1 };  // s1<<=28
375
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h9000,0000
376
        i=i+1;   ram[i] =                      16'h0000  ;  //
377
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
378
        i=i+1;   ram[i] =                      16'h9000  ;  // 
379
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
380
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
381
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
382
        // PSU_I -28 (s/b 'h0000,000a)
383
        i=i+1;   ram[i] = { `psu_i,         -6'd28, `s1 };  // s1>>=28
384
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h0000,000a
385
        i=i+1;   ram[i] =                      16'h000a  ;  //
386
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
387
        i=i+1;   ram[i] =                      16'h0000  ;  // 
388
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
389
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
390
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
391
        // PSU_I +28 (s/b 'h1000,0000)
392
        i=i+1;   ram[i] = { `psu_i,          6'd28, `s1 };  // s1=1<<28
393
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h1000,0000
394
        i=i+1;   ram[i] =                      16'h0000  ;  //
395
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
396
        i=i+1;   ram[i] =                      16'h1000  ;  // 
397
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
398
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
399
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
400
        // SHL_S -4 (s/b 'hfa53,c36c)
401
        i=i+1;   ram[i] = { `dat_is,         -6'd4, `s2 };  // s2=-4
402
        i=i+1;   ram[i] = { `shl_s,            `P2, `s1 };  // s1<<=s2, pop s2
403
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='hfa53,c36c
404
        i=i+1;   ram[i] =                      16'hc36c  ;  //
405
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
406
        i=i+1;   ram[i] =                      16'hfa53  ;  // 
407
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
408
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
409
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
410
        // SHL_S +4 (s/b 'h53c3,6c90)
411
        i=i+1;   ram[i] = { `dat_is,          6'd4, `s2 };  // s2=4
412
        i=i+1;   ram[i] = { `shl_s,            `P2, `s1 };  // s1<<=s2, pop s2
413
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h53c3,6c90
414
        i=i+1;   ram[i] =                      16'h6c90  ;  //
415
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
416
        i=i+1;   ram[i] =                      16'h53c3  ;  // 
417
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
418
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
419
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
420
        // SHL_U -4 (s/b 'h0a53,c36c)
421
        i=i+1;   ram[i] = { `dat_is,         -6'd4, `s2 };  // s2=-4
422
        i=i+1;   ram[i] = { `shl_u,            `P2, `s1 };  // s1<<=s2, pop s2
423
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h0a53,c36c
424
        i=i+1;   ram[i] =                      16'hc36c  ;  //
425
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
426
        i=i+1;   ram[i] =                      16'h0a53  ;  // 
427
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
428
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
429
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
430
        // SHL_U +4 (s/b 'h53c3,6c90)
431
        i=i+1;   ram[i] = { `dat_is,          6'd4, `s2 };  // s2=4
432
        i=i+1;   ram[i] = { `shl_u,            `P2, `s1 };  // s1<<=s2, pop s2
433
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h53c3,6c90
434
        i=i+1;   ram[i] =                      16'h6c90  ;  //
435
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
436
        i=i+1;   ram[i] =                      16'h53c3  ;  // 
437
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
438
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
439
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
440
        // POW -4 (s/b 'h1000,0000)
441
        i=i+1;   ram[i] = { `dat_is,         -6'd4, `s2 };  // s2=-4
442
        i=i+1;   ram[i] = { `pow,              `P2, `s1 };  // s1=1<<s2, pop s2
443
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h0000,0000
444
        i=i+1;   ram[i] =                      16'h0000  ;  //
445
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
446
        i=i+1;   ram[i] =                      16'h1000  ;  // 
447
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
448
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
449
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
450
        // POW +4 (s/b 'h0000,0010)
451
        i=i+1;   ram[i] = { `dat_is,          6'd4, `s2 };  // s2=4
452
        i=i+1;   ram[i] = { `pow,              `P2, `s1 };  // s1=1<<s2, pop s2
453
        i=i+1;   ram[i] = { `lit_u,            `__, `s0 };  // s0='h0000,0010
454
        i=i+1;   ram[i] =                      16'h0010  ;  //
455
        i=i+1;   ram[i] = { `lit_h,            `__, `P0 };  //
456
        i=i+1;   ram[i] =                      16'h0000  ;  // 
457
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `P1, `P0 };  // (s0==s1) ? skip, pop both
458
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
459
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
460
        // check for no opcode errors
461
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
462
        i=i+1;   ram[i] =                      16'h0900  ;  //
463
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
464
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
465
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
466
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
467
        // check for no stack errors
468
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
469
        i=i+1;   ram[i] =                      16'h0910  ;  //
470
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
471
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
472
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
473
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
474
        // copy result to s0
475
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
476
        // loop forever
477
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
478
 
479
 
480
 
481
 
482
        /////////////////
483
        // subroutines //
484
        /////////////////
485
 
486
 
487
        // sub : read & clear opcode errors for this thread => s4, return to (s7)
488
        // avoid the use of s1!
489
        i='h900; ram[i] = { `dat_is,      `THRD_ID, `s6 };  // s6=reg addr
490
        i=i+1;   ram[i] = { `reg_rs,           `P6, `s5 };  // s5=(s6), pop s6
491
        i=i+1;   ram[i] = { `pow,              `P5, `s4 };  // s4=1<<s5, pop s5
492
        i=i+1;   ram[i] = { `dat_is,        `OP_ER, `s6 };  // s6=reg addr
493
        i=i+1;   ram[i] = { `reg_rs,           `s6, `s5 };  // s5=(s6)
494
        i=i+1;   ram[i] = { `and,              `P5, `P4 };  // s4&=s5, pop s5
495
        i=i+1;   ram[i] = { `reg_w,            `P6, `s4 };  // (s6)=s4, pop s6
496
        i=i+1;   ram[i] = { `gto,              `P7, `__ };  // return to (s7), pop s7
497
 
498
 
499
        // sub : read & clear stack errors for this thread => s4, return to (s7)
500
        // avoid the use of s1!
501
        i='h910; ram[i] = { `dat_is,      `THRD_ID, `s6 };  // s6=reg addr
502
        i=i+1;   ram[i] = { `reg_rs,           `P6, `s5 };  // s5=(s6), pop s6
503
        i=i+1;   ram[i] = { `pow,              `P5, `s4 };  // s4=1<<s5, pop s5
504
        i=i+1;   ram[i] = { `cpy,              `s4, `s5 };  // s5=s4
505
        i=i+1;   ram[i] = { `shl_is,          6'd8, `P5 };  // s5<<=8
506
        i=i+1;   ram[i] = { `orr,              `P5, `P4 };  // s4|=s5, pop s5
507
        i=i+1;   ram[i] = { `dat_is,       `STK_ER, `s6 };  // s6=reg addr
508
        i=i+1;   ram[i] = { `reg_rs,           `s6, `s5 };  // s5=(s6)
509
        i=i+1;   ram[i] = { `and,              `P5, `P4 };  // s4&=s5, pop s5
510
        i=i+1;   ram[i] = { `reg_w,            `P6, `s4 };  // (s6)=s4, pop s6
511
        i=i+1;   ram[i] = { `gto,              `P7, `__ };  // return to (s7), pop s7
512
 
513
 
514
        end

powered by: WebSVN 2.1.0

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