138 active = Wire(Bits(1))
141 in_ready = Wire(Bits(1))
142 win, valid = ports.in_.unwrap(in_ready)
148 is_completing = valid & last
151 report_valid = is_completing
154 start_any = valid & in_ready & ~active
155 cur_src = src.reg(ports.clk, ports.rst, ce=start_any, rst_value=0)
158 interleave_err = (valid & in_ready) & active & (src != cur_src)
159 err.assign((err | interleave_err).reg(ports.clk, ports.rst, rst_value=0))
163 xact = valid & in_ready
164 begin_multi = xact & ~active & ~last
165 end_msg = xact & last
166 active_next = Mux(end_msg, Mux(begin_multi, active, Bits(1)(1)), Bits(1)(0))
167 active.assign(active_next.reg(ports.clk, ports.rst, rst_value=0))
170 msg_count = Counter(16)(clk=ports.clk,
175 report_data = ((err.as_uint(32) * UInt(32)(0x1000000)).as_uint(32) +
176 (cur_src.as_uint(32) * UInt(32)(0x10000)).as_uint(32) +
177 msg_count.out.as_uint(32)).as_uint(32)
178 report_chan, report_ready = Channel(UInt(32)).
wrap(report_data,
180 ports.report = report_chan
184 in_ready.assign(Mux(is_completing, Bits(1)(1), report_ready))