1 from random
import randint
2 from nmigen
import Module
, Signal
3 from nmigen
.compat
.sim
import run_simulation
4 from nmigen
.cli
import verilog
, rtlil
6 from inputgroup
import InputGroup
10 stb
= yield dut
.out_op
.stb
12 ack
= yield dut
.out_op
.ack
16 yield dut
.rs
[1].in_op
[0].eq(5)
17 yield dut
.rs
[1].stb
.eq(0b01) # strobe indicate 1st op ready
18 #yield dut.rs[1].ack.eq(1)
21 # check row 1 output (should be inactive)
22 decode
= yield dut
.rs
[1].out_decode
25 op0
= yield dut
.rs
[1].out_op
[0]
26 op1
= yield dut
.rs
[1].out_op
[1]
27 assert op0
== 0 and op1
== 0
29 # output should be inactive
30 out_stb
= yield dut
.out_op
.stb
34 yield dut
.rs
[1].in_op
[1].eq(6)
35 yield dut
.rs
[1].stb
.eq(0b11) # strobe indicate both ops ready
37 # set acknowledgement of output... takes 1 cycle to respond
38 yield dut
.out_op
.ack
.eq(1)
40 yield dut
.out_op
.ack
.eq(0) # clear ack on output
41 yield dut
.rs
[1].stb
.eq(0) # clear row 1 strobe
43 # output strobe should be active, MID should be 0 until "ack" is set...
44 out_stb
= yield dut
.out_op
.stb
46 out_muxid
= yield dut
.muxid
49 # ... and output should not yet be passed through either
50 op0
= yield dut
.out_op
.v
[0]
51 op1
= yield dut
.out_op
.v
[1]
52 assert op0
== 0 and op1
== 0
54 # wait for out_op.ack to activate...
55 yield dut
.rs
[1].stb
.eq(0b00) # set row 1 strobes to zero
58 # *now* output should be passed through
59 op0
= yield dut
.out_op
.v
[0]
60 op1
= yield dut
.out_op
.v
[1]
61 assert op0
== 5 and op1
== 6
64 yield dut
.rs
[2].in_op
[0].eq(3)
65 yield dut
.rs
[2].in_op
[1].eq(4)
66 yield dut
.rs
[2].stb
.eq(0b11) # strobe indicate 1st op ready
67 yield dut
.out_op
.ack
.eq(1) # set output ack
69 yield dut
.rs
[2].stb
.eq(0) # clear row 2 strobe
70 yield dut
.out_op
.ack
.eq(0) # set output ack
72 op0
= yield dut
.out_op
.v
[0]
73 op1
= yield dut
.out_op
.v
[1]
74 assert op0
== 3 and op1
== 4, "op0 %d op1 %d" % (op0
, op1
)
75 out_muxid
= yield dut
.muxid
78 # set row 0 and 3 input
79 yield dut
.rs
[0].in_op
[0].eq(9)
80 yield dut
.rs
[0].in_op
[1].eq(8)
81 yield dut
.rs
[0].stb
.eq(0b11) # strobe indicate 1st op ready
82 yield dut
.rs
[3].in_op
[0].eq(1)
83 yield dut
.rs
[3].in_op
[1].eq(2)
84 yield dut
.rs
[3].stb
.eq(0b11) # strobe indicate 1st op ready
86 # set acknowledgement of output... takes 1 cycle to respond
87 yield dut
.out_op
.ack
.eq(1)
89 yield dut
.rs
[0].stb
.eq(0) # clear row 1 strobe
91 out_muxid
= yield dut
.muxid
92 assert out_muxid
== 0, "out muxid %d" % out_muxid
95 yield dut
.rs
[3].stb
.eq(0) # clear row 1 strobe
96 yield dut
.out_op
.ack
.eq(0) # clear ack on output
98 out_muxid
= yield dut
.muxid
99 assert out_muxid
== 3, "out muxid %d" % out_muxid
103 def __init__(self
, dut
):
108 for muxid
in range(dut
.num_rows
):
111 for i
in range(self
.tlen
):
112 self
.di
[muxid
][i
] = randint(0, 100)
113 self
.do
[muxid
][i
] = self
.di
[muxid
][i
]
115 def send(self
, muxid
):
116 for i
in range(self
.tlen
):
117 op2
= self
.di
[muxid
][i
]
123 yield rs
.in_op
[0].eq(i
)
124 yield rs
.in_op
[1].eq(op2
)
125 yield rs
.stb
.eq(0b11) # strobe indicate 1st op ready
132 # wait random period of time before queueing another value
133 for i
in range(randint(0, 8)):
138 stb
= yield dut
.out_op
.stb
139 yield dut
.out_op
.ack
.eq(0)
141 yield dut
.out_op
.ack
.eq(1)
143 stb
= yield dut
.out_op
.stb
145 stb
= yield dut
.out_op
.stb
148 stb
= yield dut
.out_op
.stb
149 muxid
= yield dut
.muxid
150 out_i
= yield dut
.out_op
.v
[0]
151 out_v
= yield dut
.out_op
.v
[1]
153 # see if this output has occurred already, delete it if it has
154 assert out_i
in self
.do
[muxid
]
155 assert self
.do
[muxid
][out_i
] == out_v
156 del self
.do
[muxid
][out_i
]
158 # check if there's any more outputs
160 for (k
, v
) in self
.do
.items():
166 if __name__
== '__main__':
167 dut
= InputGroup(width
=32)
168 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
169 with
open("test_inputgroup.il", "w") as f
:
171 run_simulation(dut
, testbench(dut
), vcd_name
="test_inputgroup.vcd")
173 dut
= InputGroup(width
=16)
174 test
= InputTest(dut
)
175 run_simulation(dut
, [test
.send(3), test
.send(2),
176 test
.send(1), test
.send(0),
178 vcd_name
="test_inputgroup_parallel.vcd")