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

Subversion Repositories hive

[/] [hive/] [trunk/] [v04.05/] [boot_code/] [boot_code_v_branches.h] - Blame information for rev 11

Go to most recent revision | 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 all jmp_i (A?B) instructions
57
        // Thread 1 : test all jmp_i (A?0) instructions
58
        // Thread 2 : test all jmp instructions
59
        // Thread 3 : test all gto instructions
60
        // Other threads : do nothing, loop forever
61
 
62
        ///////////////
63
        // clr space //
64
        ///////////////
65
 
66
        i='h0;   ram[i] = { `lit_u,            `__, `s1 };  // s1=addr
67
        i=i+1;   ram[i] =                      16'h0200  ;  // 
68
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // goto, pop s1 (addr)
69
        //
70
        i='h4;   ram[i] = { `lit_u,            `__, `s1 };  // s1=addr
71
        i=i+1;   ram[i] =                      16'h0400  ;  // 
72
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // goto, pop s1 (addr)
73
        //
74
        i='h8;   ram[i] = { `lit_u,            `__, `s1 };  // s1=addr
75
        i=i+1;   ram[i] =                      16'h0500  ;  // 
76
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // goto, pop s1 (addr)
77
        //
78
        i='hc;   ram[i] = { `lit_u,            `__, `s1 };  // s1=addr
79
        i=i+1;   ram[i] =                      16'h0600  ;  // 
80
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // goto, pop s1 (addr)
81
        //
82
        i='h10;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
83
        i='h14;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
84
        i='h18;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
85
        i='h1c;  ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
86
 
87
 
88
        ////////////////
89
        // intr space //
90
        ////////////////
91
 
92
 
93
        ///////////////////////
94
        // code & data space //
95
        ///////////////////////
96
 
97
 
98
        /////////////////
99
        // subroutines //
100
        /////////////////
101
 
102
 
103
        // test all jmp_i (A?B) instructions, result in s0.
104
        // Correct functioning is s0 = 'd58 ('h3A).
105
        //
106
        // s0 :  0 & final test result
107
        // s1 : +1
108
        // s2 : -2
109
        // s3 : running test result
110
        //
111
        // setup test values and running test result:
112
        i='h200; ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
113
        i=i+1;   ram[i] = { `dat_is,          6'd1, `s1 };  // s1=1
114
        i=i+1;   ram[i] = { `dat_is,         -6'd2, `s2 };  // s2=-2
115
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
116
        //
117
        // distance testing
118
        //
119
        i=i+1;   ram[i] = { `jmp_ie,     4'd7, `s0, `s0 };  // jump forward
120
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // (+0,-9) s3--
121
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+1,-8) s3++ (backward jump lands here)
122
        i=i+1;   ram[i] = { `jmp_ie,     4'd6, `s0, `s0 };  // (+2,-7) jump forward (and out)
123
        // 3 don't cares here
124
        i=i+4;   ram[i] = { `add_is,         -6'd1, `P3 };  // (+6,-3) s3--
125
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+7,-2) s3++ (forward jump lands here)
126
        i=i+1;   ram[i] = { `jmp_ie,    -4'd8, `s0, `s0 };  // (+8,-1) jump back
127
        //
128
        // (A?B) testing
129
        //
130
        // ie
131
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s0, `s0 };  // (s0==s0) ? jump (YNN)
132
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
133
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
134
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s0, `s1 };  // (s1==s0) ? jump
135
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
136
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s0, `s2 };  // (s2==s0) ? jump
137
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
138
        //
139
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s1, `s0 };  // (s0==s1) ? jump (NYN)
140
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
141
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s1, `s1 };  // (s1==s1) ? jump
142
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
143
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
144
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s1, `s2 };  // (s2==s1) ? jump
145
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
146
        //
147
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s2, `s0 };  // (s0==s2) ? jump (NNY)
148
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
149
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s2, `s1 };  // (s1==s2) ? jump
150
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
151
        i=i+1;   ram[i] = { `jmp_ie,     4'd1, `s2, `s2 };  // (s2==s2) ? jump
152
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
153
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
154
        // ine
155
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s0, `s0 };  // (s0!=s0) ? jump (NYY)
156
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
157
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s0, `s1 };  // (s1!=s0) ? jump
158
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
159
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
160
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s0, `s2 };  // (s2!=s0) ? jump
161
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
162
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
163
        //
164
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s1, `s0 };  // (s0!=s1) ? jump (YNY)
165
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
166
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
167
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s1, `s1 };  // (s1!=s1) ? jump
168
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
169
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s1, `s2 };  // (s2!=s1) ? jump
170
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
171
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
172
        //
