10 period
= 20 # clk frequency = 50 MHz
14 def __init__(self
, ins
):
22 class Selectors(object):
23 def __init__(self
, sels
):
35 (in_a
, in_b
, in_c
, in_d
) = ins
36 print repr(clk
), ins
, repr(selector
), repr(out
)
38 @always(selector
, in_a
, in_b
, in_c
, in_d
)
40 out
.next
= bool(in_a
if selector
== 0 else False) | \
41 bool(in_b
if selector
== 1 else False) | \
42 bool(in_c
if selector
== 2 else False) | \
43 bool(in_d
if selector
== 3 else False)
45 return instances() # return all instances
60 return instances() # return all instances
64 def pmux2(clk
, in_a
, in_b
,
77 return instances() # return all instances
81 def pmux3(clk
, in_a
, in_b
, in_c
,
82 sel_a
, sel_b
, sel_c
, out
):
84 @always(sel_a
, sel_b
, sel_c
,
96 return instances() # return all instances
100 def pmux4(clk
, ins
, sels
, out
):
102 @always(*list(sels
.sels
) + list(ins
.ins
))
117 return i
# return all instances
124 clk
= Signal(bool(0))
125 in_a
= Signal(bool(0))
126 in_b
= Signal(bool(0))
127 in_c
= Signal(bool(0))
128 in_d
= Signal(bool(0))
129 sel_a
= Signal(bool(0))
130 sel_b
= Signal(bool(0))
131 sel_c
= Signal(bool(0))
132 sel_d
= Signal(bool(0))
133 out
= Signal(bool(0))
135 sels
= Selectors((sel_a
, sel_b
, sel_c
, sel_d
))
136 ins
= Inputs((in_a
, in_b
, in_c
, in_d
))
137 mux_inst
= pmux4(clk
, ins
, sels
, out
)
155 sel_a
.next
= not sel_a
157 sel_b
.next
= not sel_b
159 sel_c
.next
= not sel_c
161 sel_d
.next
= not sel_d
162 yield delay(period
// 2)
164 # print simulation data on screen and file
165 file_data
= open("pmux.csv", 'w') # file for saving data
166 # # print header on screen
167 s
= "{0},{1},{2},{3},{4},{5},{6},{7},{8}".format(
168 "in_a", "in_b", "in_c", "in_d",
169 "sel_a", "sel_b", "sel_c", "sel_d",
172 # # print header to file
174 # print data on each clock
179 # print.format is not supported in MyHDL 1.0
180 print ("%s,%s,%s,%s,%s,%s,%s,%s,%s" %
195 # print.format is not supported in MyHDL 1.0
196 #file_data.write(s + "\n")
206 clk
= Signal(bool(0))
207 in_a
= Signal(bool(0))
208 in_b
= Signal(bool(0))
209 in_c
= Signal(bool(0))
210 in_d
= Signal(bool(0))
211 selector
= Signal(intbv(0)[2:0])
212 out
= Signal(bool(0))
214 mux_inst
= mux4(clk
, in_a
, in_b
, in_c
, in_d
, selector
, out
)
232 selector
.next
= selector
+ 1
233 yield delay(period
// 2)
235 # print simulation data on screen and file
236 file_data
= open("mux.csv", 'w') # file for saving data
237 # # print header on screen
238 s
= "{0},{1},{2},{3},{4},{5}".format("in_a", "in_b", "in_c", "in_d",
241 # # print header to file
243 # print data on each clock
248 # print.format is not supported in MyHDL 1.0
249 print ("%s,%s,%s,%s,%s,%s" %
263 # print.format is not supported in MyHDL 1.0
264 #file_data.write(s + "\n")
271 clk
= Signal(bool(0))
272 in_a
= Signal(bool(0))
273 in_b
= Signal(bool(0))
274 in_c
= Signal(bool(0))
275 in_d
= Signal(bool(0))
276 selector
= Signal(intbv(0)[2:0])
277 out
= Signal(bool(0))
279 mux_v
= mux4(clk
, in_a
, in_b
, in_c
, in_d
, selector
, out
)
280 mux_v
.convert(hdl
="Verilog", initial_values
=True)
284 tb
.convert(hdl
="Verilog", initial_values
=True)
285 # keep following lines below the 'tb.convert' line
286 # otherwise error will be reported
287 tb
.config_sim(trace
=True)
288 tb
.run_sim(66 * period
) # run for 15 clock cycle
293 clk
= Signal(bool(0))
294 in_a
= Signal(bool(0))
295 in_b
= Signal(bool(0))
296 in_c
= Signal(bool(0))
297 in_d
= Signal(bool(0))
298 sel_a
= Signal(bool(0))
299 sel_b
= Signal(bool(0))
300 sel_c
= Signal(bool(0))
301 sel_d
= Signal(bool(0))
302 out
= Signal(bool(0))
304 sels
= Selectors((sel_a
, sel_b
, sel_c
, sel_d
))
305 ins
= Inputs((in_a
, in_b
, in_c
, in_d
))
306 pmux_v
= pmux4(clk
, ins
, sels
, out
)
307 pmux_v
.convert(hdl
="Verilog", initial_values
=True)
311 tb
.convert(hdl
="Verilog", initial_values
=True)
312 # keep following lines below the 'tb.convert' line
313 # otherwise error will be reported
314 tb
.config_sim(trace
=True)
315 tb
.run_sim(4 * 66 * period
) # run for 15 clock cycle
318 if __name__
== '__main__':