1212import 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
10656def 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+
156140def 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+
204248def 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