csr-test: add simple program to test CSRs
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
		
							
								
								
									
										76
									
								
								csr-test.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								csr-test.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					# This variable defines all the external programs that this module
 | 
				
			||||||
 | 
					# relies on.  lxbuildenv reads this variable in order to ensure
 | 
				
			||||||
 | 
					# the build will finish without exiting due to missing third-party
 | 
				
			||||||
 | 
					# programs.
 | 
				
			||||||
 | 
					LX_DEPENDENCIES = ["riscv", "icestorm", "yosys"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Import lxbuildenv to integrate the deps/ directory
 | 
				
			||||||
 | 
					import lxbuildenv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Disable pylint's E1101, which breaks completely on migen
 | 
				
			||||||
 | 
					#pylint:disable=E1101
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from migen import Module, Signal, Instance, ClockDomain, If, run_simulation
 | 
				
			||||||
 | 
					from migen.genlib.resetsync import AsyncResetSynchronizer
 | 
				
			||||||
 | 
					from litex.build.lattice.platform import LatticePlatform
 | 
				
			||||||
 | 
					from litex.build.generic_platform import Pins, IOStandard, Misc, Subsignal
 | 
				
			||||||
 | 
					from litex.soc.integration import SoCCore
 | 
				
			||||||
 | 
					from litex.soc.integration.builder import Builder
 | 
				
			||||||
 | 
					from litex.soc.integration.soc_core import csr_map_update
 | 
				
			||||||
 | 
					from litex.soc.interconnect import wishbone
 | 
				
			||||||
 | 
					from litex.soc.interconnect.csr import CSR, CSRStorage, AutoCSR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def csr_test(dut):
 | 
				
			||||||
 | 
					    for i in range(20):
 | 
				
			||||||
 | 
					        counter = yield dut.counter
 | 
				
			||||||
 | 
					        # test_value = yield dut.test_value.w
 | 
				
			||||||
 | 
					        (test_value) = yield from dut.test_value.read()
 | 
				
			||||||
 | 
					        print("CSR value: {} / {}".format(counter, test_value))
 | 
				
			||||||
 | 
					        # yield from CSRStorage.update_csrs()
 | 
				
			||||||
 | 
					        yield
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestCSR(Module, AutoCSR):
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        # self.counter = Signal(8)
 | 
				
			||||||
 | 
					        # self.test_value = CSR(8)
 | 
				
			||||||
 | 
					        # self.result = Signal(8)
 | 
				
			||||||
 | 
					        # self.read_result = Signal()
 | 
				
			||||||
 | 
					        # self.sync += [
 | 
				
			||||||
 | 
					        #     self.counter.eq(self.counter+1),
 | 
				
			||||||
 | 
					        #     self.test_value.w.eq(self.counter),
 | 
				
			||||||
 | 
					        #     self.result.eq(self.test_value.r),
 | 
				
			||||||
 | 
					        #     self.read_result.eq(self.test_value.re),
 | 
				
			||||||
 | 
					        # ]
 | 
				
			||||||
 | 
					        self.counter = Signal(8)
 | 
				
			||||||
 | 
					        self.test_value = CSRStorage(8, write_from_dev=True)
 | 
				
			||||||
 | 
					        self.result = Signal(8)
 | 
				
			||||||
 | 
					        self.result_re = Signal()
 | 
				
			||||||
 | 
					        self.sync += [
 | 
				
			||||||
 | 
					            self.counter.eq(self.counter+1),
 | 
				
			||||||
 | 
					            self.test_value.we.eq(1),
 | 
				
			||||||
 | 
					            self.test_value.dat_w.eq(self.counter),
 | 
				
			||||||
 | 
					            self.result.eq(self.test_value.storage),
 | 
				
			||||||
 | 
					            self.result_re.eq(self.test_value.re),
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    dut = TestCSR()
 | 
				
			||||||
 | 
					    for x in dir(dut):
 | 
				
			||||||
 | 
					        print("x: {}".format(x))
 | 
				
			||||||
 | 
					    for csr in dut.get_csrs():
 | 
				
			||||||
 | 
					        print("csr: {}".format(csr))
 | 
				
			||||||
 | 
					        if isinstance(csr, CSRStorage) and hasattr(csr, "dat_w"):
 | 
				
			||||||
 | 
					            print("Adding CSRStorage patch")
 | 
				
			||||||
 | 
					            dut.sync += [
 | 
				
			||||||
 | 
					                If(csr.we,
 | 
				
			||||||
 | 
					                    csr.storage.eq(csr.dat_w),
 | 
				
			||||||
 | 
					                    csr.re.eq(1),
 | 
				
			||||||
 | 
					                ).Else(
 | 
				
			||||||
 | 
					                    csr.re.eq(0),
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					    run_simulation(dut, csr_test(dut), vcd_name="csr-test.vcd")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    main()
 | 
				
			||||||
		Reference in New Issue
	
	Block a user