Skip to content

Commit de80cb3

Browse files
committed
Subclass of 'Submodule' is introduced
1 parent 0f4802b commit de80cb3

File tree

1 file changed

+126
-110
lines changed

1 file changed

+126
-110
lines changed

examples/thread_uart_nexys4/thread_uart_nexys4.py

Lines changed: 126 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -12,95 +12,45 @@
1212
import veriloggen.thread as vthread
1313

1414

15-
def mkTop(clk_name='clk', rst_name='btnCpuReset'):
16-
m = Module('top')
17-
clk = m.Input(clk_name)
18-
rst = m.Input(rst_name)
19-
RsRx = m.Input('RsRx')
20-
RsTx = m.Output('RsTx')
21-
RsCts = m.Output('RsCts')
22-
RsRts = m.Input('RsRts')
23-
RsCts.assign(0)
15+
class UartTx(Submodule):
16+
__intrinsics__ = ('send', )
2417

25-
new_clk = m.Wire('new_CLK')
26-
new_clk.assign(clk)
18+
def __init__(self, m, name, prefix, clk, rst, txd=None,
19+
arg_params=None, arg_ports=None,
20+
as_io=None, as_wire=None,
21+
baudrate=19200, clockfreq=100 * 1000 * 1000):
2722

28-
rstbuf = m.Reg('RST_X')
29-
new_rst = m.Reg('RST')
30-
m.Always(Posedge(clk))(
31-
rstbuf(rst),
32-
new_rst(Not(rstbuf))
33-
)
23+
if arg_ports is None:
24+
arg_ports = []
3425

35-
blinkled = mkLed()
26+
arg_ports.insert(0, ('CLK', clk))
27+
arg_ports.insert(1, ('RST', rst))
3628

37-
ports = []
38-
ports.append(('CLK', new_clk))
39-
ports.append(('RST', new_rst))
40-
ports.append(('utx', RsTx))
41-
ports.append(('urx', RsRx))
42-
sub = Submodule(m, blinkled, name='inst_' + blinkled.name,
43-
arg_ports=ports,
44-
as_io=('sw', 'led'), as_wire=('utx', 'urx'))
29+
if txd is not None:
30+
arg_ports.insert(2, ('txd', txd))
4531

46-
return m
32+
moddef = mkUartTx(baudrate, clockfreq)
4733

34+
Submodule.__init__(self, m, moddef, name, prefix,
35+
arg_params=arg_params, arg_ports=arg_ports,
36+
as_io=as_io, as_wire=as_wire)
4837

49-
def mkLed(baudrate=19200, clockfreq=100 * 1000 * 1000):
50-
m = Module('blinkled')
51-
clk = m.Input('CLK')
52-
rst = m.Input('RST')
53-
sw = m.Input('sw', 16)
54-
led = m.OutputReg('led', 16, initval=0)
38+
self.tx_din = self['din']
39+
self.tx_enable = self['enable']
40+
self.tx_enable.initval = 0
41+
self.tx_ready = self['ready']
5542

56-
tx = m.Output('utx')
57-
rx = m.Input('urx')
58-
59-
uart_tx = Submodule(m, mkUartTx(baudrate, clockfreq), 'inst_tx', 'tx_',
60-
arg_ports=(('CLK', clk), ('RST', rst), ('txd', tx)))
61-
uart_rx = Submodule(m, mkUartRx(baudrate, clockfreq), 'inst_rx', 'rx_',
62-
arg_ports=(('CLK', clk), ('RST', rst), ('rxd', rx)))
63-
64-
tx_din = uart_tx['din']
65-
tx_enable = uart_tx['enable']
66-
tx_enable.initval = 0
67-
tx_ready = uart_tx['ready']
68-
69-
rx_dout = uart_rx['dout']
70-
rx_valid = uart_rx['valid']
71-
72-
def send(fsm, value):
43+
def send(self, fsm, value):
7344
fsm(
74-
tx_din(value),
75-
tx_enable(1)
45+
self.tx_din(value),
46+
self.tx_enable(1)
7647
)
7748
fsm.goto_next()
7849
fsm(
79-
tx_enable(0)
50+
self.tx_enable(0)
8051
)
8152
fsm.goto_next()
82-
fsm.If(tx_ready).goto_next()
83-
84-
def recv(fsm):
85-
ret = fsm.m.TmpReg(rx_dout.width)
86-
fsm.If(rx_valid)(
87-
ret(rx_dout)
88-
)
89-
fsm.Then().goto_next()
90-
return ret
91-
92-
def blink():
93-
while True:
94-
c = recv()
95-
data = c + sw
96-
led.value = data
97-
send(data)
98-
99-
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
100-
th.add_intrinsics(send, recv)
101-
fsm = th.start()
102-
103-
return m
53+
fsm.If(self.tx_ready).goto_next()
10454

