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

Subversion Repositories myblaze

[/] [myblaze/] [trunk/] [rtl/] [core.py] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rockee
# -*- coding: utf-8 -*-
2
"""
3
    core.py
4
    =======
5
 
6
    MyBlaze Core, top level entity
7
 
8 5 rockee
    :copyright: Copyright (c) 2010 Jian Luo
9
    :author-email: jian.luo.cn(at_)gmail.com
10
    :license: LGPL, see LICENSE for details
11 2 rockee
    :revision: $Id: core.py 6 2010-11-21 23:18:44Z rockee $
12
"""
13
 
14
from myhdl import *
15
from defines import *
16
from functions import *
17
 
18
from fetch import *
19
from decoder import *
20
from execute import *
21
from memory import *
22
 
23
def MyBlazeCore(
24
        clock,
25
        reset,
26
        dmem_ena_in,
27
 
28
        dmem_data_in,
29
        dmem_data_out,
30
        dmem_sel_out,
31
        dmem_we_out,
32
        dmem_addr_out,
33
        dmem_ena_out,
34
        imem_data_in,
35
        imem_addr_out,
36
        imem_ena_out,
37
 
38 6 rockee
        # Ports only for debug
39
        debug_if_program_counter=0,
40 2 rockee
 
41 6 rockee
        debug_of_alu_op=0,
42
        debug_of_alu_src_a=0,
43
        debug_of_alu_src_b=0,
44
        debug_of_branch_cond=0,
45
        debug_of_carry=0,
46
        debug_of_carry_keep=0,
47
        debug_of_delay=0,
48
        debug_of_hazard=0,
49
        debug_of_immediate=0,
50
        debug_of_instruction=0,
51
        debug_of_mem_read=0,
52
        debug_of_mem_write=0,
53
        debug_of_operation=0,
54
        debug_of_program_counter=0,
55
        debug_of_reg_a=0,
56
        debug_of_reg_b=0,
57
        debug_of_reg_d=0,
58
        debug_of_reg_write=0,
59
        debug_of_transfer_size=0,
60 2 rockee
 
61 6 rockee
        debug_of_fwd_mem_result=0,
62
        debug_of_fwd_reg_d=0,
63
        debug_of_fwd_reg_write=0,
64 2 rockee
 
65 6 rockee
        debug_gprf_dat_a=0,
66
        debug_gprf_dat_b=0,
67
        debug_gprf_dat_d=0,
68 2 rockee
 
69 6 rockee
        debug_ex_alu_result=0,
70
        debug_ex_reg_d=0,
71
        debug_ex_reg_write=0,
72 2 rockee
 
73 6 rockee
        debug_ex_branch=0,
74
        debug_ex_dat_d=0,
75
        debug_ex_flush_id=0,
76
        debug_ex_mem_read=0,
77
        debug_ex_mem_write=0,
78
        debug_ex_program_counter=0,
79
        debug_ex_transfer_size=0,
80 2 rockee
 
81 6 rockee
        debug_ex_dat_a=0,
82
        debug_ex_dat_b=0,
83
        debug_ex_instruction=0,
84
        debug_ex_reg_a=0,
85
        debug_ex_reg_b=0,
86 2 rockee
 
87 6 rockee
        debug_mm_alu_result=0,
88
        debug_mm_mem_read=0,
89
        debug_mm_reg_d=0,
90
        debug_mm_reg_write=0,
91
        debug_mm_transfer_size=0,
92
 
93
        DEBUG=True,
94 2 rockee
        ):
95
    """
96
    """
97 6 rockee
    # Ports only for debug
98
    of_instruction = 0
99
    if __debug__:
100
        of_instruction = Signal(intbv(0)[CFG_IMEM_WIDTH:])
101
    # End Ports only for debug
102 2 rockee
 
103
    if_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
104
 
105
    gprf_dat_a = Signal(intbv(0)[CFG_DMEM_WIDTH:])
106
    gprf_dat_b = Signal(intbv(0)[CFG_DMEM_WIDTH:])
107
    gprf_dat_d = Signal(intbv(0)[CFG_DMEM_WIDTH:])
