frontend/bist: only keep random datas (we can generate random addresses with control)

This commit is contained in:
Florent Kermarrec 2018-08-28 22:54:23 +02:00
parent b1e734b2ac
commit c37d3af5b5
1 changed files with 14 additions and 40 deletions

View File

@ -127,21 +127,16 @@ class _LiteDRAMBISTGenerator(Module):
self.done = Signal() self.done = Signal()
self.base = Signal(awidth) self.base = Signal(awidth)
self.length = Signal(awidth) self.length = Signal(awidth)
self.random_data_enable = Signal() self.random = Signal()
self.random_addr_enable = Signal()
self.ticks = Signal(32) self.ticks = Signal(32)
# # # # # #
# data / address generators # data / address generators
data_gen = Generator(31, n_state=31, taps=[27, 30]) # PRBS31 data_gen = Generator(31, n_state=31, taps=[27, 30]) # PRBS31
addr_gen = Generator(23, n_state=23, taps=[17, 22]) # PRBS23 addr_gen = CEInserter()(Counter(awidth))
assert (23 + ashift) < awidth # addressing large enough for random
self.submodules += data_gen, addr_gen self.submodules += data_gen, addr_gen
self.comb += [ self.comb += data_gen.random_enable.eq(self.random)
data_gen.random_enable.eq(self.random_data_enable),
addr_gen.random_enable.eq(self.random_addr_enable)
]
# dma # dma
dma = LiteDRAMDMAWriter(dram_port) dma = LiteDRAMDMAWriter(dram_port)
@ -202,12 +197,9 @@ class LiteDRAMBISTGenerator(Module, AutoCSR):
length : in length : in
Number of DRAM words to write. Number of DRAM words to write.
random_data_enable : in random : in
Enable random data (LFSR) Enable random data (LFSR)
random_addr_enable : in
Enable random addressing (LFSR)
ticks : out ticks : out
Duration of the generation. Duration of the generation.
""" """
@ -218,8 +210,7 @@ class LiteDRAMBISTGenerator(Module, AutoCSR):
self.done = CSRStatus() self.done = CSRStatus()
self.base = CSRStorage(awidth) self.base = CSRStorage(awidth)
self.length = CSRStorage(awidth) self.length = CSRStorage(awidth)
self.random_data_enable = CSRStorage() self.random = CSRStorage()
self.random_addr_enable = CSRStorage()
self.ticks = CSRStatus(32) self.ticks = CSRStatus(32)
# # # # # #
@ -260,10 +251,7 @@ class LiteDRAMBISTGenerator(Module, AutoCSR):
core.length.eq(length_sync.o) core.length.eq(length_sync.o)
] ]
self.specials += [ self.specials += MultiReg(self.random.storage, core.random, clock_domain)
MultiReg(self.random_data_enable.storage, core.random_data_enable, clock_domain),
MultiReg(self.random_addr_enable.storage, core.random_addr_enable, clock_domain),
]
ticks_sync = BusSynchronizer(32, clock_domain, "sys") ticks_sync = BusSynchronizer(32, clock_domain, "sys")
self.submodules += ticks_sync self.submodules += ticks_sync
@ -278,8 +266,7 @@ class LiteDRAMBISTGenerator(Module, AutoCSR):
self.done.status.eq(core.done), self.done.status.eq(core.done),
core.base.eq(self.base.storage), core.base.eq(self.base.storage),
core.length.eq(self.length.storage), core.length.eq(self.length.storage),
core.random_data_enable.eq(self.random_data_enable.storage), core.random.eq(self.random.storage),
core.random_addr_enable.eq(self.random_addr_enable.storage),
self.ticks.status.eq(core.ticks) self.ticks.status.eq(core.ticks)
] ]
@ -292,8 +279,7 @@ class _LiteDRAMBISTChecker(Module, AutoCSR):
self.done = Signal() self.done = Signal()
self.base = Signal(awidth) self.base = Signal(awidth)
self.length = Signal(awidth) self.length = Signal(awidth)
self.random_data_enable = Signal() self.random = Signal()
self.random_addr_enable = Signal()
self.ticks = Signal(32) self.ticks = Signal(32)
self.errors = Signal(32) self.errors = Signal(32)
@ -301,13 +287,9 @@ class _LiteDRAMBISTChecker(Module, AutoCSR):
# data / address generators # data / address generators
data_gen = Generator(31, n_state=31, taps=[27, 30]) # PRBS31 data_gen = Generator(31, n_state=31, taps=[27, 30]) # PRBS31
addr_gen = Generator(23, n_state=23, taps=[17, 22]) # PRBS23 addr_gen = CEInserter()(Counter(awidth))
assert (23 + ashift) < awidth # addressing large enough for random
self.submodules += data_gen, addr_gen self.submodules += data_gen, addr_gen
self.comb += [ self.comb += data_gen.random_enable.eq(self.random)
data_gen.random_enable.eq(self.random_data_enable),
addr_gen.random_enable.eq(self.random_addr_enable)
]
# dma # dma
dma = LiteDRAMDMAReader(dram_port) dma = LiteDRAMDMAReader(dram_port)
@ -392,12 +374,9 @@ class LiteDRAMBISTChecker(Module, AutoCSR):
length : in length : in
Number of DRAM words to check. Number of DRAM words to check.
random_data_enable : in random : in
Enable random data (LFSR) Enable random data (LFSR)
random_addr_enable : in
Enable random addressing (LFSR)
ticks: out ticks: out
Duration of the check. Duration of the check.
@ -411,8 +390,7 @@ class LiteDRAMBISTChecker(Module, AutoCSR):
self.done = CSRStatus() self.done = CSRStatus()
self.base = CSRStorage(awidth) self.base = CSRStorage(awidth)
self.length = CSRStorage(awidth) self.length = CSRStorage(awidth)
self.random_data_enable = CSRStorage() self.random = CSRStorage()
self.random_addr_enable = CSRStorage()
self.ticks = CSRStatus(32) self.ticks = CSRStatus(32)
self.errors = CSRStatus(32) self.errors = CSRStatus(32)
@ -454,10 +432,7 @@ class LiteDRAMBISTChecker(Module, AutoCSR):
core.length.eq(length_sync.o) core.length.eq(length_sync.o)
] ]
self.specials += [ self.specials += MultiReg(self.random.storage, core.random, clock_domain)
MultiReg(self.random_data_enable.storage, core.random_data_enable, clock_domain),
MultiReg(self.random_addr_enable.storage, core.random_addr_enable, clock_domain),
]
ticks_sync = BusSynchronizer(32, clock_domain, "sys") ticks_sync = BusSynchronizer(32, clock_domain, "sys")
self.submodules += ticks_sync self.submodules += ticks_sync
@ -479,8 +454,7 @@ class LiteDRAMBISTChecker(Module, AutoCSR):
self.done.status.eq(core.done), self.done.status.eq(core.done),
core.base.eq(self.base.storage), core.base.eq(self.base.storage),
core.length.eq(self.length.storage), core.length.eq(self.length.storage),
core.random_data_enable.eq(self.random_data_enable.storage), core.random.eq(self.random.storage),
core.random_addr_enable.eq(self.random_addr_enable.storage),
self.ticks.status.eq(core.ticks), self.ticks.status.eq(core.ticks),
self.errors.status.eq(core.errors) self.errors.status.eq(core.errors)
] ]