Skip to content

Commit d4833cb

Browse files
enjoy-digitalsbourdeauducq
authored andcommittedJun 28, 2014
cpuif: remove limitations on csr data_width
1 parent e5ca0c5 commit d4833cb

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed
 

‎misoclib/gensoc/cpuif.py

+18-14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from migen.fhdl.std import *
12
from migen.bank.description import CSRStatus
23

34
def get_cpu_mak(cpu_type):
@@ -28,41 +29,42 @@ def get_mem_header(regions, flash_boot_address):
2829
r += "#endif\n"
2930
return r
3031

31-
def _get_rw_functions(reg_name, reg_base, size, read_only):
32+
def _get_rw_functions(reg_name, reg_base, nwords, busword, read_only):
3233
r = ""
3334

3435
r += "#define CSR_"+reg_name.upper()+"_ADDR "+hex(reg_base)+"\n"
35-
r += "#define CSR_"+reg_name.upper()+"_SIZE "+str(size)+"\n"
36+
r += "#define CSR_"+reg_name.upper()+"_SIZE "+str(nwords)+"\n"
3637

37-
if size > 8:
38+
size = nwords*busword
39+
if size > 64:
3840
raise NotImplementedError("Register too large")
39-
elif size > 4:
41+
elif size > 32:
4042
ctype = "unsigned long long int"
41-
elif size > 2:
43+
elif size > 16:
4244
ctype = "unsigned int"
43-
elif size > 1:
45+
elif size > 8:
4446
ctype = "unsigned short int"
4547
else:
4648
ctype = "unsigned char"
4749

4850
r += "static inline "+ctype+" "+reg_name+"_read(void) {\n"
4951
if size > 1:
5052
r += "\t"+ctype+" r = MMPTR("+hex(reg_base)+");\n"
51-
for byte in range(1, size):
52-
r += "\tr <<= 8;\n\tr |= MMPTR("+hex(reg_base+4*byte)+");\n"
53+
for byte in range(1, nwords):
54+
r += "\tr <<= "+str(busword)+";\n\tr |= MMPTR("+hex(reg_base+4*byte)+");\n"
5355
r += "\treturn r;\n}\n"
5456
else:
5557
r += "\treturn MMPTR("+hex(reg_base)+");\n}\n"
5658

5759
if not read_only:
5860
r += "static inline void "+reg_name+"_write("+ctype+" value) {\n"
59-
for byte in range(size):
60-
shift = (size-byte-1)*8
61+
for word in range(nwords):
62+
shift = (nwords-word-1)*busword
6163
if shift:
6264
value_shifted = "value >> "+str(shift)
6365
else:
6466
value_shifted = "value"
65-
r += "\tMMPTR("+hex(reg_base+4*byte)+") = "+value_shifted+";\n"
67+
r += "\tMMPTR("+hex(reg_base+4*word)+") = "+value_shifted+";\n"
6668
r += "}\n"
6769
return r
6870

@@ -72,9 +74,10 @@ def get_csr_header(csr_base, bank_array, interrupt_map):
7274
r += "\n/* "+name+" */\n"
7375
reg_base = csr_base + 0x800*mapaddr
7476
r += "#define "+name.upper()+"_BASE "+hex(reg_base)+"\n"
77+
busword = flen(rmap.bus.dat_w)
7578
for csr in csrs:
76-
nr = (csr.size + 7)//8
77-
r += _get_rw_functions(name + "_" + csr.name, reg_base, nr, isinstance(csr, CSRStatus))
79+
nr = (csr.size + busword - 1)//busword
80+
r += _get_rw_functions(name + "_" + csr.name, reg_base, nr, busword, isinstance(csr, CSRStatus))
7881
reg_base += 4*nr
7982
try:
8083
interrupt_nr = interrupt_map[name]
@@ -93,8 +96,9 @@ def get_csr_csv(csr_base, bank_array):
9396
r = ""
9497
for name, csrs, mapaddr, rmap in bank_array.banks:
9598
reg_base = csr_base + 0x800*mapaddr
99+
busword = flen(rmap.bus.dat_w)
96100
for csr in csrs:
97-
nr = (csr.size + 7)//8
101+
nr = (csr.size + busword - 1)//busword
98102
r += "{}_{},0x{:08x},{},{}\n".format(name, csr.name, reg_base, nr, "ro" if isinstance(csr, CSRStatus) else "rw")
99103
reg_base += 4*nr
100104
return r

0 commit comments

Comments
 (0)
Please sign in to comment.