108
 
109
    of_alu_op = Signal(alu_operation.ALU_ADD)
110
    of_alu_src_a = Signal(src_type_a.REGA)
111
    of_alu_src_b = Signal(src_type_b.REGB)
112
    of_branch_cond = Signal(branch_condition.NOP)
113
    of_carry = Signal(carry_type.C_ZERO)
114
    of_carry_keep = Signal(False)
115
    of_delay = Signal(False)
116
    of_hazard = Signal(False)
117
    of_immediate = Signal(intbv(0)[CFG_DMEM_WIDTH:])
118
    of_mem_read = Signal(False)
119
    of_mem_write = Signal(False)
120
    of_operation = Signal(False)
121
    of_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
122 6 rockee
    of_reg_a = Signal(intbv(0)[CFG_GPRF_SIZE:])
123
    of_reg_b = Signal(intbv(0)[CFG_GPRF_SIZE:])
124
    of_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
125 2 rockee
    of_reg_write = Signal(False)
126
    of_transfer_size = Signal(transfer_size_type.WORD)
127
 
128
    # Write back stage forwards
129
    of_fwd_mem_result = Signal(intbv(0)[CFG_DMEM_WIDTH:])
130 6 rockee
    of_fwd_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
131 2 rockee
    of_fwd_reg_write = Signal(False)
132
 
133
    ex_alu_result = Signal(intbv(0)[CFG_DMEM_WIDTH:])
134 6 rockee
    ex_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
135 2 rockee
    ex_reg_write = Signal(False)
136
 
137
    ex_branch = Signal(False)
138
    ex_dat_d = Signal(intbv(0)[CFG_DMEM_WIDTH:])
139
    ex_flush_id = Signal(False)
140
    ex_mem_read = Signal(False)
141
    ex_mem_write = Signal(False)
142
    ex_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
143
    ex_transfer_size = Signal(transfer_size_type.WORD)
144
 
145 6 rockee
    # Ports only for debug
146
    ex_dat_a = 0
147
    ex_dat_b = 0
148
    ex_instruction = 0
149
    ex_reg_a = 0
150
    ex_reg_b = 0
151
    if __debug__:
152
        ex_dat_a = Signal(intbv(0)[CFG_DMEM_WIDTH:])
153
        ex_dat_b = Signal(intbv(0)[CFG_DMEM_WIDTH:])
154
        ex_instruction = Signal(intbv(0)[CFG_DMEM_WIDTH:])
155
        ex_reg_a = Signal(intbv(0)[CFG_GPRF_SIZE:])
156
        ex_reg_b = Signal(intbv(0)[CFG_GPRF_SIZE:])
157
    # End Ports only for debug
158 2 rockee
 
159
    mm_alu_result = Signal(intbv(0)[CFG_DMEM_WIDTH:])
160
    mm_mem_read = Signal(False)
161 6 rockee
    mm_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
162 2 rockee
    mm_reg_write = Signal(False)
163
    mm_transfer_size = Signal(transfer_size_type.WORD)
164
 
165
    ftch = FetchUnit(
166
        clock=clock,
167
        reset=reset,
168
        enable=dmem_ena_in,
169
        of_hazard=of_hazard,
170
        ex_alu_result=ex_alu_result,
171
        ex_branch=ex_branch,
172
        if_program_counter=if_program_counter,
173
        imem_addr_out=imem_addr_out,
174
        imem_ena_out=imem_ena_out,
175
    )
176
 