173
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s2, `s0 };  // (s0!=s2) ? jump (YYN)
174
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
175
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
176
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s2, `s1 };  // (s1!=s2) ? jump
177
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
178
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
179
        i=i+1;   ram[i] = { `jmp_ine,    4'd1, `s2, `s2 };  // (s2!=s2) ? jump
180
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
181
        // ilu
182
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s0, `s0 };  // (s0<s0) ? jump (NNN)
183
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
184
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s0, `s1 };  // (s1<s0) ? jump
185
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
186
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s0, `s2 };  // (s2<s0) ? jump
187
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
188
        //
189
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s1, `s0 };  // (s0<s1) ? jump (YNN)
190
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
191
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
192
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s1, `s1 };  // (s1<s1) ? jump
193
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
194
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s1, `s2 };  // (s2<s1) ? jump
195
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
196
        //
197
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s2, `s0 };  // (s0<s2) ? jump (YYN)
198
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
199
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
200
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s2, `s1 };  // (s1<s2) ? jump
201
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
202
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
203
        i=i+1;   ram[i] = { `jmp_ilu,    4'd1, `s2, `s2 };  // (s2<s2) ? jump
204
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
205
        // inlu
206
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s0, `s0 };  // (s0>=s0) ? jump (YYY)
207
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
208
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
209
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s0, `s1 };  // (s1>=s0) ? jump
210
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
211
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
212
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s0, `s2 };  // (s2>=s0) ? jump
213
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
214
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
215
        //
216
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s1, `s0 };  // (s0>=s1) ? jump (NYY)
217
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
218
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s1, `s1 };  // (s1>=s1) ? jump
219
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
220
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
221
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s1, `s2 };  // (s2>=s1) ? jump
222
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
223
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
224
        //
225
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s2, `s0 };  // (s0>=s2) ? jump (NNY)
226
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
227
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s2, `s1 };  // (s1>=s2) ? jump
228
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
229
        i=i+1;   ram[i] = { `jmp_inlu,   4'd1, `s2, `s2 };  // (s2>=s2) ? jump
230
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
231
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
232
        // ils
233
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s0, `s0 };  // (s0<s0) ? jump (NNY)
234
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
235
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s0, `s1 };  // (s1<s0) ? jump
236
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
237
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s0, `s2 };  // (s2<s0) ? jump
238
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
239
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
240
        //
241
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s1, `s0 };  // (s0<s1) ? jump (YNY)
242
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
243
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
244
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s1, `s1 };  // (s1<s1) ? jump
245
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
246
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s1, `s2 };  // (s2<s1) ? jump
247
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
248
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
249
        //
250
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s2, `s0 };  // (s0<s2) ? jump (NNN)
251
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
252
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s2, `s1 };  // (s1<s2) ? jump
253
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
254
        i=i+1;   ram[i] = { `jmp_ils,    4'd1, `s2, `s2 };  // (s2<s2) ? jump
255
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
256
        // inls
257
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s0, `s0 };  // (s0>=s0) ? jump (YYN)
258
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
259
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
260
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s0, `s1 };  // (s1>=s0) ? jump
261
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
262
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
263
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s0, `s2 };  // (s2>=s0) ? jump
264
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
265
        //
266
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s1, `s0 };  // (s0>=s1) ? jump (NYN)
267
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
268
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s1, `s1 };  // (s1>=s1) ? jump
269
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
270
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
271
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s1, `s2 };  // (s2>=s1) ? jump
272
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
273
        //
274
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s2, `s0 };  // (s0>=s2) ? jump (YYY)
275
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
276
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
277
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s2, `s1 };  // (s1>=s2) ? jump
278
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
279
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
280
        i=i+1;   ram[i] = { `jmp_inls,   4'd1, `s2, `s2 };  // (s2>=s2) ? jump
281
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
282
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
283
        // cleanup
284
        i=i+1;   ram[i] = { `pop,           8'b00000111 };  // pop s0, s1, s2
285
        // check for no opcode errors
286
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
287
        i=i+1;   ram[i] =                      16'h0900  ;  //
288
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
289
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
290
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
291
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
292
        // check for no stack errors
293
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
294
        i=i+1;   ram[i] =                      16'h0910  ;  //
295
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
296
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
297
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
298
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
299
        // copy result to s0
300
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
301
        // loop forever
302
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
303
 
304
 
305
 
306
        // test all jmp_i (A?0) instructions, result in s0.
307
        // Correct functioning is s0 = 'd16 ('h10).
308
        //
309
        // s0 :  0 & final test result
310
        // s1 : +1
311
        // s2 : -2
312
        // s3 : running test result
313
        //
314
        // setup test values and running test result:
315
        i='h400; ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
316
        i=i+1;   ram[i] = { `dat_is,          6'd1, `s1 };  // s1=1
317
        i=i+1;   ram[i] = { `dat_is,         -6'd2, `s2 };  // s2=-2
318
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
319
        //
320
        // distance testing
321
        //
322
        i=i+1;   ram[i] = { `jmp_iz,         6'd31, `s0 };  // jump forward
323
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // (+0,-33) s3--
324
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+1,-32) s3++ (backward jump lands here)
325
        i=i+1;   ram[i] = { `jmp_iz,         6'd30, `s0 };  // (+2,-31) jump forward (and out)
