示例#1
0
    def elaborate(self, platform):
        m = Module()

        matches = Signal(len(self.ports))
        m.d.comb += self.no_match.eq(~matches.any())

        for i, (addr_scheme, slv_bus) in enumerate(self.ports.items()):
            num_words = addr_scheme.num_words
            start_addr = addr_scheme.first_valid_addr_incl
            max_legal_addr = start_addr + self.word_size * (num_words - 1)
            req_addr = self.bus.adr
            with m.If((req_addr >= start_addr) & (req_addr <= max_legal_addr)):
                m.d.comb += [
                    slv_bus.connect(self.bus, exclude=["adr"]),
                    slv_bus.adr.eq(req_addr - start_addr),
                    matches[i].eq(1),
                ]

        return m