10555

10656
def mkUartTx(baudrate=19200, clockfreq=100 * 1000 * 1000):
@@ -153,6 +103,40 @@ def mkUartTx(baudrate=19200, clockfreq=100 * 1000 * 1000):
153103
return m
154104

155105

106+
class UartRx(Submodule):
107+
__intrinsics__ = ('recv', )
108+
109+
def __init__(self, m, name, prefix, clk, rst, rxd=None,
110+
arg_params=None, arg_ports=None,
111+
as_io=None, as_wire=None,
112+
baudrate=19200, clockfreq=100 * 1000 * 1000):
113+
114+
if arg_ports is None:
115+
arg_ports = []
116+
117+
arg_ports.insert(0, ('CLK', clk))
118+
arg_ports.insert(1, ('RST', rst))
119+
120+
if rxd is not None:
121+
arg_ports.insert(2, ('rxd', rxd))
122+
123+
moddef = mkUartRx(baudrate, clockfreq)
124+
Submodule.__init__(self, m, moddef, name, prefix,
125+
arg_params=arg_params, arg_ports=arg_ports,
126+
as_io=as_io, as_wire=as_wire)
127+
128+
self.rx_dout = self['dout']
129+
self.rx_valid = self['valid']
130+
131+
def recv(self, fsm):
132+
ret = fsm.m.TmpReg(self.rx_dout.width)
133+
fsm.If(self.rx_valid)(
134+
ret(self.rx_dout)
135+
)
136+
fsm.Then().goto_next()
137+
return ret
138+
139+
156140
def mkUartRx(baudrate=19200, clockfreq=100 * 1000 * 1000):
157141
m = Module("UartRx")
158142
waitnum = int(clockfreq / baudrate)
@@ -201,6 +185,66 @@ def mkUartRx(baudrate=19200, clockfreq=100 * 1000 * 1000):
201185
return m
202186

203187

188+
def mkTop(clk_name='clk', rst_name='btnCpuReset'):
189+
m = Module('top')
190+
clk = m.Input(clk_name)
191+
rst = m.Input(rst_name)
192+
RsRx = m.Input('RsRx')
193+
RsTx = m.Output('RsTx')
194+
RsCts = m.Output('RsCts')
195+
RsRts = m.Input('RsRts')
196+
RsCts.assign(0)
197+
198+
new_clk = m.Wire('new_CLK')
199+
new_clk.assign(clk)
200+
201+
rstbuf = m.Reg('RST_X')
202+
new_rst = m.Reg('RST')
203+
m.Always(Posedge(clk))(
204+
rstbuf(rst),
205+
new_rst(Not(rstbuf))
206+
)
207+
208+
blinkled = mkLed()
209+
210+
ports = []
211+
ports.append(('CLK', new_clk))
212+
ports.append(('RST', new_rst))
213+
ports.append(('utx', RsTx))
214+
ports.append(('urx', RsRx))
215+
sub = Submodule(m, blinkled, name='inst_' + blinkled.name,
216+
arg_ports=ports,
217+
as_io=('sw', 'led'), as_wire=('utx', 'urx'))
218+
219+
return m
220+
221+
222+
def mkLed(baudrate=19200, clockfreq=100 * 1000 * 1000):
223+
m = Module('blinkled')
224+
clk = m.Input('CLK')
225+
rst = m.Input('RST')
226+
sw = m.Input('sw', 16)
227+
led = m.OutputReg('led', 16, initval=0)
228+
tx = m.Output('utx')
229+
rx = m.Input('urx')
230+
uart_tx = UartTx(m, 'inst_tx', 'tx_', clk, rst, tx,
231+
baudrate=baudrate, clockfreq=clockfreq)
232+
uart_rx = UartRx(m, 'inst_rx', 'rx_', clk, rst, rx,
233+
baudrate=baudrate, clockfreq=clockfreq)
234+
235+
def blink():
236+
while True:
237+
c = uart_rx.recv()
238+
data = c + sw
239+
led.value = data
240+
uart_tx.send(data)
241+
242+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
243+
fsm = th.start()
244+
245+
return m
246+
247+
204248
def mkTest(baudrate=19200, clockfreq=19200 * 10):
205249
m = Module('test')
206250

