1 # (DO NOT REMOVE THESE NOTICES)
2 # SPDX-License-Identifier: LGPLv3+
3 # Copyright (C) 2019, 2020, 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
4 # Part of the Libre-SOC Project.
5 # Sponsored by NLnet EU Grant No: 825310 and 825322
6 # Sponsored by NGI POINTER EU Grant No: 871528
8 from nmigen
import Elaboratable
, Module
, Signal
9 from nmigen
.cli
import verilog
, rtlil
12 class FU_RW_Pend(Elaboratable
):
13 """ these are allocated per-FU (horizontally),
14 and are of length reg_count
16 def __init__(self
, reg_count
, n_src
, n_dst
):
19 self
.reg_count
= reg_count
20 # create dest forwarding array
22 for i
in range(n_dst
):
23 j
= i
+ 1 # name numbering to match dst1/dst2
24 dst
.append(Signal(reg_count
, name
="dst%d" % j
, reset_less
=True))
25 self
.dst_fwd_i
= tuple(dst
)
26 self
.dest_fwd_i
= self
.dst_fwd_i
[0] # old API
27 # create src forwarding array
29 for i
in range(n_src
):
30 j
= i
+ 1 # name numbering to match src1/src2
31 src
.append(Signal(reg_count
, name
="src%d" % j
, reset_less
=True))
32 self
.src_fwd_i
= tuple(src
)
34 self
.reg_wr_pend_o
= Signal(reset_less
=True)
35 self
.reg_rd_pend_o
= Signal(reset_less
=True)
36 self
.reg_rd_src_pend_o
= Signal(n_src
, reset_less
=True)
37 self
.reg_wr_dst_pend_o
= Signal(n_dst
, reset_less
=True)
39 def elaborate(self
, platform
):
41 for i
in range(self
.n_dst
):
42 m
.d
.comb
+= self
.reg_wr_dst_pend_o
[i
].eq(self
.dst_fwd_i
[i
].bool())
43 m
.d
.comb
+= self
.reg_wr_pend_o
.eq(self
.reg_wr_dst_pend_o
.bool())
44 for i
in range(self
.n_src
):
45 m
.d
.comb
+= self
.reg_rd_src_pend_o
[i
].eq(self
.src_fwd_i
[i
].bool())
46 m
.d
.comb
+= self
.reg_rd_pend_o
.eq(self
.reg_rd_src_pend_o
.bool())
50 yield self
.reg_wr_pend_o
51 yield self
.reg_rd_pend_o
52 yield self
.reg_rd_src_pend_o
53 yield self
.reg_wr_dst_pend_o
54 yield from self
.dst_fwd_i
55 yield from self
.src_fwd_i
60 def test_fu_rw_pend():
61 dut
= FU_RW_Pend(4, 2, 2)
62 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
63 with
open("test_fu_rw_pend.il", "w") as f
:
66 if __name__
== '__main__':