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

Subversion Repositories myblaze

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

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

powered by: WebSVN 2.1.0

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