177
    deco = Decoder(
178
        clock=clock,
179
        reset=reset,
180
        enable=dmem_ena_in,
181
        dmem_data_in=dmem_data_in,
182
        imem_data_in=imem_data_in,
183
        if_program_counter=if_program_counter,
184
        ex_flush_id=ex_flush_id,
185
        mm_alu_result=mm_alu_result,
186
        mm_mem_read=mm_mem_read,
187
        mm_reg_d=mm_reg_d,
188
        mm_reg_write=mm_reg_write,
189
        mm_transfer_size=mm_transfer_size,
190
        gprf_dat_a=gprf_dat_a,
191
        gprf_dat_b=gprf_dat_b,
192
        gprf_dat_d=gprf_dat_d,
193
        of_alu_op=of_alu_op,
194
        of_alu_src_a=of_alu_src_a,
195
        of_alu_src_b=of_alu_src_b,
196
        of_branch_cond=of_branch_cond,
197
        of_carry=of_carry,
198
        of_carry_keep=of_carry_keep,
199
        of_delay=of_delay,
200
        of_hazard=of_hazard,
201
        of_immediate=of_immediate,
202
        of_mem_read=of_mem_read,
203
        of_mem_write=of_mem_write,
204
        of_operation=of_operation,
205
        of_program_counter=of_program_counter,
206
        of_reg_a=of_reg_a,
207
        of_reg_b=of_reg_b,
208
        of_reg_d=of_reg_d,
209
        of_reg_write=of_reg_write,
210
        of_transfer_size=of_transfer_size,
211
 
212
        # Write back stage output
213
        of_fwd_mem_result=of_fwd_mem_result,
214
        of_fwd_reg_d=of_fwd_reg_d,
215
        of_fwd_reg_write=of_fwd_reg_write,
216
 
217 6 rockee
        # Ports only for debug
218
        of_instruction=of_instruction,
219 2 rockee
 
220
    )
221
 
222
    exeu = ExecuteUnit(
223
        # Inputs
224
        clock=clock,
225
        reset=reset,
226
        enable=dmem_ena_in,
227
        dmem_data_in=dmem_data_in,
228
        gprf_dat_a=gprf_dat_a,
229
        gprf_dat_b=gprf_dat_b,
230
        gprf_dat_d=gprf_dat_d,
231
        mm_alu_result=mm_alu_result,
232
        mm_mem_read=mm_mem_read,
233
        mm_reg_d=mm_reg_d,
234
        mm_reg_write=mm_reg_write,
235
        mm_transfer_size=mm_transfer_size,
236
        of_alu_op=of_alu_op,
237
        of_alu_src_a=of_alu_src_a,
238
        of_alu_src_b=of_alu_src_b,
239
        of_branch_cond=of_branch_cond,
240
        of_carry=of_carry,
241
        of_carry_keep=of_carry_keep,
242
        of_delay=of_delay,
243
        of_immediate=of_immediate,
244
        of_mem_read=of_mem_read,
245
        of_mem_write=of_mem_write,
246
        of_operation=of_operation,
247
        of_program_counter=of_program_counter,
248
        of_reg_a=of_reg_a,
249
        of_reg_b=of_reg_b,
250
        of_reg_d=of_reg_d,
251
        of_reg_write=of_reg_write,
252
        of_transfer_size=of_transfer_size,
253
 
254
        # Write back stage forwards,
255
        of_fwd_mem_result=of_fwd_mem_result,
256
        of_fwd_reg_d=of_fwd_reg_d,
257
        of_fwd_reg_write=of_fwd_reg_write,
258
 
259
        # Outputs
260
        ex_alu_result=ex_alu_result,
261
        ex_reg_d=ex_reg_d,
262
        ex_reg_write=ex_reg_write,
263
 
264
        ex_branch=ex_branch,
265
        ex_dat_d=ex_dat_d,
266
        ex_flush_id=ex_flush_id,
267
        ex_mem_read=ex_mem_read,
268
        ex_mem_write=ex_mem_write,
269
        ex_program_counter=ex_program_counter,
270
        ex_transfer_size=ex_transfer_size,
271
 
272 6 rockee
        # Ports only for debug
273
        of_instruction=of_instruction,
274
        ex_dat_a=ex_dat_a,
275
        ex_dat_b=ex_dat_b,
276
        ex_instruction=ex_instruction,
277
        ex_reg_a=ex_reg_a,
278
        ex_reg_b=ex_reg_b,
279 2 rockee
    )
280
 