326
        // 27 don't cares here
327
        i=i+28;  ram[i] = { `add_is,         -6'd1, `P3 };  // (+30,-3) s3--
328
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+31,-2) s3++ (forward jump lands here)
329
        i=i+1;   ram[i] = { `jmp_iz,        -6'd32, `s0 };  // jump back
330
        //
331
        // (A?0) testing
332
        //
333
        // z
334
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `s0 };  // (s0==0) ? jump (YNN)
335
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
336
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
337
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `s1 };  // (s1==0) ? jump
338
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
339
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `s2 };  // (s2==0) ? jump
340
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
341
        // nz
342
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `s0 };  // (s0!=0) ? jump (NYY)
343
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
344
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `s1 };  // (s1!=0) ? jump
345
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
346
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
347
        i=i+1;   ram[i] = { `jmp_inz,         6'd1, `s2 };  // (s2!=0) ? jump
348
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
349
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
350
        // lz
351
        i=i+1;   ram[i] = { `jmp_ilz,         6'd1, `s0 };  // (s0<0) ? jump (NNY)
352
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
353
        i=i+1;   ram[i] = { `jmp_ilz,         6'd1, `s1 };  // (s1<0) ? jump
354
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
355
        i=i+1;   ram[i] = { `jmp_ilz,         6'd1, `s2 };  // (s2<0) ? jump
356
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
357
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
358
        // nlz
359
        i=i+1;   ram[i] = { `jmp_inlz,        6'd1, `s0 };  // (s0>=0) ? jump (YYN)
360
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
361
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
362
        i=i+1;   ram[i] = { `jmp_inlz,        6'd1, `s1 };  // (s1>=0) ? jump
363
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
364
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
365
        i=i+1;   ram[i] = { `jmp_inlz,        6'd1, `s2 };  // (s2>=0) ? jump
366
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
367
        // cleanup
