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

Subversion Repositories hive

[/] [hive/] [trunk/] [v04.05/] [reg_set.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 ericw
/*
2
--------------------------------------------------------------------------------
3
 
4
Module: reg_set.v
5
 
6
Function:
7
- Internal register set for a processor.
8
 
9
Instantiates:
10
- (8x) reg_base.v
11
- (2x) pipe.v
12
 
13
 
14
Notes:
15
- Processor bus IN/OUT optionally registered.
16
 
17
Decode:
18
- 0x0 : Core version register - ver_reg
19
- 0x1 : Thread ID register - thrd_id_reg
20
- 0x2 : Clear register - clr_reg
21
- 0x3 : Interrupt enable register - intr_en_reg
22
- 0x4 : Opcode error register - op_er_reg
23
- 0x5 : Stack error register - stk_er_reg
24
- 0x6 - 0x7 : UNUSED
25
- 0x8 : I/O low register - io_lo_reg
26
- 0x9 : I/O high register - io_hi_reg
27
- 0xA - 0xB : UNUSED
28
- 0xC : UART RX register - uart_rx_reg
29
- 0xD : UART TX register - uart_tx_reg
30
- 0xE - 0xF : UNUSED
31
 
32
 
33
================================================================================
34
- 0x0 : Core version register - ver_reg
35
--------------------------------------------------------------------------------
36
 
37
  bit  name                 description
38
-----  ----                 -----------
39
  7-0  ver_min[7:0]         minor version info
40
 15-8  ver_maj[7:0]         major version info
41
 
42
Notes:
43
- Read-only.
44
- Nibbles S/B BCD (0-9; no A-F) to be easily human readable,
45
  and to eliminate confusion between decimal and hex here.
46
- Major version changes when op_code binary decode changes (incompatibilty).
47
 
48
================================================================================
49
- 0x1 : Thread ID register - thrd_id_reg
50
--------------------------------------------------------------------------------
51
 
52
  bit  name                 description
53
-----  ----                 -----------
54
  2-0  thrd_id[2:0]         thread ID
55
 15-3  -                    0000000000000
56
 
57
Notes:
58
- Read-only.
59
- Threads can read this to discover their thread ID.
60
 
61
================================================================================
62
- 0x2 : Clear register - clr_reg
63
--------------------------------------------------------------------------------
64
 
65
  bit  name                 description
66
-----  ----                 -----------
67
  7-0  clr[7:0]             0=>1 clear thread; 1=>0 no effect;
68
 15-8  -                    00000000
69
 
70
Notes:
71
- Read / write.
72
- Per thread clearing.
73
- All bits cleared on async reset.
74
 
75
================================================================================
76
- 0x3 : Interrupt enable register - intr_en_reg
77
--------------------------------------------------------------------------------
78
 
79
  bit  name                 description
80
-----  ----                 -----------
81
  7-0  intr_en[7:0]         1=thread interrupt enable; 0=disable
82
 15-8  -                    00000000
83
 
84
Notes:
85
- Read / write.
86
- Per thread enabling of interrupts.
87
- All bits cleared on async reset.
88
 
89
================================================================================
90
- 0x4 : Opcode error register - op_er_reg
91
--------------------------------------------------------------------------------
92
 
93
  bit  name                 description
94
-----  ----                 -----------
95
  7-0  op_er[7:0]           1=opcode error; 0=OK
96
 15-8  -                    00000000
97
 
98
Notes:
99
- Clear on write one.
100
- Per thread opcode error reporting.
101
 
102
================================================================================
103
- 0x5 : Stack error register - stk_er_reg
104
--------------------------------------------------------------------------------
105
 
106
  bit  name                 description
107
-----  ----                 -----------
108
  7-0  pop_er[7:0]          1=lifo pop when empty; 0=OK
109
 15-8  push_er[7:0]         1=lifo push when full; 0=OK
110
 
111
Notes:
112
- Clear on write one.
113
- Per thread LIFO stack error reporting.
114
 
115
================================================================================
116
- 0x6 - 0x7 : UNUSED
117
================================================================================
118
- 0x8 : I/O low register - io_lo_reg
119
--------------------------------------------------------------------------------
120
 
121
  bit  name                 description
122
-----  ----                 -----------
123
 15-0  io_lo[15:0]          I/O data
124
 
125
Notes:
126
- Separate read / write.
127
- Reads of io_lo_reg freeze data in io_hi_reg, so read io_lo_reg first then
128
  read io_hi_reg for contiguous wide (32 bit) data reads.
129
- Writes function normally.
130
 
131
================================================================================
132
- 0x9 : I/O high register - io_hi_reg
133
--------------------------------------------------------------------------------
134
 
135
  bit  name                 description
136
-----  ----                 -----------
137
 15-0  io_hi[15:0]          I/O data
138
 
139
Notes:
140
- Separate read / write.
141
- Reads of io_lo_reg freeze data in io_hi_reg, so read io_lo_reg first then
142
  read io_hi_reg for contiguous wide (32 bit) data reads.
143
- Writes function normally.
144
 
145
================================================================================
146
- 0xA - 0xB : UNUSED
147
================================================================================
148
- 0xC : UART RX register - uart_rx_reg
149
--------------------------------------------------------------------------------
150
 
151
  bit  name                 description
152
-----  ----                 -----------
153
  7-0  uart_rx_data[7:0]    RX UART data
154
    8  rx_rdy               1=RX UART ready (has new data); 0=not ready
155
 15-9  -                    0000000
156
 
157
Notes:
158
- Reads from this register pop data from the RX UART.
159
- To avoid RX data loss, read soon after RX UART is ready.
160
- UART ready bit will self clear after associated register operation.
161
 
162
================================================================================
163
- 0xD : UART TX register - uart_tx_reg
164
--------------------------------------------------------------------------------
165
 
166
  bit  name                 description
167
-----  ----                 -----------
168
  7-0  uart_tx_data[7:0]    TX UART data
169
    8  tx_rdy               1=TX UART ready (for new data); 0=not ready
170
 15-9  -                    0000000
171
 
172
Notes:
173
- Writes to this register push data to the TX UART.
174
- To avoid TX data loss, restrict writes to when TX UART is ready.
175
- UART ready bit will self clear after associated register operation.
176
 
177
================================================================================
178
- 0xE - 0xF : UNUSED
179
================================================================================
180
*/
181
 
182
module reg_set
183
        #(
184
        parameter       integer                                                 REGS_IN                 = 1,            // bus in register option
185
        parameter       integer                                                 REGS_OUT                        = 1,            // bus out register option
186
        parameter       integer                                                 DATA_W                  = 16,           // data width (bits)
187
        parameter       integer                                                 ADDR_W                  = 4,            // address width (bits)
188
        parameter       integer                                                 THREADS                 = 8,            // threads
189
        parameter       integer                                                 THRD_W                  = 3,            // thread selector width
190
        parameter       integer                                                 STACKS                  = 8,            // stacks
191
        parameter       integer                                                 STK_W                           = 3,            // stack selector width
192
        //
193
        parameter       [DATA_W/2-1:0]                                   VER_MAJ                 = 'h1,  // core version
194
        parameter       [DATA_W/2-1:0]                                   VER_MIN                 = 'h0,
195
        //
196
        parameter       integer                                                 UART_DATA_W             = 8,            // uart data width (bits)
197
        parameter       integer                                                 CLK_HZ                  = 160000000,    // master clk_i rate (Hz)
198
        parameter       integer                                                 UART_BAUD_RATE  = 115200        // uart baud rate (Hz)
199
        )