281
    memu = MemUnit(
282
        # Inputs
283
        clock=clock,
284
        reset=reset,
285
        enable=dmem_ena_in,
286
        ex_alu_result=ex_alu_result,
287
        ex_reg_d=ex_reg_d,
288
        ex_reg_write=ex_reg_write,
289
        ex_branch=ex_branch,
290
        ex_dat_d=ex_dat_d,
291
        ex_mem_read=ex_mem_read,
292
        ex_mem_write=ex_mem_write,
293
        ex_program_counter=ex_program_counter,
294
        ex_transfer_size=ex_transfer_size,
295
        # Outputs
296
        mm_alu_result=mm_alu_result,
297
        mm_mem_read=mm_mem_read,
298
        mm_reg_d=mm_reg_d,
299
        mm_reg_write=mm_reg_write,
300
        mm_transfer_size=mm_transfer_size,
301
        dmem_data_out=dmem_data_out,
302
        dmem_sel_out=dmem_sel_out,
303
        dmem_we_out=dmem_we_out,
304
        dmem_addr_out=dmem_addr_out,
305
        dmem_ena_out=dmem_ena_out,
306
    )
307
 
308 6 rockee
    @always_comb
309
    def debug_output():
310
        debug_if_program_counter.next = if_program_counter
311 2 rockee
 
312 6 rockee
        debug_of_alu_op.next = of_alu_op
313
        debug_of_alu_src_a.next = of_alu_src_a
314
        debug_of_alu_src_b.next = of_alu_src_b
315
        debug_of_branch_cond.next = of_branch_cond
316
        debug_of_carry.next = of_carry
317
        debug_of_carry_keep.next = of_carry_keep
318
        debug_of_delay.next = of_delay
319
        debug_of_hazard.next = of_hazard
320
        debug_of_immediate.next = of_immediate
321
        debug_of_instruction.next = of_instruction
322
        debug_of_mem_read.next = of_mem_read
323
        debug_of_mem_write.next = of_mem_write
324
        debug_of_operation.next = of_operation
325
        debug_of_program_counter.next = of_program_counter
326
        debug_of_reg_a.next = of_reg_a
327
        debug_of_reg_b.next = of_reg_b
328
        debug_of_reg_d.next = of_reg_d
329
        debug_of_reg_write.next = of_reg_write
330
        debug_of_transfer_size.next = of_transfer_size
331 2 rockee
 
332 6 rockee
        debug_of_fwd_mem_result.next = of_fwd_mem_result
333
        debug_of_fwd_reg_d.next = of_fwd_reg_d
334
        debug_of_fwd_reg_write.next = of_fwd_reg_write
335 2 rockee
 
336 6 rockee
        debug_gprf_dat_a.next = gprf_dat_a
337
        debug_gprf_dat_b.next = gprf_dat_b
338
        debug_gprf_dat_d.next = gprf_dat_d
339 2 rockee
 
340 6 rockee
        debug_ex_alu_result.next = ex_alu_result
341
        debug_ex_reg_d.next = ex_reg_d
342
        debug_ex_reg_write.next = ex_reg_write
343 2 rockee
 
344 6 rockee
        debug_ex_branch.next = ex_branch
345
        debug_ex_dat_d.next = ex_dat_d
346
        debug_ex_flush_id.next = ex_flush_id
347
        debug_ex_mem_read.next = ex_mem_read
348
        debug_ex_mem_write.next = ex_mem_write
349
        debug_ex_program_counter.next = ex_program_counter
350
        debug_ex_transfer_size.next = ex_transfer_size
351 2 rockee
 
352 6 rockee
        debug_ex_dat_a.next = ex_dat_a
353
        debug_ex_dat_b.next = ex_dat_b
354
        debug_ex_instruction.next = ex_instruction
355
        debug_ex_reg_a.next = ex_reg_a
356
        debug_ex_reg_b.next = ex_reg_b
357 2 rockee
 
358 6 rockee
        debug_mm_alu_result.next = mm_alu_result
359
        debug_mm_mem_read.next = mm_mem_read
360
        debug_mm_reg_d.next = mm_reg_d
361
        debug_mm_reg_write.next = mm_reg_write
362
        debug_mm_transfer_size.next = mm_transfer_size
363 2 rockee
 
364 6 rockee
    if DEBUG:
365
        return ftch, deco, exeu, memu, debug_output
366
    return ftch, deco, exeu, memu