368
        i=i+1;   ram[i] = { `pop,           8'b00000111 };  // pop s0, s1, s2
369
        // check for no opcode errors
370
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
371
        i=i+1;   ram[i] =                      16'h0900  ;  //
372
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
373
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
374
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
375
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
376
        // check for no stack errors
377
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
378
        i=i+1;   ram[i] =                      16'h0910  ;  //
379
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
380
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
381
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
382
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
383
        // copy result to s0
384
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
385
        // loop forever
386
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
387
 
388
 
389
        // test all jmp instructions, result in s0.
390
        // Correct functioning is s0 = 'd19 ('h13).
391
        //
392
        // s0 :  0 & final test result
393
        // s1 : +1
394
        // s2 : -2
395
        // s3 : running test result
396
        //
397
        // setup test values and running test result:
398
        i='h500; ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
399
        i=i+1;   ram[i] = { `dat_is,          6'd1, `s1 };  // s1=1
400
        i=i+1;   ram[i] = { `dat_is,         -6'd2, `s2 };  // s2=-2
401
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
402
        //
403
        // distance testing
404
        //
405
        i=i+1;   ram[i] = { `dat_is,         6'd30, `s0 };  // s0=30
406
        i=i+1;   ram[i] = { `dat_is,        -6'd32, `s0 };  // s0=-32
407
        i=i+1;   ram[i] = { `dat_is,         6'd31, `s0 };  // s0=31
408
        i=i+1;   ram[i] = { `jmp,              `P0, `__ };  // jump forward 31, pop s0
409
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // (+0,-33) s3--
410
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+1,-32) s3++ (backward jump lands here)
411
        i=i+1;   ram[i] = { `jmp,              `P0, `s0 };  // (+2,-31) jump forward 30 (and out)
412
        // 27 don't cares here
413
        i=i+28;  ram[i] = { `add_is,         -6'd1, `P3 };  // (+30,-3) s3--
414
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // (+31,-2) s3++ (forward jump lands here)
415
        i=i+1;   ram[i] = { `jmp,              `P0, `__ };  // jump back -32, pop s1
416
        //
417
        // unconditional testing
418
        //
419
        i=i+1;   ram[i] = { `jmp,              `s1, `s0 };  // jump (s0?0)
420
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
421
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
422
        i=i+1;   ram[i] = { `jmp,              `s1, `s1 };  // jump (s1?0)
423
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
424
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
425
        i=i+1;   ram[i] = { `jmp,              `s1, `s2 };  // jump (s2?0)
426
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
427
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
428
        //
429
        // (A?0) testing
430
        // z
431
        i=i+1;   ram[i] = { `jmp_z,            `s1, `s0 };  // (s0==0) ? jump (YNN)
432
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
433
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
434
        i=i+1;   ram[i] = { `jmp_z,            `s1, `s1 };  // (s1==0) ? jump
435
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
436
        i=i+1;   ram[i] = { `jmp_z,            `s1, `s2 };  // (s2==0) ? jump
437
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
438
        // nz
439
        i=i+1;   ram[i] = { `jmp_nz,           `s1, `s0 };  // (s0!=0) ? jump (NYY)
440
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
441
        i=i+1;   ram[i] = { `jmp_nz,           `s1, `s1 };  // (s1!=0) ? jump
442
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
443
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
444
        i=i+1;   ram[i] = { `jmp_nz,           `s1, `s2 };  // (s2!=0) ? jump
445
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
446
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
447
        // lz
448
        i=i+1;   ram[i] = { `jmp_lz,           `s1, `s0 };  // (s0<0) ? jump (NNY)
449
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
450
        i=i+1;   ram[i] = { `jmp_lz,           `s1, `s1 };  // (s1<0) ? jump
451
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
452
        i=i+1;   ram[i] = { `jmp_lz,           `s1, `s2 };  // (s2<0) ? jump
453
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
454
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
455
        // nlz
456
        i=i+1;   ram[i] = { `jmp_nlz,          `s1, `s0 };  // (s0>=0) ? jump (YYN)
457
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
458
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
459
        i=i+1;   ram[i] = { `jmp_nlz,          `s1, `s1 };  // (s1>=0) ? jump
460
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
461
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
462
        i=i+1;   ram[i] = { `jmp_nlz,          `s1, `s2 };  // (s2>=0) ? jump
463
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++ (N)
464
        // cleanup
465
        i=i+1;   ram[i] = { `pop,           8'b00000111 };  // pop s0, s1, s2
466
        // check for no opcode errors
467
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
468
        i=i+1;   ram[i] =                      16'h0900  ;  //
469
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
470
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
471
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
472
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
473
        // check for no stack errors
474
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
475
        i=i+1;   ram[i] =                      16'h0910  ;  //
476
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
477
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
478
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
479
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
480
        // copy result to s0
481
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
482
        // loop forever
483
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
484
 
485
 
486
        // test all gto instructions, result in s0.
487
        // Correct functioning is s0 = 'd7 ('h7).
488
        //
489
        // s0 :  0 & final test result
490
        // s1 : PC
491
        // s2 : -2
492
        // s3 : running test result
493
        //
494
        // setup test values and running test result:
495
        i='h600; ram[i] = { `dat_is,          6'd0, `s0 };  // s0=0
496
        i=i+1;   ram[i] = { `dat_is,         -6'd2, `s2 };  // s2=-2
497
        i=i+1;   ram[i] = { `dat_is,          6'd0, `s3 };  // s3=0
498
        //
499
        // distance testing
500
        //
501
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // s1=pc
502
        i=i+1;   ram[i] = { `add_is,          6'd6, `P1 };  // s1+=6
503
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // go forward, pop s1
504
        //
505
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
506
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // s1=pc
507
        i=i+1;   ram[i] = { `add_is,          6'd6, `P1 };  // s1+=6
508
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // go forward, pop s1
509
        //
510
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
511
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // pc => s1
512
        i=i+1;   ram[i] = { `add_is,         -6'd6, `P1 };  // s1-=6
513
        i=i+1;   ram[i] = { `gto,              `P1, `__ };  // go back, pop s1
514
        //
515
        // unconditional testing
516
        //
517
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // s1=pc
518
        i=i+1;   ram[i] = { `add_is,          6'd3, `P1 };  // s1+=3
519
        i=i+1;   ram[i] = { `gto,              `P1, `s0 };  // go, pop s1 (YYY)
520
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
521
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
522
        //
523
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // s1=pc
524
        i=i+1;   ram[i] = { `add_is,          6'd3, `P1 };  // s1+=3
525
        i=i+1;   ram[i] = { `gto,              `P1, `s1 };  // go, pop s1
526
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
527
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
528
        //
529
        i=i+1;   ram[i] = { `pgc,              `__, `s1 };  // s1=pc
530
        i=i+1;   ram[i] = { `add_is,          6'd3, `P1 };  // s1+=3
531
        i=i+1;   ram[i] = { `gto,              `P1, `s2 };  // go, pop s1
532
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3-- (Y)
533
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
534
        // cleanup
535
        i=i+1;   ram[i] = { `pop,           8'b00000101 };  // pop s0, s2
536
        // check for no opcode errors
537
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0900
538
        i=i+1;   ram[i] =                      16'h0900  ;  //
539
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
540
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
541
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
542
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
543
        // check for no stack errors
544
        i=i+1;   ram[i] = { `lit_u,            `__, `s7 };  // s7='h0910
545
        i=i+1;   ram[i] =                      16'h0910  ;  //
546
        i=i+1;   ram[i] = { `gsb,              `P7, `s7 };  // gsb, pop s7 (addr)
547
        i=i+1;   ram[i] = { `jmp_iz,          6'd1, `P4 };  // (s4==0) ? skip, pop s4
548
        i=i+1;   ram[i] = { `add_is,         -6'd1, `P3 };  // s3--
549
        i=i+1;   ram[i] = { `add_is,          6'd1, `P3 };  // s3++
550
        // copy result to s0
551
        i=i+1;   ram[i] = { `cpy,              `P3, `s0 };  // s0=s3, pop s3
552
        // loop forever
553
        i=i+1;   ram[i] = { `jmp_ie,    -4'd1, `s0, `s0 };  // loop forever
554
 
555
 
556
 
557
        // sub : read & clear opcode errors for this thread => s4, return to (s7)
558
        // avoid the use of s1!
559
        i='h900; ram[i] = { `dat_is,      `THRD_ID, `s6 };  // s6=reg addr
560
        i=i+1;   ram[i] = { `reg_rs,           `P6, `s5 };  // s5=(s6), pop s6
561
        i=i+1;   ram[i] = { `pow,              `P5, `s4 };  // s4=1<<s5, pop s5
562
        i=i+1;   ram[i] = { `dat_is,        `OP_ER, `s6 };  // s6=reg addr
563
        i=i+1;   ram[i] = { `reg_rs,           `s6, `s5 };  // s5=(s6)
564
        i=i+1;   ram[i] = { `and,              `P5, `P4 };  // s4&=s5, pop s5
565
        i=i+1;   ram[i] = { `reg_w,            `P6, `s4 };  // (s6)=s4, pop s6
566
        i=i+1;   ram[i] = { `gto,              `P7, `__ };  // return to (s7), pop s7
567
 
568
 
569
        // sub : read & clear stack errors for this thread => s4, return to (s7)
570
        // avoid the use of s1!
571
        i='h910; ram[i] = { `dat_is,      `THRD_ID, `s6 };  // s6=reg addr
572
        i=i+1;   ram[i] = { `reg_rs,           `P6, `s5 };  // s5=(s6), pop s6
573
        i=i+1;   ram[i] = { `pow,              `P5, `s4 };  // s4=1<<s5, pop s5
574
        i=i+1;   ram[i] = { `cpy,              `s4, `s5 };  // s5=s4
575
        i=i+1;   ram[i] = { `shl_is,          6'd8, `P5 };  // s5<<=8
576
        i=i+1;   ram[i] = { `orr,              `P5, `P4 };  // s4|=s5, pop s5
577
        i=i+1;   ram[i] = { `dat_is,       `STK_ER, `s6 };  // s6=reg addr
578
        i=i+1;   ram[i] = { `reg_rs,           `s6, `s5 };  // s5=(s6)
579
        i=i+1;   ram[i] = { `and,              `P5, `P4 };  // s4&=s5, pop s5
580
        i=i+1;   ram[i] = { `reg_w,            `P6, `s4 };  // (s6)=s4, pop s6
581
        i=i+1;   ram[i] = { `gto,              `P7, `__ };  // return to (s7), pop s7
582
 
583
 
584
        end

powered by: WebSVN 2.1.0

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