200
        (
201
        // clocks & resets
202
        input                   wire                                                            clk_i,                                          // clock
203
        input                   wire                                                            rst_i,                                          // async. reset, active high
204
        // bus interface
205
        input                   wire    [ADDR_W-1:0]                     addr_i,                                         // address
206
        input                   wire                                                            wr_i,                                                   // data write enable, active high
207
        input                   wire                                                            rd_i,                                                   // data read enable, active high
208
        input                   wire    [DATA_W-1:0]                     data_i,                                         // write data
209
        output          wire    [DATA_W-1:0]                     data_o,                                         // read data
210
        // clear
211
        output          wire    [THREADS-1:0]                    clr_req_o,                                      // clr request, active high
212
        // interrupt
213
        output          wire    [THREADS-1:0]                    intr_en_o,                                      // interrupt enable, active high
214
        // errors
215
        input                   wire    [THRD_W-1:0]                     thrd_0_i,                                       // thread
216
        input                   wire                                                            op_code_er_i,                           // 1=illegal op code encountered
217
        input                   wire    [THRD_W-1:0]                     thrd_2_i,                                       // thread
218
        input                   wire    [STACKS-1:0]                     pop_er_2_i,                                     // pop when empty, active high 
219
        input                   wire    [THRD_W-1:0]                     thrd_3_i,                                       // thread
220
        input                   wire    [STACKS-1:0]                     push_er_3_i,                            // push when full, active high
221
        // I/O
222
        input                   wire    [DATA_W-1:0]                     io_lo_i,                                                // gpio linked to io_hi_i
223
        input                   wire    [DATA_W-1:0]                     io_hi_i,
224
        output          wire    [DATA_W-1:0]                     io_lo_o,                                                // unlinked gpio
225
        output          wire    [DATA_W-1:0]                     io_hi_o,
226
        // serial interface
227
        input                   wire                                                            uart_rx_i,                                      // serial data
228
        output          wire                                                            uart_tx_o                                       // serial data
229
        );