367 2 rockee
 
368
def bench():
369
    clock = Signal(False)
370
    reset = Signal(False)
371
 
372
    dmem_ena_in = Signal(False)
373
    dmem_data_in = Signal(intbv(0)[CFG_DMEM_WIDTH:])
374
    dmem_data_out = Signal(intbv(0)[CFG_DMEM_WIDTH:])
375
    dmem_sel_out = Signal(intbv(0)[4:])
376
    dmem_we_out = Signal(False)
377
    dmem_addr_out = Signal(intbv(0)[CFG_DMEM_SIZE:])
378
    dmem_ena_out = Signal(False)
379
    imem_data_in = Signal(intbv(0)[CFG_IMEM_WIDTH:])
380
    imem_addr_out = Signal(intbv(0)[CFG_IMEM_SIZE:])
381
    imem_ena_out = Signal(False)
382
 
383
    core = MyBlazeCore(
384
        clock=clock,
385
        reset=reset,
386
        dmem_ena_in=dmem_ena_in,
387
 
388
        dmem_data_in=dmem_data_in,
389
        dmem_data_out=dmem_data_out,
390
        dmem_sel_out=dmem_sel_out,
391
        dmem_we_out=dmem_we_out,
392
        dmem_addr_out=dmem_addr_out,
393
        dmem_ena_out=dmem_ena_out,
394
        imem_data_in=imem_data_in,
395
        imem_addr_out=imem_addr_out,
396
        imem_ena_out=imem_ena_out,
397
    )
398
    #code = ['001000''00','001''00000','0000''0000','0000''0001', # addi r1,r0,1
399
            #'001000''00','010''00000','0000''0000','0000''0010', # addi r1,r0,2
400
            #'001000''00','011''00000','0000''0000','0000''0011', # addi r1,r0,3
401
            #'001000''00','100''00000','0000''0000','0000''0100', # addi r1,r0,4
402
            #'001000''00','101''00000','0000''0000','0000''0101', # addi r1,r0,5
403
            #'001000''00','110''00000','0000''0000','0000''0110', # addi r1,r0,6
404
            #'001000''00','111''00000','0000''0000','0000''0111', # addi r1,r0,7
405
            #'001000''01','000''00000','0000''0000','0000''1000', # addi r1,r0,8
406
            #]
407
    #imem = [int(x, 16) for x in code]
408
    imem = []
409
    for x in open('rom.vmem').readlines():
410
        x = int(x, 16)
411
        imem.append((x>>24)%256)
412
        imem.append((x>>16)%256)
413
        imem.append((x>>8)%256)
414
        imem.append((x>>0)%256)
415
 
416
    dmem = imem
417
    print 'memory size: 0x%04x' % len(imem)
418
    #imem = [int(x, 16) for x in open('rom.vmem').readlines()]
419
    #dmem = [Signal(intbv(0)[32:]) for i in range(2**14)]
420
    import re
421
 
422
    @always(delay(10))
423
    def clockgen():
424
        clock.next = not clock
425
 
426
    @instance
427
    def ram():
428
        while 1:
429
            yield clock.posedge
430
            if dmem_ena_out:
431
                dmem_ena_in.next = False
432
                addr = int(dmem_addr_out)
433
                aligned_addr = (dmem_addr_out/4*4)
434
                if (dmem_sel_out == 0b1000 or
435
                    dmem_sel_out == 0b0100 or
436
                    dmem_sel_out == 0b0010 or
437
                    dmem_sel_out == 0b0001):
438
                    size = 1
439
                elif (dmem_sel_out == 0b1100 or
440
                      dmem_sel_out == 0b0011) and addr%2==0:
441
                    size = 2
442
                elif dmem_sel_out == 0b1111 and addr%4==0:
443
                    size = 4
444
                else:
445
                    assert False
446
 
447
                if dmem_we_out:
448
                    if size==1:
449
                        if addr == 0xffffffc0:
450
                            print chr(dmem_data_out%256),
451
                        else:
452
                            dmem[addr] = dmem_data_out%256
453
                    elif size==2:
454
                        dmem[addr] = (dmem_data_out>>8)%256
