|
1 | 1 | import sys |
2 | 2 | import os |
| 3 | +import collections |
| 4 | + |
3 | 5 | from veriloggen import * |
4 | 6 |
|
5 | | -def mkBramInterface(m, addrwidth, datawidth): |
6 | | - addr = m.Input('addr', addrwidth) |
7 | | - datain = m.Input('datain', datawidth) |
8 | | - write = m.Input('write') |
9 | | - dataout = m.Output('dataout', datawidth) |
10 | | - return addr, datain, write, dataout |
11 | | - |
12 | | -def mkBramUser(m, name, addrwidth, datawidth): |
13 | | - addr = m.Reg(name + 'addr', addrwidth) |
14 | | - datain = m.Reg(name + 'datain', datawidth) |
15 | | - write = m.Reg(name + 'write') |
16 | | - dataout = m.Wire(name + 'dataout', datawidth) |
17 | | - return addr, datain, write, dataout |
| 7 | +class BramInterface(Interface): |
| 8 | + def __init__(self, m, prefix, postfix, addrwidth, datawidth, io=False): |
| 9 | + Interface.__init__(self, m, prefix, postfix, io) |
| 10 | + |
| 11 | + self.addrwidth = self.Parameter('ADDR_WIDTH', addrwidth) |
| 12 | + self.datawidth = self.Parameter('DATA_WIDTH', datawidth) |
| 13 | + |
| 14 | + In = self.Input if self.io else self.Reg # self.Wire |
| 15 | + Out = self.Output if self.io else self.Wire |
| 16 | + |
| 17 | + self.addr = In('addr', addrwidth) |
| 18 | + self.datain = In('datain', datawidth) |
| 19 | + self.write = In('write') |
| 20 | + self.dataout = Out('dataout', datawidth) |
18 | 21 |
|
19 | 22 | def mkBram(name): |
20 | | - m = Module(name + '_bram') |
| 23 | + m = Module(name + 'bram') |
| 24 | + |
21 | 25 | addrwidth = m.Parameter('ADDR_WIDTH', 10) |
22 | 26 | datawidth = m.Parameter('DATA_WIDTH', 32) |
| 27 | + |
23 | 28 | clk = m.Input('CLK') |
24 | | - addr, datain, write, dataout = mkBramInterface(m, addrwidth, datawidth) |
25 | | - d_addr = m.Reg('d_' + addr.name, datawidth) |
26 | | - mem = m.Reg('mem', datawidth, addrwidth) |
| 29 | + bramif = BramInterface(m, '', '', addrwidth, datawidth, io=True) |
| 30 | + |
| 31 | + d_addr = m.Reg('d_' + bramif.addr.name, datawidth) |
| 32 | + mem = m.Reg('mem', datawidth, Int(2)**addrwidth) |
27 | 33 |
|
28 | 34 | m.Always(Posedge(clk))( |
29 | | - If(write)( mem[addr](datain) ), |
30 | | - d_addr(addr) |
| 35 | + If(bramif.write)( mem[bramif.addr](bramif.datain) ), |
| 36 | + d_addr(bramif.addr) |
31 | 37 | ) |
32 | | - m.Assign(dataout(mem[d_addr])) |
33 | | - |
| 38 | + |
| 39 | + m.Assign(bramif.dataout(mem[d_addr])) |
| 40 | + |
34 | 41 | return m |
35 | 42 |
|
36 | | -def mkUser(bram): |
| 43 | +def mkTop(): |
37 | 44 | m = Module('TOP') |
38 | 45 | addrwidth = m.Parameter('ADDR_WIDTH', 10) |
39 | 46 | datawidth = m.Parameter('DATA_WIDTH', 32) |
40 | 47 | clk = m.Input('CLK') |
41 | 48 | rst = m.Input('RST') |
42 | | - addr, datain, write, dataout = mkBramUser(m, 'my_', addrwidth, datawidth) |
| 49 | + bramif = BramInterface(m, 'bram_', '', addrwidth, datawidth) |
| 50 | + |
| 51 | + params = collections.OrderedDict() |
| 52 | + params.update(bramif.connectAllParameters()) |
43 | 53 |
|
44 | | - params = ('ADDR_WIDTH', addrwidth), ('DATA_WIDTH', datawidth) |
45 | | - ports = ('CLK', clk), ('addr', addr), ('datain', datain), ('write', write), ('dataout', dataout) |
| 54 | + ports = collections.OrderedDict() |
| 55 | + ports.update(clk.connect()) |
| 56 | + ports.update(bramif.connectAllPorts()) |
| 57 | + |
46 | 58 | m.Instance(bram, 'inst_bram', params, ports) |
47 | 59 |
|
48 | | - state = m.Reg('state', 32) |
49 | | - |
50 | | - label = [] |
51 | | - label.append(m.Localparam('INIT' + str(len(label)), len(label))) |
52 | | - |
53 | | - def cond(name='label'): |
54 | | - ret = state == label[-1] |
55 | | - label.append(m.Localparam(name + str(len(label)), len(label))) |
56 | | - return ret |
57 | | - |
58 | | - def goto_next(): |
59 | | - return state( state + 1 ) |
60 | | - |
| 60 | + fsm = lib.FSM(m, 'fsm') |
61 | 61 | m.Always(Posedge(clk))( |
62 | 62 | If(rst)( |
63 | | - addr(0), datain(0), write(0), state(0) |
| 63 | + bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next(0) |
64 | 64 | ).els( |
65 | | - If(cond())( addr(0), datain(0), write(0), goto_next() ), |
66 | | - If(cond())( write(1), datain(datain + 4), goto_next() ), |
67 | | - If(cond())( write(0), goto_next() ), |
68 | | - If(cond())( |
69 | | - If(addr == 128)( |
70 | | - addr(0), state(label[0]) |
| 65 | + fsm( bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next() ), |
| 66 | + fsm( bramif.datain(bramif.datain + 4), fsm.next() ), |
| 67 | + fsm( bramif.write(0), fsm.next() ), |
| 68 | + fsm( |
| 69 | + If(bramif.addr == 128)( |
| 70 | + bramif.addr(0), fsm.next(0) |
71 | 71 | ).els( |
72 | | - addr(addr + 1), state(label[1]) |
73 | | - ) |
74 | | - ))) |
| 72 | + bramif.addr(bramif.addr + 1), fsm.next(1) |
| 73 | + )) |
| 74 | + )) |
75 | 75 |
|
76 | 76 | return m |
77 | 77 |
|
78 | 78 | #------------------------------------------------------------------------------- |
79 | | -bram = mkBram('my') |
80 | | -user = mkUser(bram) |
81 | | -verilog = ''.join( (bram.toVerilog(), user.toVerilog()) ) |
| 79 | +bram = mkBram('my_') |
| 80 | +top = mkTop() |
| 81 | +verilog = ''.join( (bram.toVerilog(), top.toVerilog()) ) |
82 | 82 | print(verilog) |
0 commit comments