230
 
231
 
232
        /*
233
        ----------------------
234
        -- internal signals --
235
        ----------------------
236
        */
237
        `include "reg_set_addr.h"
238
        //
239
        wire                                    [ADDR_W-1:0]                     addr;
240
        wire                                                                                            reg_en, wr, rd;
241
        wire                                    [DATA_W-1:0]                     rd_data, wr_data, reg_rd_data;
242
        wire                                    [DATA_W-1:0]                     ver_rd_data,
243
                                                                                                                thrd_id_rd_data,
244
                                                                                                                clr_rd_data,
245
                                                                                                                intr_en_rd_data,
246
                                                                                                                op_er_rd_data,
247
                                                                                                                stk_er_data,
248
                                                                                                                io_lo_rd_data,
249
                                                                                                                io_hi_rd_data,
250
                                                                                                                uart_rx_rd_data,
251
                                                                                                                uart_tx_rd_data;
252
        //
253
        wire                                                                                            io_lo_reg_rd;
254
        wire                                    [THREADS-1:0]                    op_code_errors, push_errors, pop_errors;
255
        wire                                    [UART_DATA_W-1:0]                uart_tx_data, uart_rx_data;
256
        wire                                                                                            uart_tx_rdy, uart_rx_rdy;
257
        wire                                                                                            uart_tx_wr, uart_rx_rd;
258
 
259
 
260
 
261
        /*
262
        ================
263
        == code start ==
264
        ================
265
        */
266
 
267
 
268
 
269
        // optional bus input regs
270
        pipe
271
        #(
272
        .DEPTH          ( REGS_IN ),
273
        .WIDTH          ( 2+ADDR_W+DATA_W ),
274
        .RESET_VAL      ( 0 )
275
        )
276
        in_regs
277
        (
278
        .clk_i          ( clk_i ),
279
        .rst_i          ( rst_i ),
280
        .data_i         ( { wr_i, rd_i, addr_i, data_i } ),
281
        .data_o         ( { wr,   rd,   addr,   wr_data } )
282
        );
283
 
284
 
285
        // big ORing of read data
286
        assign rd_data =
287
                ver_rd_data |
288
                thrd_id_rd_data |
289
                clr_rd_data |
290
                intr_en_rd_data |
291
                op_er_rd_data |
292
                stk_er_data |
293
                io_lo_rd_data |
294
                io_hi_rd_data |
295
                uart_rx_rd_data |
296
                uart_tx_rd_data;
297
 
298
 
299
        // optional output regs
300
        pipe
301
        #(
302
        .DEPTH          ( REGS_OUT ),
303
        .WIDTH          ( DATA_W ),
304
        .RESET_VAL      ( 0 )
305
        )
306
        out_regs
307
        (
308
        .clk_i          ( clk_i ),
309
        .rst_i          ( rst_i ),
310
        .data_i         ( rd_data ),
311
        .data_o         ( data_o )
312
        );
313
 
314
 
315
 
316
        /*
317
        -------------
318
        -- ver_reg --
319
        -------------
320
        */
321
 
322
        reg_base
323
        #(
324
        .DATA_W                 ( DATA_W ),
325
        .ADDR_W                 ( ADDR_W ),
326
        .ADDRESS                        ( VER_ADDR[ADDR_W-1:0] ),
327
        .OUT_MODE               ( "ZERO" ),
328
        .READ_MODE              ( "THRU" )
329
        )
330
        ver_reg
331
        (
332
        .clk_i                  ( clk_i ),
333
        .rst_i                  ( rst_i ),
334
        .addr_i                 ( addr ),
335
        .wr_i                           ( wr ),
336
        .rd_i                           ( rd ),
337
        .wr_data_i              ( wr_data ),
338
        .rd_data_o              ( ver_rd_data ),
339
        .reg_data_i             ( { VER_MAJ, VER_MIN } )
340
        );
341
 
342
 
343
        /*
344
        -----------------
345
        -- thrd_id_reg --
346
        -----------------
347
        */
348
 
349
        reg_base
350
        #(
351
        .DATA_W                 ( DATA_W ),
352
        .ADDR_W                 ( ADDR_W ),
353
        .ADDRESS                        ( THRD_ID_ADDR[ADDR_W-1:0] ),
354
        .OUT_MODE               ( "ZERO" ),
355
        .READ_MODE              ( "THRU" ),
356
        .LIVE_MASK              ( { THRD_W{ 1'b1 } } )
357
        )
358
        thrd_id_reg
359
        (
360
        .clk_i                  ( clk_i ),
361
        .rst_i                  ( rst_i ),
362
        .addr_i                 ( addr ),
363
        .wr_i                           ( wr ),
364
        .rd_i                           ( rd ),
365
        .wr_data_i              ( wr_data ),
366
        .rd_data_o              ( thrd_id_rd_data ),
367
        .reg_data_i             ( thrd_3_i )
368
        );
369
 
370
 
371
        /*
372
        -------------
373
        -- clr_reg --
374
        -------------
375
        */
376
        reg_base
377
        #(
378
        .DATA_W                 ( DATA_W ),
379
        .ADDR_W                 ( ADDR_W ),
380
        .ADDRESS                        ( CLR_ADDR[ADDR_W-1:0] ),
381
        .OUT_MODE               ( "LTCH" ),
382
        .READ_MODE              ( "LOOP" ),
383
        .LIVE_MASK              ( { THREADS{ 1'b1 } } )
384
        )
385
        clr_reg
386
        (
387
        .clk_i                  ( clk_i ),
388
        .rst_i                  ( rst_i ),
389
        .addr_i                 ( addr ),
390
        .wr_i                           ( wr ),
391
        .rd_i                           ( rd ),
392
        .wr_data_i              ( wr_data ),
393
        .rd_data_o              ( clr_rd_data ),
394
        .reg_data_o             ( clr_req_o )
395
        );
396
 
397
 
398
        /*
399
        -----------------
400
        -- intr_en_reg --
401
        -----------------
402
        */
403
        reg_base
404
        #(
405
        .DATA_W                 ( DATA_W ),
406
        .ADDR_W                 ( ADDR_W ),
407
        .ADDRESS                        ( INTR_EN_ADDR[ADDR_W-1:0] ),
408
        .OUT_MODE               ( "LTCH" ),
409
        .READ_MODE              ( "LOOP" ),
410
        .LIVE_MASK              ( { THREADS{ 1'b1 } } )
411
        )
412
        intr_en_reg
413
        (
414
        .clk_i                  ( clk_i ),
415
        .rst_i                  ( rst_i ),
416
        .addr_i                 ( addr ),
417
        .wr_i                           ( wr ),
418
        .rd_i                           ( rd ),
419
        .wr_data_i              ( wr_data ),
420
        .rd_data_o              ( intr_en_rd_data ),
421
        .reg_data_o             ( intr_en_o )
422
        );
423
 
424
 
425
        /*
426
        ---------------
427
        -- op_er_reg --
428
        ---------------
429
        */
430
        reg_base
431
        #(
432
        .DATA_W                 ( DATA_W ),
433
        .ADDR_W                 ( ADDR_W ),
434
        .ADDRESS                        ( OP_ER_ADDR[ADDR_W-1:0] ),
435
        .OUT_MODE               ( "ZERO" ),
436
        .READ_MODE              ( "COW1" ),
437
        .LIVE_MASK              ( { THREADS{ 1'b1 } } )
438
        )
439
        op_er_reg
440
        (
441
        .clk_i                  ( clk_i ),
442
        .rst_i                  ( rst_i ),
443
        .addr_i                 ( addr ),
444
        .wr_i                           ( wr ),
445
        .rd_i                           ( rd ),
446
        .wr_data_i              ( wr_data ),
447
        .rd_data_o              ( op_er_rd_data ),
448
        .reg_data_i             ( op_code_errors )
449
        );
450
 
451
        // decode errors
452
        assign op_code_errors = op_code_er_i << thrd_0_i;
453
 
454
 
455
        /*
456
        ----------------
457
        -- stk_er_reg --
458
        ----------------
459
        */
460
        reg_base
461
        #(
462
        .DATA_W                 ( DATA_W ),
463
        .ADDR_W                 ( ADDR_W ),
464
        .ADDRESS                        ( STK_ER_ADDR[ADDR_W-1:0] ),
465
        .OUT_MODE               ( "ZERO" ),
466
        .READ_MODE              ( "COW1" ),
467
        .LIVE_MASK              ( { (THREADS+THREADS){ 1'b1 } } )
468
        )
469
        stk_er_reg
470
        (
471
        .clk_i                  ( clk_i ),
472
        .rst_i                  ( rst_i ),
473
        .addr_i                 ( addr ),
474
        .wr_i                           ( wr ),
475
        .rd_i                           ( rd ),
476
        .wr_data_i              ( wr_data ),
477
        .rd_data_o              ( stk_er_data ),
478
        .reg_data_i             ( { push_errors, pop_errors } )
479
        );
480
 
481
        // decode errors
482
        assign push_errors = |push_er_3_i << thrd_3_i;
483
        assign pop_errors = |pop_er_2_i << thrd_2_i;
484
 
485
 
486
        /*
487
        ---------------
488
        -- io_lo_reg --
489
        ---------------
490
        */
491
        reg_base
492
        #(
493
        .DATA_W                 ( DATA_W ),
494
        .ADDR_W                 ( ADDR_W ),
495
        .ADDRESS                        ( IO_LO_ADDR[ADDR_W-1:0] ),
496
        .OUT_MODE               ( "LTCH" ),
497
        .READ_MODE              ( "THRU" )
498
        )
499
        io_lo_reg
500
        (
501
        .clk_i                  ( clk_i ),
502
        .rst_i                  ( rst_i ),
503
        .addr_i                 ( addr ),
504
        .wr_i                           ( wr ),
505
        .rd_i                           ( rd ),
506
        .wr_data_i              ( wr_data ),
507
        .rd_data_o              ( io_lo_rd_data ),
508
        .reg_rd_o               ( io_lo_reg_rd ),
509
        .reg_data_i             ( io_lo_i ),
510
        .reg_data_o             ( io_lo_o )
511
        );
512
 
513
 
514
        /*
515
        ---------------
516
        -- io_hi_reg --
517
        ---------------
518
        */
519
        reg_base
520
        #(
521
        .DATA_W                 ( DATA_W ),
522
        .ADDR_W                 ( ADDR_W ),
523
        .ADDRESS                        ( IO_HI_ADDR[ADDR_W-1:0] ),
524
        .OUT_MODE               ( "LTCH" ),
525
        .READ_MODE              ( "DFFE" )
526
        )
527
        io_hi_reg
528
        (
529
        .clk_i                  ( clk_i ),
530
        .rst_i                  ( rst_i ),
531
        .addr_i                 ( addr ),
532
        .wr_i                           ( wr ),
533
        .rd_i                           ( rd ),
534
        .wr_data_i              ( wr_data ),
535
        .rd_data_o              ( io_hi_rd_data ),
536
        .reg_en_i               ( io_lo_reg_rd ),  // enable on lo read
537
        .reg_data_i             ( io_hi_i ),
538
        .reg_data_o             ( io_hi_o )
539
        );
540
 
541
 
542
        /*
543
        -----------------
544
        -- uart_rx_reg --
545
        -----------------
546
        */
547
        reg_base
548
        #(
549
        .DATA_W                 ( DATA_W ),
550
        .ADDR_W                 ( ADDR_W ),
551
        .ADDRESS                        ( UART_RX_ADDR[ADDR_W-1:0] ),
552
        .OUT_MODE               ( "ZERO" ),
553
        .READ_MODE              ( "THRU" ),
554
        .LIVE_MASK              ( { 1+UART_DATA_W{ 1'b1 } } )
555
        )
556
        uart_rx_reg
557
        (
558
        .clk_i                  ( clk_i ),
559
        .rst_i                  ( rst_i ),
560
        .addr_i                 ( addr ),
561
        .wr_i                           ( wr ),
562
        .rd_i                           ( rd ),
563
        .wr_data_i              ( wr_data ),
564
        .rd_data_o              ( uart_rx_rd_data ),
565
        .reg_rd_o               ( uart_rx_rd ),
566
        .reg_data_i             ( { uart_rx_rdy, uart_rx_data } ),
567
        .reg_data_o             (  )
568
        );
569
 
570
 
571
        /*
572
        -----------------
573
        -- uart_tx_reg --
574
        -----------------
575
        */
576
        reg_base
577
        #(
578
        .DATA_W                 ( DATA_W ),
579
        .ADDR_W                 ( ADDR_W ),
580
        .ADDRESS                        ( UART_TX_ADDR[ADDR_W-1:0] ),
581
        .OUT_MODE               ( "THRU" ),
582
        .READ_MODE              ( "THRU" ),
583
        .LIVE_MASK              ( { 1+UART_DATA_W{ 1'b1 } } )
584
        )
585
        uart_tx_reg
586
        (
587
        .clk_i                  ( clk_i ),
588
        .rst_i                  ( rst_i ),
589
        .addr_i                 ( addr ),
590
        .wr_i                           ( wr ),
591
        .rd_i                           ( rd ),
592
        .wr_data_i              ( wr_data ),
593
        .rd_data_o              ( uart_tx_rd_data ),
594
        .reg_wr_o               ( uart_tx_wr ),
595
        .reg_data_i             ( { uart_tx_rdy, { UART_DATA_W{ 1'b0 } } } ),
596
        .reg_data_o             ( uart_tx_data )
597
        );
598
 
599
 
600
        uart_core
601
        #(
602
        .CLK_HZ                         ( CLK_HZ ),
603
        .BAUD_RATE                      ( UART_BAUD_RATE ),
604
        .DATA_W                         ( UART_DATA_W )
605
        )
606
        uart_core_inst
607
        (
608
        .clk_i                          ( clk_i ),
609
        .rst_i                          ( rst_i ),
610
        .tx_data_i                      ( uart_tx_data ),
611
        .tx_rdy_o                       ( uart_tx_rdy ),
612
        .tx_wr_i                                ( uart_tx_wr ),
613
        .rx_data_o                      ( uart_rx_data ),
614
        .rx_rdy_o                       ( uart_rx_rdy ),
615
        .rx_rd_i                                ( uart_rx_rd ),
616
        .tx_o                                   ( uart_tx_o ),
617
        .rx_i                                   ( uart_rx_i ),
618
        .loop_i                         ( 1'b0 ),  // unused
619
        .rx_error_o                     (  ),  // unused
620
        .rx_bad_buffer_o        (  ),  // unused
621
        .baud_clk_o                     (  )  // unused
622
        );
623
 
624
 
625
endmodule

powered by: WebSVN 2.1.0

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