-
Notifications
You must be signed in to change notification settings - Fork 1
Open

Description
#1 Following the general ideas discussed, I have made a new abstraction for CSR objects in my fork (HarryMakes@ba5f354 fixed). An example script is given below, which will print all the fields and their properties in a CSR named "test". You might also test the slicing functionality using the format mycsr[beginbit:endbit]
, but please note that the upper boundary is exclusive.
from nmigen import *
from nmigen_soc.csr import *
if __name__ == "__main__":
mycsr = CSRGeneric("test", size=64, access=ACCESS_R_W, desc="A R/W test register")
mycsr.f += CSRField("enable", desc="Enable signal", enums=['OFF', 'ON'])
mycsr.f += CSRField("is_writing", size=2, access=ACCESS_R, desc="Status signal of writing or not",
enums=[
("YES", 1),
("NO", 0),
("UNDEFINED", 2)
])
mycsr.f += CSRField("is_reading", size=2, access=ACCESS_R, desc="Status signal of reading or not")
mycsr.f.is_reading.e += [
("UNDEFINED", 2),
("YES", 1),
("NO", 0)
]
mycsr.f += CSRField("is_busy", size=2, access=ACCESS_R_WONCE, desc="Busy signal",
enums=[
("YES", 1),
("NO", 0),
("UNKNOWN", -1)
])
mycsr.f += [
CSRField("misc_a", size=32),
CSRField("misc_b"),
CSRField("misc_c")
]
mycsr.f.misc_a.e += [
("HOT", 100000000),
("COLD", -100000000),
("NEUTRAL", 0)
]
#mycsr.f += CSRField("impossible", size=30, startbit=6)
print("{} (size={}) is {} : {}".format(
mycsr.name,
mycsr.size,
mycsr.access,
mycsr.desc))
for x in mycsr._fields:
print(" {} [{},{}] (size={}) is {}{}".format(
mycsr._fields[x].name,
mycsr._fields[x].startbit,
mycsr._fields[x].endbit,
mycsr._fields[x].size,
mycsr._fields[x].access,
(" : "+mycsr._fields[x].desc if mycsr._fields[x].desc is not None else "")))
Metadata
Metadata
Assignees
Labels
No labels