/*================================*/
function Tuple2#(Bool, Bit#(TLog#(Num_Slow_Slaves))) fn_address_mapping (Bit#(`PADDR) addr);
- `ifdef UART0
- if(addr>=`UART0Base && addr<=`UART0End)
- return tuple2(True,fromInteger(valueOf(Uart0_slave_num)));
- else
- `endif
- `ifdef UART1
- if(addr>=`UART1Base && addr<=`UART1End)
- return tuple2(True,fromInteger(valueOf(Uart1_slave_num)));
- else
- `endif
`ifdef CLINT
if(addr>=`ClintBase && addr<=`ClintEnd)
return tuple2(True,fromInteger(valueOf(CLINT_slave_num)));
return tuple2(True,fromInteger(valueOf(Plic_slave_num)));
else
`endif
- `ifdef I2C0
- if(addr>=`I2C0Base && addr<=`I2C0End)
- return tuple2(True,fromInteger(valueOf(I2c0_slave_num)));
- else
- `endif
- `ifdef I2C1
- if(addr>=`I2C1Base && addr<=`I2C1End)
- return tuple2(True,fromInteger(valueOf(I2c1_slave_num)));
- else
- `endif
- `ifdef QSPI0
- if(addr>=`QSPI0CfgBase && addr<=`QSPI0CfgEnd)
- return tuple2(True,fromInteger(valueOf(Qspi0_slave_num)));
- else if(addr>=`QSPI0MemBase && addr<=`QSPI0MemEnd)
- return tuple2(True,fromInteger(valueOf(Qspi0_slave_num)));
- else
- `endif
- `ifdef QSPI1
- if(addr>=`QSPI1CfgBase && addr<=`QSPI1CfgEnd)
- return tuple2(True,fromInteger(valueOf(Qspi1_slave_num)));
- else if(addr>=`QSPI1MemBase && addr<=`QSPI1MemEnd)
- return tuple2(True,fromInteger(valueOf(Qspi1_slave_num)));
- else
- `endif
`ifdef AXIEXP
if(addr>=`AxiExp1Base && addr<=`AxiExp1End)
return tuple2(True,fromInteger(valueOf(AxiExp1_slave_num)));
else
`endif
- `ifdef PWM_AXI4Lite
- if(addr>=`PWMBase && addr<=`PWMEnd)
- return tuple2(True,fromInteger(valueOf(Pwm_slave_num)));
- else
- `endif
-
- // NEEL EDIT
- // give slave number and adress map to whatever peripherals you instantiate on the AXI4_Lite
- // slave.
- // NEEL EDIT OVER
- return tuple2(False,?);
+{4}
+ return tuple2(False,?);
endfunction
(*synthesize*)
return ('', 0)
return self.slow.axi_slave_idx(start, self.ifacename, count)
+ def axi_addr_map(self, count):
+ if not self.slow:
+ return ''
+ return self.slow.axi_addr_map(self.ifacename, count)
+
class MuxInterface(Interface):
decls = '\n'.join(list(filter(None, ret)))
return axi_slave_declarations.format(decls)
+ def axi_addr_map(self, *args):
+ ret = []
+ for (name, count) in self.ifacecount:
+ for i in range(count):
+ ret.append(self.data[name].axi_addr_map(i))
+ return '\n'.join(list(filter(None, ret)))
+
# ========= Interface declarations ================ #
" `define%(bend)s 'h%(end)08X // %(comment)s" % locals(),
offs)
- def axi_slave_idx(self, idx, name, ifacenum):
+ def axi_slave_name(self, name, ifacenum):
name = name.upper()
- return ("typedef {0} {1}{2}_slave_num;".format(idx, name, ifacenum), 1)
+ return "{0}{1}_slave_num".format(name, ifacenum)
+
+ def axi_slave_idx(self, idx, name, ifacenum):
+ name = self.axi_slave_name(name, ifacenum)
+ return ("typedef {0} {1};".format(idx, name), 1)
+
+ def axi_addr_map(self, name, ifacenum):
+ bname = self.axibase(name, ifacenum)
+ bend = self.axiend(name, ifacenum)
+ name = self.axi_slave_name(name, ifacenum)
+ return """\
+ if(addr>=`{0} && addr<=`{1})
+ return tuple2(True,fromInteger(valueOf({2})));
+ else""".format(bname, bend, name)
class uart(PBase):
ifdecl = ifaces.slowifdecl()
regdef = ifaces.axi_reg_def()
slavedecl = ifaces.axi_slave_idx()
+ fnaddrmap = ifaces.axi_addr_map()
with open(slow, "w") as bsv_file:
- bsv_file.write(template.format(imports, ifdecl, regdef, slavedecl))
+ bsv_file.write(template.format(imports, ifdecl, regdef, slavedecl,
+ fnaddrmap))
def write_bus(bus, p, ifaces):