@@ -214,23 +258,16 @@ def mkTest(baudrate=19200, clockfreq=19200 * 10):
214258
rx = uut['urx']
215259
sw = uut['sw']
216260

217-
uart_tx = Submodule(m, mkUartTx(baudrate, clockfreq), 'inst_tx', 'tx_',
218-
arg_ports=(('CLK', clk), ('RST', rst)), as_wire='txd')
219-
uart_rx = Submodule(m, mkUartRx(baudrate, clockfreq), 'inst_rx', 'rx_',
220-
arg_ports=(('CLK', clk), ('RST', rst)), as_wire='rxd')
261+
uart_tx = UartTx(m, 'inst_tx', 'tx_', clk, rst, as_wire='txd',
262+
baudrate=baudrate, clockfreq=clockfreq)
263+
uart_rx = UartRx(m, 'inst_rx', 'rx_', clk, rst, as_wire='rxd',
264+
baudrate=baudrate, clockfreq=clockfreq)
265+
221266
txd = uart_tx['txd']
222267
rxd = uart_rx['rxd']
223268
rx.assign(txd)
224269
rxd.assign(tx)
225270

226-
tx_din = uart_tx['din']
227-
tx_enable = uart_tx['enable']
228-
tx_enable.initval = 0
229-
tx_ready = uart_tx['ready']
230-
231-
rx_dout = uart_rx['dout']
232-
rx_valid = uart_rx['valid']
233-
234271
simulation.setup_waveform(m, uut, uart_tx, uart_rx)
235272
simulation.setup_clock(m, clk, hperiod=5)
236273
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
@@ -241,38 +278,17 @@ def mkTest(baudrate=19200, clockfreq=19200 * 10):
241278
Systask('finish')
242279
)
243280

244-
def send(fsm, value):
245-
fsm(
246-
tx_din(value),
247-
tx_enable(1)
248-
)
249-
fsm.goto_next()
250-
fsm(
251-
tx_enable(0)
252-
)
253-
fsm.goto_next()
254-
fsm.If(tx_ready).goto_next()
255-
256-
def recv(fsm):
257-
ret = fsm.m.TmpReg(rx_dout.width)
258-
fsm.If(rx_valid)(
259-
ret(rx_dout)
260-
)
261-
fsm.Then().goto_next()
262-
return ret
263-
264281
def test():
265282
for i in range(10):
266283
s = 100 + i
267-
send(s)
268-
r = recv()
284+
uart_tx.send(s)
285+
r = uart_rx.recv()
269286
if r == s + sw:
270287
print('OK: %d + %d == %d' % (s, sw, r))
271288
else:
272289
print('NG: %d + %d != %d' % (s, sw, r))
273290

274291
th = vthread.Thread(m, 'test', clk, rst, test)
275-
th.add_intrinsics(send, recv)
276292
th.start()
277293

278294
return m

0 commit comments

Comments
 (0)