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

Subversion Repositories myblaze

[/] [myblaze/] [trunk/] [rtl/] [bram.py] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rockee
# -*- coding: utf-8 -*-
2
"""
3
    bram.py
4
    =======
5
 
6
    Block RAM
7
 
8
    :copyright: Copyright (c) 2010 Jian Luo.
9
    :author-email: jian <dot> luo <dot> cn <at> gmail <dot> com.
10
    :license: BSD, see LICENSE for details.
11
    :revision: $Id: bram.py 3 2010-11-21 07:17:00Z rockee $
12
"""
13
 
14
from myhdl import *
15
from defines import *
16
from functions import *
17
from debug import *
18
 
19
def BRAMInitial(ram, filename, clock):
20
    __verilog__ = """
21
    initial $readmemh("%(filename)s", %(ram)s);
22
    """
23
    __vhdl__ = """
24
    """
25
    @instance
26
    def initial():
27
        vals = open(filename).readlines()
28
        for i,v in enumerate(vals):
29
            ram[i].next = int(v, 16)
30
        yield clock.negedge
31
    return instances()
32
 
33
# XXX: Hacked to make $readmemh work
34
class RAM(list):
35
    # representation 
36
    def __str__(self):
37
        from myhdl._extractHierarchy import _memInfoMap
38
        if id(self) in _memInfoMap:
39
            return _memInfoMap[id(self)].name
40
        else:
41
            return list.__str__(self)
42
 
43
def BRAM(
44
        data_out,
45
        data_in,
46
        address,
47
        write,
48
        enable,
49
        clock,
50
        width=8,
51
        size=16,
52
        filename='',
53
        ):
54
    """
55
    Single Port Synchronous RAM with Old Data Read-During-Write Behavior
56
    """
57
    max = 2**size
58
    ram = RAM(Signal(intbv(0)[width:]) for i in range(max))
59
    #read_addr = Signal(intbv(0)[len(address):])
60
    if filename:
61
        init = BRAMInitial(ram, filename, clock)
62
 
63
    @always(clock.posedge)
64
    def logic():
65
        if enable:
66
            if write:
67
                ram[int(address)].next = data_in
68
            data_out.next = ram[int(address)%max]
69
            #read_addr.next = address
70
    #@always_comb
71
    #def output():
72
        #data_out.next = ram[int(read_addr)]
73
 
74
    return instances()
75
 
76
def BankedBRAM(
77
        data_out,
78
        data_in,
79
        address,
80
        write,
81
        enable,
82
        clock,
83
        width=32,
84
        bank_size=2,
85
        size=16,
86
        to_verilog=False,
87
        filename_pattern='',
88
        ):
89
    # XXX: Verilog just don't allow dynamic register slicing
90
    # have to fix ram shape to 4x8bit
91
    if to_verilog:
92
        width=32
93
        bank_size=2
94
    bank_count = 2 ** bank_size
95
    bank_width = width/bank_count
96
    bank_in = [Signal(intbv(0)[bank_width:]) for i in range(bank_count)]
97
    bank_out = [Signal(intbv(0)[bank_width:]) for i in range(bank_count)]
98
    bank_wre = [Signal(False) for i in range(bank_count)]
99
    bank_addr = Signal(intbv(0)[len(address)-bank_size:])
100
    if filename_pattern:
101
        bank = [BRAM(data_out=bank_out[i], data_in=bank_in[i],
102
                     address=bank_addr, write=bank_wre[i],
103
                     enable=enable, clock=clock,
104
                     width=bank_width, size=size-bank_size,
105
                     filename=filename_pattern%i)
106
 
107
                    for i in range(bank_count)]
108
    else:
109
        bank = [BRAM(data_out=bank_out[i], data_in=bank_in[i],
110
                     address=bank_addr, write=bank_wre[i],
111
                     enable=enable, clock=clock,
112
                     width=bank_width, size=size-bank_size,)
113
 
114
                    for i in range(bank_count)]
115
 
116
 
117
    #@always(clock.posedge)
118
    #def debug():
119
        #if enable and address==0x17f4:
120
            #print 'XXXXXX 17f4',
121
            #if write:
122
                #print 'WRITE %x' % int(data_in)
123
            #else:
124
                #print 'READ %x' % int(data_out)
125
 
126
    #if to_verilog:
127
    if 1:
128
        @always_comb
129
        def dumbass_reassemble():
130
            bank_addr.next = address[:bank_size]
131
            for i in range(bank_count):
132
                bank_wre[i].next = write[i]
133
            #bank_in[3].next = data_in[8:]
134
            #bank_in[2].next = data_in[16:8]
135
            #bank_in[1].next = data_in[24:16]
136
            #bank_in[0].next = data_in[32:24]
137
            #data_out.next = concat(bank_out[0], bank_out[1],
138
                                   #bank_out[2], bank_out[3])
139
            bank_in[0].next = data_in[8:]
140
            bank_in[1].next = data_in[16:8]
141
            bank_in[2].next = data_in[24:16]
142
            bank_in[3].next = data_in[32:24]
143
            data_out.next = concat(bank_out[3], bank_out[2],
144
                                   bank_out[1], bank_out[0])
145
 
146
    #else:
147
        #@always_comb
148
        #def reassemble():
149
            #bank_addr.next = address[:bank_size]
150
            #tmp = intbv(0)[width:]
151
            #tmp_low = intbv(0)[width-bank_width:]
152
            #for i in range(bank_count):
153
                #bank_wre[i].next = write[i]
154
                #bank_in[i].next = data_in[(i+1)*bank_width:i*bank_width]
155
                #tmp_low[:] = tmp[:bank_width]
156
                #tmp[:] = concat(bank_out[i], tmp_low)
157
            #data_out.next = tmp
158
 
159
    return instances()
160
 
161
if __name__ == '__main__':
162
    data_out = Signal(intbv(0)[32:])
163
    data_in = Signal(intbv(0)[32:])
164
    address = Signal(intbv(0)[16:])
165
    write = Signal(intbv(0)[4:])
166
    bram_write = Signal(False)
167
    clock = Signal(False)
168
    enable = Signal(False)
169
    bram_kw = dict(
170
        func=BRAM,
171
        data_out=data_out,
172
        data_in=data_in,
173
        address=address,
174
        write=bram_write,
175
        enable=enable,
176
        clock=clock,
177
        width=32,
178
        size=8,
179
        filename='rom.vmem',
180
    )
181
    kw = dict(
182
        func=BankedBRAM,
183
        data_out=data_out,
184
        data_in=data_in,
185
        address=address,
186
        write=write,
187
        enable=enable,
188
        clock=clock,
189
        width=32,
190
        bank_size=2,
191
        size=8,
192
        filename='rom.vmem',
193
    )
194
    toVerilog(to_verilog=True, **kw)
195
    toVerilog(**bram_kw)
196
    toVHDL(**kw)
197
 
198
### EOF ###
199
# vim:smarttab:sts=4:ts=4:sw=4:et:ai:tw=80:
200
 

powered by: WebSVN 2.1.0

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