66from functools import reduce
77
88# the next line can be removed after installation
9- sys .path .insert (0 , os .path .dirname (os .path .dirname (os .path .dirname (os .path .abspath (__file__ )))))
9+ sys .path .insert (0 , os .path .dirname (os .path .dirname (
10+ os .path .dirname (os .path .abspath (__file__ )))))
1011
1112from veriloggen import *
1213import veriloggen .dataflow as dataflow
1314import veriloggen .types .ram as ram
1415import veriloggen .types .fixed as fixed
1516
17+
1618def stencil (coe , data ):
17- data = map (lambda x ,y : x * y , data , coe )
18- rslt = reduce (lambda x ,y : x + y , data )
19+ data = map (lambda x , y : x * y , data , coe )
20+ rslt = reduce (lambda x , y : x + y , data )
1921 return rslt
20-
22+
23+
2124def mkStencilPipeline2D (coe = None , size = 3 , width = 32 , point = 16 ):
2225 # size-port stream inputs
23- iports = [ dataflow .Variable ('idata%d' % i , valid = 'ivalid%d' % i ,
24- width = width , point = point , signed = True )
25- for i in range (size ) ]
26+ iports = [dataflow .Variable ('idata%d' % i , valid = 'ivalid%d' % i ,
27+ width = width , point = point , signed = True )
28+ for i in range (size )]
2629
2730 if coe is None :
28- coe = [ [ dataflow .Constant (1.0 / (1.0 * size * size ), point = point ) for i in range (size ) ]
29- for j in range (size ) ]
30-
31+ coe = [[ dataflow .Constant (1.0 / (1.0 * size * size ), point = point ) for i in range (size )]
32+ for j in range (size )]
33+
3134 # source data
32- data = [ [ d .prev (j ) for j in range (size ) ] for d in iports ]
33-
35+ data = [[ d .prev (j ) for j in range (size )] for d in iports ]
36+
3437 # from 2D list to 1D list
3538 data_list = []
3639 coe_list = []
@@ -40,19 +43,20 @@ def mkStencilPipeline2D(coe=None, size=3, width=32, point=16):
4043
4144 # computation by calling standard method
4245 rslt = stencil (coe_list , data_list )
43-
46+
4447 rslt .output ('odata' , valid = 'ovalid' )
45-
48+
4649 df = dataflow .Dataflow (rslt )
4750 m = df .to_module ('stencil_pipeline_2d' )
4851
49- #try:
52+ # try:
5053 # df.draw_graph()
51- #except:
54+ # except:
5255 # print('Dataflow graph could not be generated.', file=sys.stderr)
5356
5457 return m
5558
59+
5660def mkStencil (n = 16 , size = 3 , datawidth = 32 , point = 16 , coe_test = False ):
5761 m = Module ('stencil' )
5862
@@ -63,23 +67,23 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
6367
6468 start = m .Input ('start' )
6569 busy = m .OutputReg ('busy' , initval = 0 )
66-
70+
6771 done = m .TmpReg (initval = 0 )
6872
6973 # external RAM I/F
70- ext_src_rams = [ ram .RAMSlaveInterface (m , 'ext_src_ram%d' % i ,
71- datawidth = datawidth , addrwidth = addrwidth )
72- for i in range (size ) ]
74+ ext_src_rams = [ram .RAMSlaveInterface (m , 'ext_src_ram%d' % i ,
75+ datawidth = datawidth , addrwidth = addrwidth )
76+ for i in range (size )]
7377 ext_dst_ram = ram .RAMSlaveInterface (m , 'ext_dst_ram' ,
7478 datawidth = datawidth , addrwidth = addrwidth )
75-
79+
7680 # RAM
7781 addrwidth = int (math .log (n , 2 )) * 2
78-
79- src_rams = [ ram .SyncRAMManager (m , 'src_ram%d' % i , clk , rst ,
80- datawidth = datawidth , addrwidth = addrwidth , numports = 2 )
81- for i in range (size ) ]
82-
82+
83+ src_rams = [ram .SyncRAMManager (m , 'src_ram%d' % i , clk , rst ,
84+ datawidth = datawidth , addrwidth = addrwidth , numports = 2 )
85+ for i in range (size )]
86+
8387 dst_ram = ram .SyncRAMManager (m , 'dst_ram' , clk , rst ,
8488 datawidth = datawidth , addrwidth = addrwidth , numports = 2 )
8589
@@ -94,7 +98,6 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
9498 read_count = m .Reg ('read_count' , 32 , initval = 0 )
9599 read_addr = m .Reg ('read_addr' , 32 , initval = 0 )
96100
97-
98101 read_fsm (
99102 read_addr (0 ),
100103 read_count (0 ),
@@ -111,7 +114,7 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
111114 read_addr .inc (),
112115 read_count .inc ()
113116 )
114-
117+
115118 idata = []
116119 ivalid = []
117120 for i , src_ram in enumerate (src_rams ):
@@ -135,33 +138,32 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
135138
136139 read_fsm .make_always ()
137140
138-
139141 # instance
140142 odata = m .Wire ('odata' , datawidth )
141143 ovalid = m .Wire ('ovalid' )
142-
144+
143145 ports = []
144- ports .append ( ('CLK' , clk ) )
145- ports .append ( ('RST' , rst ) )
146-
146+ ports .append (('CLK' , clk ))
147+ ports .append (('RST' , rst ))
148+
147149 for i , (d , v ) in enumerate (zip (idata , ivalid )):
148- ports .append ( ('idata%d' % i , d ) )
149- ports .append ( ('ivalid%d' % i , v ) )
150+ ports .append (('idata%d' % i , d ))
151+ ports .append (('ivalid%d' % i , v ))
150152
151- ports .append ( ('odata' , odata ) )
152- ports .append ( ('ovalid' , ovalid ) )
153+ ports .append (('odata' , odata ))
154+ ports .append (('ovalid' , ovalid ))
153155
154156 coe = None
155157 if coe_test :
156- coe = [ [ dataflow .Constant (1 , point = point ) for i in range (size ) ]
157- for j in range (size ) ]
158+ coe = [[ dataflow .Constant (1 , point = point ) for i in range (size )]
159+ for j in range (size )]
158160 point = 0
159-
161+
160162 st = mkStencilPipeline2D (size = 3 , width = datawidth , point = point , coe = coe )
161163 m .Instance (st , 'inst_stencil' , ports = ports )
162164
163- skip_offset = int (math .floor (size / 2 ))
164-
165+ skip_offset = int (math .floor (size / 2 ))
166+
165167 # write FSM
166168 write_fsm = FSM (m , 'write_fsm' , clk , rst )
167169 write_count = m .Reg ('write_count' , 32 , initval = 0 )
@@ -170,17 +172,17 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
170172 write_fsm (
171173 done (0 )
172174 )
173-
175+
174176 write_fsm .If (Ands (ovalid , write_count > skip_offset ))(
175177 write_addr .inc ()
176178 )
177-
179+
178180 dst_ram .write (0 , write_addr , odata , write_fsm .then )
179-
181+
180182 write_fsm .If (ovalid )(
181183 write_count .inc (),
182184 )
183-
185+
184186 write_fsm .If (write_count == n )(
185187 write_count (0 ),
186188 write_addr (skip_offset ),
@@ -192,10 +194,11 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
192194
193195 return m
194196
197+
195198def mkTest (n = 16 , size = 3 , datawidth = 32 , point = 16 , coe_test = False ):
196199 if coe_test :
197200 point = 0
198-
201+
199202 m = Module ('test' )
200203
201204 addrwidth = int (math .log (n , 2 ))
@@ -204,23 +207,22 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
204207
205208 params = m .copy_params (main )
206209 ports = m .copy_sim_ports (main )
207-
210+
208211 clk = ports ['CLK' ]
209212 rst = ports ['RST' ]
210213
211214 start = ports ['start' ]
212215 busy = ports ['busy' ]
213-
216+
214217 uut = m .Instance (main , 'uut' ,
215218 params = m .connect_params (main ),
216219 ports = m .connect_ports (main ))
217220
218221 reset_done = m .Reg ('reset_done' , initval = 0 )
219222 reset_stmt = []
220- reset_stmt .append ( reset_done (0 ) )
221- reset_stmt .append ( start (0 ) )
223+ reset_stmt .append (reset_done (0 ))
224+ reset_stmt .append (start (0 ))
222225
223-
224226 # src RAM
225227 for i in range (3 ):
226228 addr = ports ['ext_src_ram%d_addr' % i ]
@@ -239,7 +241,6 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
239241 reset_stmt .append (addr (2 ))
240242 reset_stmt .append (wdata (0 ))
241243 reset_stmt .append (wenable (0 ))
242-
243244
244245 simulation .setup_waveform (m , uut )
245246 simulation .setup_clock (m , clk , hperiod = 5 )
@@ -256,12 +257,12 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
256257 )
257258
258259 fsm = FSM (m , 'fsm' , clk , rst )
259-
260+
260261 fsm .goto_next (cond = reset_done )
261262
262263 for i in range (3 ):
263264 addr = ports ['ext_src_ram%d_addr' % i ]
264- fsm .add ( addr (- 1 ) )
265+ fsm .add (addr (- 1 ))
265266
266267 fsm .goto_next ()
267268
@@ -270,25 +271,26 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
270271 rdata = ports ['ext_src_ram%d_rdata' % i ]
271272 wdata = ports ['ext_src_ram%d_wdata' % i ]
272273 wenable = ports ['ext_src_ram%d_wenable' % i ]
273- next_addr = (addr + 1 ) % (n * n )
274- fsm .add ( addr .inc () )
275- fsm .add ( wdata (fixed .FixedConst (90 , point )) )
276- fsm .add ( wenable (1 ) )
277- fsm .add ( wenable (0 ), cond = AndList (wenable , addr == 2 ** addrwidth - 1 ) )
278-
279- fsm .goto_next (cond = AndList (wenable , ports ['ext_src_ram0_addr' ]== 2 ** addrwidth - 1 ))
280-
274+ next_addr = (addr + 1 ) % (n * n )
275+ fsm .add (addr .inc ())
276+ fsm .add (wdata (fixed .FixedConst (90 , point ).raw ))
277+ fsm .add (wenable (1 ))
278+ fsm .add (wenable (0 ), cond = AndList (wenable , addr == 2 ** addrwidth - 1 ))
279+
280+ fsm .goto_next (cond = AndList (
281+ wenable , ports ['ext_src_ram0_addr' ] == 2 ** addrwidth - 1 ))
282+
281283 fsm .goto_next (cond = Not (busy ))
282-
283- fsm .add ( start (1 ) )
284- fsm .add ( start (0 ), delay = 1 )
284+
285+ fsm .add (start (1 ))
286+ fsm .add (start (0 ), delay = 1 )
285287 fsm .goto_next ()
286-
288+
287289 fsm .goto_next (cond = busy )
288290
289291 fsm .goto_next (cond = Not (busy ))
290292
291- fsm .add ( Systask ('finish' ) )
293+ fsm .add (Systask ('finish' ))
292294
293295 fsm .make_always ()
294296
@@ -299,7 +301,7 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
299301 #test = mkTest(n, coe_test=True)
300302 test = mkTest (n )
301303 verilog = test .to_verilog ('tmp.v' )
302- #print(verilog)
304+ # print(verilog)
303305
304306 # run simulator (Icarus Verilog)
305307 sim = simulation .Simulator (test )
0 commit comments