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

Subversion Repositories hive

[/] [hive/] [trunk/] [v01.09/] [core.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ericw
/*
2
--------------------------------------------------------------------------------
3
 
4
Module : core.v
5
 
6
--------------------------------------------------------------------------------
7
 
8
Function:
9
- Processor core with 8 stage pipeline, 8 threads, and 4 stacks per thread.
10
 
11
Instantiates:
12
- control_ring.v
13
- data_ring.v
14
- reg_set.v
15
- reg_set_shim.v
16
- dp_ram_infer.v
17
 
18
 
19
--------------------
20
- Revision History -
21
--------------------
22
 
23
v01.09 - 2013-06-24
24
- First public release.
25
- Shuffled opcode encoding again:
26
  - Unused never jmp_i fits read/write perfectly.
27
  - Unused always jmp_i zero comparison allows for 1 bit immediate field
28
    expansion of jmp_i(gle).
29
- Removed all skip instructions (redundant w/ jmp_i).
30
- All the above allows add_i immediate field expansion to 6 bits.
31
- Opcode encoding is now more straightforward with fewer immediate field sizes.
32
- Worked on pc_ring.v and pointer_ring.v, now use simple loops rather than
33
  generate, the logic produced better tracks the module paramters.
34
- Removed "skp" control bit from pc_ring.v, op_decode.v, control_ring.v.
35
- Removed intr_ack_o from core I/O.
36
- Renamed "register_set*" => "reg_set*".
37
- (Considering adding a leading zero count opcode, it doesn't take many LEs.)
38
- Seeing a write to thread 7 stack 0 memory at startup, don't think it
39
  means anything due to clearing.
40
- Passes boot code verification for:
41
  - Interrupts.
42
  - Stack ops, depth, error reporting (all threads).
43
  - All branch / conditional ops.
44
  - All logical / arithmetic / shift ops.
45
 
46
v01.08 - 2013-06-14
47
- Added parameter options for stack pointer error protections & brought them
48
  to the top level.
49
- The unsigned restoring division subroutine works!
50
 
51
v01.07 - 2013-06-11
52
- Changed opcodes to make swapping of (A?B) operands cover all logical needs:
53
  - op_skp_ul => op_skp_l
54
  - op_skp_ge => op_skp_uge
55
  - op_jmp_iul => op_jmp_il
56
  - op_jmp_ige => op_jmp_iuge
57
- Changed verification boot code tests to reflect above (passes).
58
 
59
v01.06 - 2013-06-10
60
- Fixed latency of test fields in op_decode.v (were only registered 1x, s/b 2x).
61
- Fixed subtle immediate address offset sign issue in pc_ring.v.
62
- Fixed subtle immediate data sign issue in stacks_mux.v.
63
- Minor style edits to align port names @ vector_sr.v instances.
64
- The log2 subroutine works!
65
 
66
v01.05 - 2013-06-07
67
- Put the skip instructions back (for convenience & clarity).
68
- Changes to op_decode.v, separate immediate data and address decodes,
69
  misc. edits to improve speed.
70
- Renamed "op_codes.h" => "op_encode.h".
71
- Lots of minor edits at the higher levels.
72
- Added "copyright.txt" to directory.
73
 
74
v01.04 - 2013-06-06
75
- Added op_jmp_i (A?B) instructions.
76
- Removed all skip instructions (redundant).
77
 
78
v01.03 - 2013-06-04
79
- Changed op_jmp_i to be conditional (A?0).
80
- Renamed "addr_regs.h" => "register_set_addr.h".
81
- New boot code does log2.
82
 
83
v01.02 (cont) - 2013-05-23
84
- Old boot code file renamed: "boot_code.h" => "boot_code_00.h".
85
- New boot code file tests all op_codes and gives final report.
86
 
87
v01.02 - 2013-05-22
88
- Memory writes now work, the fix was to swap pc/op_code ROM side A with
89
   data RW side B of main memory "dp_ram_infer.v".  It seems side A is
90
   incorrectly used as the master mode for both ports.
91
- Renamed "alu_input_mux.v" => "stacks_mux.v".
92
- Removed enable from "register_set.v" and "register_set_shim.v".
93
- Monkeyed with "register_set_shim.v" a bit.
94
- Removed async resets from "dp_ram_infer.v" and "dq_ram_infer.v".
95
- Passes boot code tests 0, 1, 2, 3, 4.
96
 
97
v01.01 - 2013-05-22
98
- Added clear and interrupt BASE and SPAN parameters.
99
- Because BASE is a simple MSB concatenation, for it to be effective
100
   make BASE >= 2^(THRD_W+SPAN).  BASE LSBs below this point are ignored.
101
- Individual clear and interrupt address interspacing = 2^SPAN.
102
- Example:
103
   CLR_BASE ='h0 positions thread 0 clear @ 0.
104
   CLR_SPAN =2 positions thread 1 clear @ 4, thread 2 @ 8, etc.
105
   INTR_BASE='h20 positions thread 0 interrupt @ 'd32.
106
   INTR_SPAN=2 positions thread 1 interrupt @ 'd36, thread 2 @ 'd40, etc.
107
- Moved most core top port parameters to localparam.
108
- Modified boot code tests accordingly.
109
- Passes boot code tests 0, 1, 2.
110
- Memory writes still don't work!
111
 
112
v01.00 - 2013-05-21 - born
113
- EP3C5E144C8: ~180MHz, ~1785 LEs (34% of logic).
114
- Fixed immediate value bug (was only registered 1x in op_decode.v, s/b 2x).
115
- Passes boot code tests 0, 1, 2.
116
- Memory writes don't work!
117
 
118
--------------------------------------------------------------------------------
119
*/
120
 
121
module core
122
        #(
123
        parameter       integer                                                 DATA_W                  = 32,           // data width
124
        parameter       integer                                                 THREADS                 = 8,            // threads
125
        parameter       [DATA_W/4-1:0]                                   VER_MAJ                 = 'h01, // core version
126
        parameter       [DATA_W/4-1:0]                                   VER_MIN                 = 'h09  // core version
127
        )
