1010import veriloggen .dataflow as dataflow
1111import veriloggen .types .fixed as fixed
1212
13- #-------------------------------------------------------------------------------
13+ # -------------------------------------------------------------------------------
14+
15+
1416def complex_add (x , y ):
1517 a = x [0 ]
1618 b = x [1 ]
1719 c = y [0 ]
1820 d = y [1 ]
1921 return (a + c ), (b + d )
2022
23+
2124def complex_sub (x , y ):
2225 a = x [0 ]
2326 b = x [1 ]
2427 c = y [0 ]
2528 d = y [1 ]
2629 return (a - c ), (b - d )
2730
31+
2832def complex_mult (x , y ):
2933 a = x [0 ]
3034 b = x [1 ]
@@ -39,22 +43,25 @@ def complex_mult(x, y):
3943 im = ad + bc
4044 return re , im
4145
46+
4247def radix2 (x , y , c ):
4348 d0 = complex_add (x , y )
4449 d1 = complex_sub (x , y )
45- r0 = d0 # as-is
50+ r0 = d0 # as-is
4651 r1 = complex_mult (d1 , c )
4752 return r0 , r1
4853
49- #-------------------------------------------------------------------------------
54+ # -------------------------------------------------------------------------------
55+
56+
5057def fft4 (din ):
51- w = [ (1 , 0 ), (0 , - 1 ), (1 , 0 ), (1 , 0 ) ]
58+ w = [(1 , 0 ), (0 , - 1 ), (1 , 0 ), (1 , 0 )]
5259 a , b = radix2 (din [0 ], din [2 ], w [0 ])
5360 c , d = radix2 (din [1 ], din [3 ], w [1 ])
54-
61+
5562 rslt = []
56- rslt .extend ( radix2 (a , c , w [2 ]) )
57- rslt .extend ( radix2 (b , d , w [3 ]) )
63+ rslt .extend (radix2 (a , c , w [2 ]))
64+ rslt .extend (radix2 (b , d , w [3 ]))
5865
5966 # reorder by bit-inversed index
6067 ret = []
@@ -64,15 +71,17 @@ def fft4(din):
6471 index = int (fm .format (i )[::- 1 ], 2 )
6572 #print(i, '->', index)
6673 re , im = rslt [index ]
67- ret .append ( (re , im ) )
74+ ret .append ((re , im ))
6875
6976 return ret
7077
71- #-------------------------------------------------------------------------------
78+ # -------------------------------------------------------------------------------
79+
80+
7281def mkFFT4 (datawidth = 16 , point = 8 ):
73- din = [ (dataflow .Variable ('din' + str (i ) + 're' , width = datawidth , point = point , signed = True ),
74- dataflow .Variable ('din' + str (i ) + 'im' , width = datawidth , point = point , signed = True ))
75- for i in range (4 ) ]
82+ din = [(dataflow .Variable ('din' + str (i ) + 're' , width = datawidth , point = point , signed = True ),
83+ dataflow .Variable ('din' + str (i ) + 'im' , width = datawidth , point = point , signed = True ))
84+ for i in range (4 )]
7685
7786 # call software-defined method
7887 rslt = fft4 (din )
@@ -87,60 +96,63 @@ def mkFFT4(datawidth=16, point=8):
8796 df = dataflow .Dataflow (* vars )
8897 m = df .to_module ('fft4' )
8998
90- #try:
99+ # try:
91100 # df.draw_graph()
92- #except:
101+ # except:
93102 # print('Dataflow graph could not be generated.', file=sys.stderr)
94103
95104 return m
96105
97- #-------------------------------------------------------------------------------
106+ # -------------------------------------------------------------------------------
107+
108+
98109def mkTest (datawidth = 16 , point = 8 ):
99110 m = Module ('test' )
100111
101112 main = mkFFT4 (datawidth , point )
102-
113+
103114 params = m .copy_params (main )
104115 ports = m .copy_sim_ports (main )
105116
106117 clk = ports ['CLK' ]
107118 rst = ports ['RST' ]
108119
109- din = [ (ports ['din' + str (i ) + 're' ], ports ['din' + str (i ) + 'im' ]) for i in range (4 ) ]
110- dout = [ (ports ['dout' + str (i ) + 're' ], ports ['dout' + str (i ) + 'im' ]) for i in range (4 ) ]
120+ din = [(ports ['din' + str (i ) + 're' ], ports ['din' + str (i ) + 'im' ]) for i in range (4 )]
121+ dout = [(ports ['dout' + str (i ) + 're' ], ports ['dout' + str (i ) + 'im' ]) for i in range (4 )]
122+
123+ _din = [(m .WireLike (re , name = '_' + re .name , width = datawidth - point ),
124+ m .WireLike (im , name = '_' + im .name , width = datawidth - point ))
125+ for re , im in din ]
126+ _dout = [(m .WireLike (re , name = '_' + re .name , width = datawidth - point ),
127+ m .WireLike (im , name = '_' + im .name , width = datawidth - point ))
128+ for re , im in dout ]
111129
112- _din = [ (m .WireLike (re , name = '_' + re .name , width = datawidth - point ),
113- m .WireLike (im , name = '_' + im .name , width = datawidth - point ))
114- for re , im in din ]
115- _dout = [ (m .WireLike (re , name = '_' + re .name , width = datawidth - point ),
116- m .WireLike (im , name = '_' + im .name , width = datawidth - point ))
117- for re , im in dout ]
118-
119130 for (lre , lim ), (rre , rim ) in zip (_din , din ):
120- m .Assign ( lre (fixed .fixed_to_int (rre , point )) )
121- m .Assign ( lim (fixed .fixed_to_int (rim , point )) )
122-
131+ m .Assign (lre (fixed .fixed_to_int (rre , point )))
132+ m .Assign (lim (fixed .fixed_to_int (rim , point )))
133+
123134 for (lre , lim ), (rre , rim ) in zip (_dout , dout ):
124- m .Assign ( lre (fixed .fixed_to_int (rre , point )) )
125- m .Assign ( lim (fixed .fixed_to_int (rim , point )) )
126-
135+ m .Assign (lre (fixed .fixed_to_int (rre , point )))
136+ m .Assign (lim (fixed .fixed_to_int (rim , point )))
137+
127138 uut = m .Instance (main , 'uut' ,
128139 params = m .connect_params (main ),
129140 ports = m .connect_ports (main ))
130141
131142 reset_done = m .Reg ('reset_done' , initval = 0 )
132143 reset_stmt = []
133- reset_stmt .append ( reset_done (0 ) )
144+ reset_stmt .append (reset_done (0 ))
134145 for i , (re , im ) in enumerate (din ):
135- reset_stmt .append ( re (fixed .to_fixed (i , point )) )
136- reset_stmt .append ( im (fixed .to_fixed (i , point )) )
137-
138- simulation .setup_waveform (m , uut , * (_din + _dout ))
146+ reset_stmt .append (re (fixed .to_fixed (i , point )))
147+ reset_stmt .append (im (fixed .to_fixed (i , point )))
148+
149+ vcd_name = os .path .splitext (os .path .basename (__file__ ))[0 ] + '.vcd'
150+ simulation .setup_waveform (m , uut , * (_din + _dout ), dumpfile = vcd_name )
139151 simulation .setup_clock (m , clk , hperiod = 5 )
140152 init = simulation .setup_reset (m , rst , reset_stmt , period = 100 )
141153
142154 nclk = simulation .next_clock
143-
155+
144156 init .add (
145157 Delay (1000 ),
146158 reset_done (1 ),
@@ -151,56 +163,57 @@ def mkTest(datawidth=16, point=8):
151163
152164 def dump (name , v , point ):
153165 return Systask ('display' , name + '= %f' , fixed .fixed_to_real (v , point ))
154-
166+
155167 send_fsm = FSM (m , 'send_fsm' , clk , rst )
156168 send_fsm .goto_next (cond = reset_done )
157169
158170 for i , (re , im ) in enumerate (din ):
159- send_fsm .add ( re (fixed .to_fixed (i , point )) )
160- send_fsm .add ( im (fixed .to_fixed (i , point )) )
171+ send_fsm .add (re (fixed .to_fixed (i , point )))
172+ send_fsm .add (im (fixed .to_fixed (i , point )))
161173 # send_fsm.add( dump('din[%d]re' % i, re, point), delay=1 )
162174 # send_fsm.add( dump('din[%d]im' % i, im, point), delay=1 )
163-
175+
164176 send_fsm .goto_next ()
165177
166178 for i , (re , im ) in enumerate (din ):
167- send_fsm .add ( re (fixed .to_fixed (0 , point )) )
168- send_fsm .add ( im (fixed .to_fixed (0 , point )) )
169-
179+ send_fsm .add (re (fixed .to_fixed (0 , point )))
180+ send_fsm .add (im (fixed .to_fixed (0 , point )))
181+
170182 send_fsm .goto_next ()
171183
172184 for _ in range (100 ):
173- #for i, (re, im) in enumerate(dout):
185+ # for i, (re, im) in enumerate(dout):
174186 # send_fsm.add( dump('dout[%d]re' % i, re, point), delay=1 )
175187 # send_fsm.add( dump('dout[%d]im' % i, im, point), delay=1 )
176-
188+
177189 send_fsm .goto_next ()
178190
179- send_fsm .add ( Systask ('finish' ) )
191+ send_fsm .add (Systask ('finish' ))
180192
181193 send_fsm .make_always ()
182194
183195 return m
184196
197+
185198if __name__ == '__main__' :
186199 n = 4
187200 point = 8
188201 test = mkTest (point = point )
189202 verilog = test .to_verilog ('tmp.v' )
190- #print(verilog)
203+ # print(verilog)
191204
192205 # run simulator (Icarus Verilog)
193206 sim = simulation .Simulator (test )
194207 rslt = sim .run ()
195208 print (rslt )
196209
197- ## only target RTL
210+ # only target RTL
198211 #main = mkFFT4()
199212 #verilog = main.to_verilog('tmp.v')
200- #print(verilog)
213+ # print(verilog)
201214
202- din = [ (0 , 0 ), (1 , 1 ), (2 , 2 ), (3 , 3 ) ]
215+ din = [(0 , 0 ), (1 , 1 ), (2 , 2 ), (3 , 3 )]
203216 rslt = fft4 (din )
204217 for r in rslt :
205- print ( complex (round (r [0 ] * (2 ** point ), 5 ), round (r [1 ] * (2 ** point ), 5 )), ':' ,
206- complex (round (r [0 ], 5 ), round (r [1 ], 5 )) )
218+ print (complex (round (r [0 ] * (2 ** point ), 5 ), round (r [1 ] * (2 ** point ), 5 )), ':' ,
219+ complex (round (r [0 ], 5 ), round (r [1 ], 5 )))
0 commit comments