455
                        dmem[addr+1] = dmem_data_out%256
456
                    else:
457
                        dmem[addr] = (dmem_data_out>>24)%256
458
                        dmem[addr+1] = (dmem_data_out>>16)%256
459
                        dmem[addr+2] = (dmem_data_out>>8)%256
460
                        dmem[addr+3] = (dmem_data_out>>0)%256
461
                    #dmem[dmem_addr_out/4].next = dmem_data_out
462
                    #print 'write addr=0x%08x data=0x%08x' % (dmem_addr_out, dmem_data_out)
463
                else:
464
                    dmem_data_in.next = (
465
                                             ((dmem[aligned_addr]%256)<<24)
466
                                            +((dmem[aligned_addr+1]%256)<<16)
467
                                            +((dmem[aligned_addr+2]%256)<<8)
468
                                            +(dmem[aligned_addr+3]%256)
469
                                        )
470
                #yield clock.posedge
471
                yield clock.posedge
472
            dmem_ena_in.next = True
473
 
474
    @instance
475
    def stimulus():
476
        reset.next = True
477
        yield delay(33)
478
        reset.next = False
479
        dmem_ena_in.next = True
480
        yield reset.negedge
481
        #for i in range(len(imem)):
482
        while 1:
483
            iaddr = int(imem_addr_out)
484
            if iaddr >= len(imem):
485
                break
486
            word = (((imem[iaddr]%256)<<24)
487
                   +((imem[iaddr+1]%256)<<16)
488
                   +((imem[iaddr+2]%256)<<8)
489
                   +(imem[iaddr+3]%256))
490
            #print 'imem addr:=0x%x code:=0x%08x' % (iaddr, word)
491
            #print '<dissemble> %s' % code.get(iaddr)
492
            imem_data_in.next = word
493
            yield clock.negedge
494
 
495
        for i in range(8):
496
            #print 'cycle %d: imem addr:=0x%x code:=NOP' % (i+len(imem),
497
                                                         #imem_addr_out)
498
            imem_data_in.next = 0
499
            yield clock.negedge
500
        StopSimulation()
501
        assert False # map(int, dmem[:4]
502
    return instances()
503
 
504
if __name__ == '__main__':
505
  if 0:
506
    clock = Signal(False)
507
    reset = Signal(False)
508
 
509
    dmem_ena_in = Signal(False)
510
    dmem_data_in = Signal(intbv(0)[CFG_DMEM_WIDTH:])
511
    dmem_data_out = Signal(intbv(0)[CFG_DMEM_WIDTH:])
512
    dmem_sel_out = Signal(intbv(0)[4:])
513
    dmem_we_out = Signal(False)
514
    dmem_addr_out = Signal(intbv(0)[CFG_DMEM_SIZE:])
515
    dmem_ena_out = Signal(False)
516
    imem_data_in = Signal(intbv(0)[CFG_IMEM_WIDTH:])
517
    imem_addr_out = Signal(intbv(0)[CFG_IMEM_SIZE:])
518
    imem_ena_out = Signal(False)
519
 
520
    kw = dict(
521
        clock=clock,
522
        reset=reset,
523
        dmem_ena_in=dmem_ena_in,
524
 
525
        dmem_data_in=dmem_data_in,
526
        dmem_data_out=dmem_data_out,
527
        dmem_sel_out=dmem_sel_out,
528
        dmem_we_out=dmem_we_out,
529
        dmem_addr_out=dmem_addr_out,
530
        dmem_ena_out=dmem_ena_out,
531
        imem_data_in=imem_data_in,
532
        imem_addr_out=imem_addr_out,
533
        imem_ena_out=imem_ena_out,
534
    )
535 6 rockee
    toVHDL(MyBlazeCore, **kw)
536
    toVerilog(MyBlazeCore, **kw)
537 2 rockee
  else:
538
    tb = bench()
539
    #tb = traceSignals(bench)
540
    Simulation(tb).run(2000000)
541
 
542
### EOF ###
543
# vim:smarttab:sts=4:ts=4:sw=4:et:ai:tw=80:
544
 

powered by: WebSVN 2.1.0

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