128
        (
129
        // clocks & resets
130
        input                   wire                                                            clk_i,                                          // clock
131
        input                   wire                                                            rst_i,                                          // async. reset, active high
132
        //
133
        input                   wire    [THREADS-1:0]                    intr_req_i,                                     // event request, active high
134
        //
135
        input                   wire    [DATA_W-1:0]                     io_i,                                                   // gpio
136
        output          wire    [DATA_W-1:0]                     io_o
137
        );
138
 
139
 
140
        /*
141
        ----------------------
142
        -- internal signals --
143
        ----------------------
144
        */
145
        `include "functions.h"  // for clog2()
146
        //
147
        localparam      integer                                                 ADDR_W                  = 16;           // address width
148
        localparam      integer                                                 PNTR_W                  = 5;            // stack pointer width
149
        localparam      integer                                                 MEM_ADDR_W              = 13;           // main memory width
150
        localparam      [ADDR_W-1:0]                                     CLR_BASE                        = 'h0;  // clear address base (concat)
151
        localparam      integer                                                 CLR_SPAN                        = 2;            // clear address span (2^n)
152
        localparam      [ADDR_W-1:0]                                     INTR_BASE               = 'h20; // interrupt address base (concat)
153
        localparam      integer                                                 INTR_SPAN               = 2;            // interrupt address span (2^n)
154
        localparam      integer                                                 THRD_W                  = clog2( THREADS );
155
        localparam      integer                                                 STACKS                  = 4;            // number of stacks
156
        localparam      integer                                                 STK_W                           = clog2( STACKS );
157
        localparam      integer                                                 IM_DATA_W               = 8;            // immediate data width
158
        localparam      integer                                                 IM_ADDR_W               = 6;            // immediate address width
159
        localparam      integer                                                 LG_W                            = 2;
160
        localparam      integer                                                 OP_CODE_W               = DATA_W/2;
161
        localparam      integer                                                 REG_ADDR_W              = 4;
162
        localparam      integer                                                 IM_RW_W                 = 4;
163
        localparam      integer                                                 POP_PROT                        = 1;            // 1=error protection, 0=none
164
        localparam      integer                                                 PUSH_PROT               = 1;            // 1=error protection, 0=none
165
        //
166
        wire                                    [THREADS-1:0]                    clr_req;
167
        wire                                    [THREADS-1:0]                    intr_en;
168
        wire                                    [OP_CODE_W-1:0]          op_code;
169
        wire                                                                                            op_code_er;
170
        wire                                    [STK_W-1:0]                              a_sel, b_sel;
171
        wire                                                                                            imda, sgn, ext;
172
        wire                                    [LG_W-1:0]                               lg;
173
        wire                                                                                            add, sub, mul, shl, cpy, dm, rtn, rd, wr;
174
        wire                                                                                            stk_clr;
175
        wire                                    [STACKS-1:0]                     pop, push, pop_er, push_er;
176
        wire                                    [DATA_W-1:0]                     a, b;
177
        wire                                    [IM_DATA_W-1:0]          im_data;
178
        wire                                    [IM_ADDR_W-1:0]          im_addr;
179
        wire                                                                                            nez, ne, ltz, lt;
180
        wire                                    [THRD_W-1:0]                     thrd_0, thrd_2, thrd_3, thrd_6;
181
        wire                                    [ADDR_W-1:0]                     pc_1, pc_3, pc_4;
182
        wire                                    [DATA_W/2-1:0]                   dm_rd_data;
183
        wire                                    [DATA_W/2-1:0]                   rd_data, wr_data;
184
        wire                                    [ADDR_W-1:0]                     addr;
185
        wire                                                                                            regs_wr, regs_rd, dm_wr;
186
 
187
 
188
        /*
189
        ================
190
        == code start ==
191
        ================
192
        */
193
 
194
 
195
        // the control ring
196
        control_ring
197
        #(
198
        .DATA_W                         ( DATA_W ),
199
        .ADDR_W                         ( ADDR_W ),
200
        .THREADS                                ( THREADS ),
201
        .THRD_W                         ( THRD_W ),
202
        .STACKS                         ( STACKS ),
203
        .STK_W                          ( STK_W ),
204
        .IM_DATA_W                      ( IM_DATA_W ),
205
        .IM_ADDR_W                      ( IM_ADDR_W ),
206
        .OP_CODE_W                      ( OP_CODE_W ),
207
        .LG_W                                   ( LG_W ),
208
        .CLR_BASE                       ( CLR_BASE ),
209
        .CLR_SPAN                       ( CLR_SPAN ),
210
        .INTR_BASE                      ( INTR_BASE ),
211
        .INTR_SPAN                      ( INTR_SPAN )
212
        )
213
        control_ring
214
        (
215
        .clk_i                          ( clk_i ),
216
        .rst_i                          ( rst_i ),
217
        .clr_req_i                      ( clr_req ),
218
        .clr_ack_o                      (  ),  // unused
219
        .intr_en_i                      ( intr_en ),
220
        .intr_req_i                     ( intr_req_i ),
221
        .intr_ack_o                     (  ),  // unused
222
        .op_code_i                      ( op_code ),
223
        .op_code_er_o           ( op_code_er ),
224
        .b_lo_i                         ( b[DATA_W/2-1:0] ),
225
        .im_data_o                      ( im_data ),
226
        .a_sel_o                                ( a_sel ),
227
        .b_sel_o                                ( b_sel ),
228
        .imda_o                         ( imda ),
229
        .sgn_o                          ( sgn ),
230
        .ext_o                          ( ext ),
231
        .lg_o                                   ( lg ),
232
        .add_o                          ( add ),
233
        .sub_o                          ( sub ),
234
        .mul_o                          ( mul ),
235
        .shl_o                          ( shl ),
236
        .cpy_o                          ( cpy ),
237
        .dm_o                                   ( dm ),
238
        .rtn_o                          ( rtn ),
239
        .rd_o                                   ( rd ),
240
        .wr_o                                   ( wr ),
241
        .stk_clr_o                      ( stk_clr ),
242
        .pop_o                          ( pop ),
243
        .push_o                         ( push ),
244
        .nez_i                          ( nez ),
245
        .ne_i                                   ( ne ),
246
        .ltz_i                          ( ltz ),
247
        .lt_i                                   ( lt ),
248
        .thrd_0_o                       ( thrd_0 ),
249
        .thrd_2_o                       ( thrd_2 ),
250
        .thrd_3_o                       ( thrd_3 ),
251
        .thrd_6_o                       ( thrd_6 ),
252
        .im_addr_o                      ( im_addr ),
253
        .pc_1_o                         ( pc_1 ),
254
        .pc_3_o                         ( pc_3 ),
255
        .pc_4_o                         ( pc_4 )
256
        );
257
 
258
 
259
        // the data ring
260
        data_ring
261
        #(
262
        .DATA_W                         ( DATA_W ),
263
        .ADDR_W                         ( ADDR_W ),
264
        .THREADS                                ( THREADS ),
265
        .THRD_W                         ( THRD_W ),
266
        .STACKS                         ( STACKS ),
267
        .STK_W                          ( STK_W ),
268
        .PNTR_W                         ( PNTR_W ),
269
        .IM_DATA_W                      ( IM_DATA_W ),
270
        .LG_W                                   ( LG_W ),
271
        .POP_PROT                       ( POP_PROT ),
272
        .PUSH_PROT                      ( PUSH_PROT )
273
        )
274
        data_ring
275
        (
276
        .clk_i                          ( clk_i ),
277
        .rst_i                          ( rst_i ),
278
        .a_sel_i                                ( a_sel ),
279
        .b_sel_i                                ( b_sel ),
280
        .imda_i                         ( imda ),
281
        .sgn_i                          ( sgn ),
282
        .ext_i                          ( ext ),
283
        .lg_i                                   ( lg ),
284
        .add_i                          ( add ),
285
        .sub_i                          ( sub ),
286
        .mul_i                          ( mul ),
287
        .shl_i                          ( shl ),
288
        .cpy_i                          ( cpy ),
289
        .dm_i                                   ( dm ),
290
        .rtn_i                          ( rtn ),
291
        .stk_clr_i                      ( stk_clr ),
292
        .pop_i                          ( pop ),
293
        .push_i                         ( push ),
294
        .thrd_6_i                       ( thrd_6 ),
295
        .im_data_i                      ( im_data ),
296
        .dm_data_i                      ( rd_data ),
297
        .pc_3_i                         ( pc_3 ),
298
        .a_o                                    ( a ),
299
        .b_o                                    ( b ),
300
        .nez_o                          ( nez ),
301
        .ne_o                                   ( ne ),
302
        .ltz_o                          ( ltz ),
303
        .lt_o                                   ( lt ),
304
        .pop_er_o                       ( pop_er ),
305
        .push_er_o                      ( push_er )
306
        );
307
 
308
 
309
        // shim for memory and register set access
310
        reg_set_shim
311
        #(
312
        .REGS_IN                                ( 1 ),
313
        .REGS_OUT                       ( 1 ),
314
        .DATA_W                         ( DATA_W ),
315
        .ADDR_W                         ( ADDR_W ),
316
        .REG_ADDR_W                     ( REG_ADDR_W ),
317
        .IM_ADDR_W                      ( IM_RW_W )
318
        )
319
        reg_set_shim
320
        (
321
        .clk_i                          ( clk_i ),
322
        .rst_i                          ( rst_i ),
323
        .a_i                                    ( a ),
324
        .ext_i                          ( ext ),
325
        .wr_data_o                      ( wr_data ),
326
        .b_lo_i                         ( b[DATA_W/2-1:0] ),
327
        .im_addr_i                      ( im_addr[IM_RW_W-1:0] ),
328
        .pc_1_i                         ( pc_1 ),
329
        .addr_o                         ( addr ),
330
        .wr_i                                   ( wr ),
331
        .rd_i                                   ( rd ),
332
        .regs_wr_o                      ( regs_wr ),
333
        .regs_rd_o                      ( regs_rd ),
334
        .dm_wr_o                                ( dm_wr )
335
        );
336
 
337
 
338
        // internal register set
339
        reg_set
340
        #(
341
        .REGS_IN                                ( 1 ),
342
        .REGS_OUT                       ( 1 ),
343
        .DATA_W                         ( DATA_W/2 ),
344
        .ADDR_W                         ( REG_ADDR_W ),
345
        .THREADS                                ( THREADS ),
346
        .THRD_W                         ( THRD_W ),
347
        .STACKS                         ( STACKS ),
348
        .STK_W                          ( STK_W ),
349
        .VER_MAJ                                ( VER_MAJ ),
350
        .VER_MIN                                ( VER_MIN )
351
        )
352
        reg_set
353
        (
354
        .clk_i                          ( clk_i ),
355
        .rst_i                          ( rst_i ),
356
        .addr_i                         ( addr[REG_ADDR_W-1:0] ),
357
        .wr_i                                   ( regs_wr ),
358
        .rd_i                                   ( regs_rd ),
359
        .data_i                         ( wr_data ),
360
        .data_o                         ( rd_data ),
361
        .dm_data_i                      ( dm_rd_data ),
362
        .clr_req_o                      ( clr_req ),
363
        .intr_en_o                      ( intr_en ),
364
        .thrd_0_i                       ( thrd_0 ),
365
        .op_code_er_i           ( op_code_er ),
366
        .thrd_2_i                       ( thrd_2 ),
367
        .pop_er_i                       ( pop_er ),
368
        .thrd_3_i                       ( thrd_3 ),
369
        .push_er_i                      ( push_er ),
370
        .io_lo_i                                ( io_i[DATA_W/2-1:0] ),
371
        .io_hi_i                                ( io_i[DATA_W-1:DATA_W/2] ),
372
        .io_lo_o                                ( io_o[DATA_W/2-1:0] ),
373
        .io_hi_o                                ( io_o[DATA_W-1:DATA_W/2] )
374
        );
375
 
376
 
377
        // instruction and data memory
378
        dp_ram_infer
379
        #(
380
        .REG_A_OUT                      ( 1 ),
381
        .REG_B_OUT                      ( 1 ),
382
        .DATA_W                         ( OP_CODE_W ),
383
        .ADDR_W                         ( MEM_ADDR_W ),
384
        .RD_MODE                        ( "WR_DATA" )  // functional don't care
385
        )
386
        main_mem
387
        (
388
        .a_clk_i                                ( clk_i ),
389
        .a_addr_i                       ( addr ),
390
        .a_wr_i                         ( dm_wr ),
391
        .a_data_i                       ( wr_data ),
392
        .a_data_o                       ( dm_rd_data ),
393
        .b_clk_i                                ( clk_i ),
394
        .b_addr_i                       ( pc_4 ),
395
        .b_wr_i                         ( 1'b0 ),  // unused
396
        .b_data_i                       (  ),  // unused
397
        .b_data_o                       ( op_code )
398
        );
399
 
400
 
401
endmodule

powered by: WebSVN 2.1.0

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