1 # POWER9 Register Files
4 Defines the following register files:
6 * INT regfile - 32x 64-bit
7 * SPR regfile - 110x 64-bit
9 * XER regfile - XER.so, XER.ca/ca32, XER.ov/ov32
10 * FAST regfile - CTR, LR, TAR, SRR1, SRR2
11 * STATE regfile - PC, MSR, (SimpleV VL later)
13 Note: this should NOT have name conventions hard-coded (dedicated ports per
14 regname). However it is convenient for now.
18 * https://bugs.libre-soc.org/show_bug.cgi?id=345
19 * https://bugs.libre-soc.org/show_bug.cgi?id=351
20 * https://libre-soc.org/3d_gpu/architecture/regfile/
21 * https://libre-soc.org/openpower/isatables/sprs.csv
26 from soc
.regfile
.regfile
import RegFile
, RegFileArray
, RegFileMem
27 from soc
.regfile
.virtual_port
import VirtualRegPort
28 from soc
.decoder
.power_enums
import SPR
32 class StateRegs(RegFileArray
):
35 State regfile - PC, MSR, DEC, TB and later SimpleV VL
37 * QTY 4of 64-bit registers
39 * Array-based unary-indexed (not binary-indexed)
40 * write-through capability (read on same cycle as write)
42 Note: d_wr1 d_rd1 are for use by the decoder, to get at the PC.
43 will probably have to also add one so it can get at the MSR as well.
50 super().__init
__(64, 4)
51 self
.w_ports
= {'nia': self
.write_port("nia"),
52 'msr': self
.write_port("msr"),
53 'd_wr1': self
.write_port("d_wr1")} # writing PC (issuer)
54 self
.r_ports
= {'cia': self
.read_port("cia"), # reading PC (issuer)
55 'msr': self
.read_port("msr"), # reading MSR (issuer)
60 class IntRegs(RegFileMem
): #class IntRegs(RegFileArray):
63 * QTY 32of 64-bit registers
65 * Array-based unary-indexed (not binary-indexed)
66 * write-through capability (read on same cycle as write)
69 super().__init
__(64, 32)
70 self
.w_ports
= {'o': self
.write_port("dest1"),
71 #'o1': self.write_port("dest2") # for now (LD/ST update)
73 self
.r_ports
= {'ra': self
.read_port("src1"),
74 'rb': self
.read_port("src2"),
75 'rc': self
.read_port("src3"),
76 'dmi': self
.read_port("dmi")} # needed for Debug (DMI)
80 class FastRegs(RegFileMem
): #RegFileArray):
83 FAST regfile - CTR, LR, TAR, SRR1, SRR2, XER, TB, DEC
85 * QTY 6of 64-bit registers
87 * Array-based unary-indexed (not binary-indexed)
88 * write-through capability (read on same cycle as write)
90 Note: r/w issue are used by issuer to increment/decrement TB/DEC.
97 XER
= 5 # non-XER bits
100 N_REGS
= 8 # maximum number of regs
102 super().__init
__(64, self
.N_REGS
)
103 self
.w_ports
= {'fast1': self
.write_port("dest1"),
104 'issue': self
.write_port("issue"), # writing DEC/TB
106 self
.r_ports
= {'fast1': self
.read_port("src1"),
107 'fast2': self
.read_port("src2"),
108 'issue': self
.read_port("issue"), # reading DEC/TB
113 class CRRegs(VirtualRegPort
):
114 """Condition Code Registers (CR0-7)
116 * QTY 8of 8-bit registers
117 * 3R1W 4-bit-wide with additional 1R1W for the "full" 32-bit width
118 * Array-based unary-indexed (not binary-indexed)
119 * write-through capability (read on same cycle as write)
122 super().__init
__(32, 8, rd2
=True)
123 self
.w_ports
= {'full_cr': self
.full_wr
, # 32-bit (masked, 8-en lines)
124 'cr_a': self
.write_port("dest1"), # 4-bit, unary-indexed
125 'cr_b': self
.write_port("dest2")} # 4-bit, unary-indexed
126 self
.r_ports
= {'full_cr': self
.full_rd
, # 32-bit (masked, 8-en lines)
127 'full_cr_dbg': self
.full_rd2
, # for DMI
128 'cr_a': self
.read_port("src1"),
129 'cr_b': self
.read_port("src2"),
130 'cr_c': self
.read_port("src3")}
134 class XERRegs(VirtualRegPort
):
135 """XER Registers (SO, CA/CA32, OV/OV32)
137 * QTY 3of 2-bit registers
138 * 3R3W 2-bit-wide with additional 1R1W for the "full" 6-bit width
139 * Array-based unary-indexed (not binary-indexed)
140 * write-through capability (read on same cycle as write)
142 SO
=0 # this is actually 2-bit but we ignore 1 bit of it
146 super().__init
__(6, 3)
147 self
.w_ports
= {'full_xer': self
.full_wr
, # 6-bit (masked, 3-en lines)
148 'xer_so': self
.write_port("dest1"),
149 'xer_ca': self
.write_port("dest2"),
150 'xer_ov': self
.write_port("dest3")}
151 self
.r_ports
= {'full_xer': self
.full_rd
, # 6-bit (masked, 3-en lines)
152 'xer_so': self
.read_port("src1"),
153 'xer_ca': self
.read_port("src2"),
154 'xer_ov': self
.read_port("src3")}
158 class SPRRegs(RegFileMem
):
161 * QTY len(SPRs) 64-bit registers
163 * binary-indexed but REQUIRES MAPPING
164 * write-through capability (read on same cycle as write)
168 super().__init
__(width
=64, depth
=n_sprs
)
169 self
.w_ports
= {'spr1': self
.write_port("spr1")}
170 self
.r_ports
= {'spr1': self
.read_port("spr1")}
173 # class containing all regfiles: int, cr, xer, fast, spr
177 for (name
, kls
) in [('int', IntRegs
),
181 ('state', StateRegs
),
183 rf
= self
.rf
[name
] = kls()
184 setattr(self
, name
, rf
)
186 def elaborate_into(self
, m
, platform
):
187 for (name
, rf
) in self
.rf
.items():
188 setattr(m
.submodules
, name
, rf
)