Added ADC, H-Bridge and motor models, refactored project structure
This commit is contained in:
		
							
								
								
									
										102
									
								
								platform/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								platform/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| cmake_minimum_required(VERSION 3.3) | ||||
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) # main (top) cmake dir | ||||
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # project specific cmake dir | ||||
|  | ||||
| # CMake useful variables | ||||
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") | ||||
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")  | ||||
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") | ||||
|  | ||||
| # Set the name of your project here | ||||
| project("riscv.sc") | ||||
|  | ||||
| # Set the version number of your project here (format is MAJOR.MINOR.PATCHLEVEL - e.g. 1.0.0) | ||||
| set(VERSION_MAJOR "0") | ||||
| set(VERSION_MINOR "0") | ||||
| set(VERSION_PATCH "1") | ||||
| set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) | ||||
|  | ||||
| include(Common) | ||||
|  | ||||
| ## Git (and its revision) | ||||
| find_package(Git QUIET) # if we don't find git or FindGit.cmake is not on the system we ignore it. | ||||
| ## The Git module will trigger a reconfiguration for each pull that will bring a new revision on the local repository | ||||
| set (VCS_REVISION "-1") | ||||
| if(GIT_FOUND) | ||||
|     include(GetGitRevisionDescription) | ||||
|     get_git_head_revision(GIT_REFSPEC GIT_SHA1) | ||||
|     message(STATUS "GIT branch ${GIT_REFSPEC}") | ||||
|     message(STATUS "GIT revision ${GIT_SHA1}") | ||||
|     set (VCS_REVISION ${GIT_SHA1}) | ||||
| endif() | ||||
|  | ||||
| # This line finds the boost lib and headers.  | ||||
| set(Boost_NO_BOOST_CMAKE ON) #  Don't do a find_package in config mode before searching for a regular boost install. | ||||
| find_package(Boost COMPONENTS program_options system thread REQUIRED) | ||||
|  | ||||
| find_package(LLVM REQUIRED CONFIG) | ||||
| message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") | ||||
| message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") | ||||
| llvm_map_components_to_libnames(llvm_libs support core mcjit x86codegen x86asmparser) | ||||
|  | ||||
| find_package(SystemC) | ||||
| if(SystemC_FOUND) | ||||
|     add_definitions(-DWITH_SYSTEMC) | ||||
|     include_directories(${SystemC_INCLUDE_DIRS}) | ||||
|     link_directories(${SystemC_LIBRARY_DIRS}) | ||||
| else(SystemC_FOUND) | ||||
|     message( FATAL_ERROR "SystemC library not found." ) | ||||
| endif(SystemC_FOUND) | ||||
|  | ||||
| if(CCI_FOUND) | ||||
|     include_directories(${CCI_INCLUDE_DIRS}) | ||||
|     link_directories(${CCI_LIBRARY_DIRS}) | ||||
| else() | ||||
|     message( FATAL_ERROR "SystemC CCI library not found." ) | ||||
| endif() | ||||
|  | ||||
| if(SCV_FOUND)    | ||||
|     add_definitions(-DWITH_SCV) | ||||
|     link_directories(${SCV_LIBRARY_DIRS}) | ||||
| endif(SCV_FOUND) | ||||
|  | ||||
| # This sets the include directory for the reference project. This is the -I flag in gcc. | ||||
| include_directories( | ||||
|     ${PROJECT_SOURCE_DIR}/incl | ||||
|     ${LLVM_INCLUDE_DIRS} | ||||
| ) | ||||
|  | ||||
| add_dependent_subproject(dbt-core) | ||||
| add_dependent_subproject(sc-components) | ||||
| add_dependent_subproject(riscv) | ||||
| add_dependent_subproject(riscv.sc) | ||||
|  | ||||
| include_directories( | ||||
|     ${PROJECT_SOURCE_DIR}/incl | ||||
|     ${PROJECT_SOURCE_DIR}/../riscv/incl | ||||
|     ${PROJECT_SOURCE_DIR}/../external/elfio | ||||
|     ${PROJECT_SOURCE_DIR}/../external/libGIS | ||||
|     ${Boost_INCLUDE_DIRS} | ||||
| ) | ||||
|  | ||||
|  | ||||
| # Mac needed variables (adapt for your needs - http://www.cmake.org/Wiki/CMake_RPATH_handling#Mac_OS_X_and_the_RPATH) | ||||
| set(CMAKE_MACOSX_RPATH ON) | ||||
| set(CMAKE_SKIP_BUILD_RPATH FALSE) | ||||
| set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) | ||||
| set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") | ||||
| set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) | ||||
|  | ||||
| add_subdirectory(src) | ||||
|  | ||||
| # | ||||
| # SYSTEM PACKAGING (RPM, TGZ, ...) | ||||
| # _____________________________________________________________________________ | ||||
|  | ||||
| #include(CPackConfig) | ||||
|  | ||||
| # | ||||
| # CMAKE PACKAGING (for other CMake projects to use this one easily) | ||||
| # _____________________________________________________________________________ | ||||
|  | ||||
| #include(PackageConfigurator) | ||||
							
								
								
									
										158
									
								
								platform/gen_input/aon.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								platform/gen_input/aon.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| regfile aon_regs { | ||||
| 	// Watchdog Timer Registers | ||||
| 	reg { | ||||
| 		name = "wdogcfg"; | ||||
| 		desc = "Watchdog Timer Config Register"; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogcfg @0x00; | ||||
| 	reg { | ||||
| 		name ="wdogcount"; | ||||
| 		desc = "Watchdog Timer Count Registers"; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogcount @0x08;  | ||||
| 	reg { | ||||
| 		name ="wdogs"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogs @0x10;  | ||||
| 	reg { | ||||
| 		name ="wdogfeed"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogfeed @0x18;  | ||||
| 	reg { | ||||
| 		name ="wdogkey"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogkey @0x1C;  | ||||
| 	reg { | ||||
| 		name ="wdogcmp"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} wdogcmp @0x20; | ||||
| 	// Real-Time Clock Registers | ||||
| 	reg { | ||||
| 		name ="rtccfg"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} rtccfg @0x40; | ||||
| 	reg { | ||||
| 		name ="rtclo"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	}  rtclo @0x48; | ||||
|  	reg { | ||||
| 		name ="rtchi"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} rtchi @0x4C; | ||||
| 	reg { | ||||
| 		name ="rtcs"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	}  rtcs @0x50; | ||||
| 	reg { | ||||
| 		name ="rtccmp"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} rtccmp @0x60; | ||||
| 	// AON Clock Configuration Registers | ||||
| 	reg { | ||||
| 		name ="lfrosccfg"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} lfrosccfg @0x70; | ||||
| 	// Backup Registers | ||||
| 	reg { | ||||
| 		name ="lfrosccfg"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} backup[32] @0x80; | ||||
| 	// Power Management Unit | ||||
| 	reg { | ||||
| 		name ="pmuwakeupi"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="delay"; | ||||
| 		} delay[3:0]; | ||||
| 		field { | ||||
| 			name="vddpaden"; | ||||
| 		} vddpaden[5:5]; | ||||
| 		field { | ||||
| 			name="corerst"; | ||||
| 		} corerst[7:7]; | ||||
| 		field { | ||||
| 			name="hfclkrst"; | ||||
| 		} hfclkrst[8:8]; | ||||
| 	} pmuwakeupi[8] @0x0100; | ||||
| 	reg { | ||||
| 		name ="pmusleepi"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="delay"; | ||||
| 		} delay[3:0]; | ||||
| 		field { | ||||
| 			name="vddpaden"; | ||||
| 		} vddpaden[5:5]; | ||||
| 		field { | ||||
| 			name="corerst"; | ||||
| 		} corerst[7:7]; | ||||
| 		field { | ||||
| 			name="hfclkrst"; | ||||
| 		} hfclkrst[8:8]; | ||||
| 	} pmusleepi[8] @0x0120; | ||||
| 	reg { | ||||
| 		name ="pmuie"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} pmuie @0x0140; | ||||
| 	reg { | ||||
| 		name ="pmucause"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} pmucause @0x0144; | ||||
| 	reg { | ||||
| 		name ="pmusleep"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} pmusleep @0x0148; | ||||
| 	reg { | ||||
| 		name ="pmukey"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} pmukey @0x014C; | ||||
| }; | ||||
							
								
								
									
										27
									
								
								platform/gen_input/clint.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								platform/gen_input/clint.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| regfile clint_regs { | ||||
| 	reg { | ||||
| 		name = "msip"; | ||||
| 		desc = "Hart 0 software interrupt register"; | ||||
| 		field { | ||||
| 			name="msip"; | ||||
| 		} msip[0:0]; | ||||
| 	} msip @0; | ||||
| 	reg { | ||||
| 		name = "mtimecmp"; | ||||
| 		desc = "Hart 0 time comparator register"; | ||||
| 		regwidth=64; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 			fieldwidth=64; | ||||
| 		} data = 64'h7FFFFFFFFFFFFFFF; | ||||
| 	} mtimecmp @0x4000; | ||||
| 	reg { | ||||
| 		name = "mtime"; | ||||
| 		desc = "Timer register"; | ||||
| 		regwidth=64; | ||||
| 		field { | ||||
| 			fieldwidth=64; | ||||
| 			name="data"; | ||||
| 		} data[63:0]; | ||||
| 	} mtime @0xBFF8; | ||||
| }; | ||||
							
								
								
									
										24
									
								
								platform/gen_input/fe310.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								platform/gen_input/fe310.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| `include "gpio.rdl" | ||||
| `include "uart.rdl" | ||||
| `include "spi.rdl" | ||||
| `include "plic.rdl" | ||||
| `include "aon.rdl" | ||||
| `include "prci.rdl" | ||||
| `include "clint.rdl" | ||||
|  | ||||
| addrmap e300_plat_t { | ||||
| 	lsb0; | ||||
| 	clint_regs clint @0x02000000; | ||||
|     plic_regs  plic  @0x0C000000; | ||||
|     aon_regs   aon   @0x10000000; | ||||
|     prci_regs  prci  @0x10008000; | ||||
|     gpio_regs  gpio0 @0x10012000; | ||||
|     uart_regs  uart0 @0x10013000; | ||||
|     spi_regs   qspi0 @0x10014000;   | ||||
|     //pwm_regs pwm0  @0x10015000; | ||||
|     uart_regs  uart1 @0x10023000; | ||||
|     spi_regs   qspi1 @0x10024000;   | ||||
|     //pwm_regs pwm1  @0x10025000; | ||||
|     spi_regs   qspi2 @0x10034000;   | ||||
|     //pwm_regs pwm2  @0x10035000; | ||||
| } e300_plat; | ||||
							
								
								
									
										121
									
								
								platform/gen_input/gpio.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								platform/gen_input/gpio.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| regfile gpio_regs { | ||||
| 	reg { | ||||
| 		name="value"; | ||||
| 		desc="pin value"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} value @0x000; | ||||
| 	reg { | ||||
| 		name="input_en"; | ||||
| 		desc="* pin input enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} input_en @0x004; | ||||
| 	reg { | ||||
| 		name="output_en"; | ||||
| 		desc="pin output enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} output_en @0x008; | ||||
| 	reg { | ||||
| 		name="port"; | ||||
| 		desc="output port value"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} port @0x00C; | ||||
| 	reg { | ||||
| 		name="pue"; | ||||
| 		desc="internal pull-up enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} pue @0x010; | ||||
| 	reg { | ||||
| 		name="ds"; | ||||
| 		desc="Pin Drive Strength"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} ds @0x014; | ||||
| 	reg { | ||||
| 		name="rise_ie"; | ||||
| 		desc="rise interrupt enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} rise_ie @0x018; | ||||
| 	reg { | ||||
| 		name="rise_ip"; | ||||
| 		desc="rise interrupt pending"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} rise_ip @0x01C; | ||||
| 	reg { | ||||
| 		name="fall_ie"; | ||||
| 		desc="fall interrupt enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} fall_ie @0x020; | ||||
| 	reg { | ||||
| 		name="fall_ip"; | ||||
| 		desc="fall interrupt pending"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} fall_ip @0x024; | ||||
| 	reg { | ||||
| 		name="high_ie"; | ||||
| 		desc="high interrupt enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} high_ie @0x028; | ||||
| 	reg { | ||||
| 		name="high_ip"; | ||||
| 		desc="high interrupt pending"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} high_ip @0x02C; | ||||
| 	reg { | ||||
| 		name="low_ie"; | ||||
| 		desc="low interrupt enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} low_ie @0x030; | ||||
| 	reg { | ||||
| 		name="low_ip"; | ||||
| 		desc="low interrupt pending"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} low_ip @0x034; | ||||
| 	reg { | ||||
| 		name="iof_en"; | ||||
| 		desc="HW I/O Function enable"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} iof_en @0x038; | ||||
| 	reg { | ||||
| 		name="iof_sel"; | ||||
| 		desc="HW I/O Function select"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} iof_sel @0x03C; | ||||
| 	reg { | ||||
| 		name="out_xor"; | ||||
| 		desc="Output XOR (invert)"; | ||||
| 		field { | ||||
| 			name = "data"; | ||||
| 		} data[31:0]; | ||||
| 	} out_xor @0x040; | ||||
| }; | ||||
							
								
								
									
										27
									
								
								platform/gen_input/plic.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								platform/gen_input/plic.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| regfile plic_regs { | ||||
| 	reg { | ||||
| 		name="priority"; | ||||
| 		desc="interrupt source priority"; | ||||
| 		field {} priority[2:0]; | ||||
| 	} priority[256] @0x000; | ||||
| 	reg { | ||||
| 		name="pending"; | ||||
| 		desc="pending irq"; | ||||
| 		field {} pending[31:0]; | ||||
| 	} pending[8] @0x1000; | ||||
| 	reg { | ||||
| 		name="enabled"; | ||||
| 		desc="enabled interrupts"; | ||||
| 		field {} enabled[31:0]; | ||||
| 	} enabled[8] @0x2000; | ||||
| 	reg { | ||||
| 		name="threshold"; | ||||
| 		desc="interrupt priority threshold"; | ||||
| 		field {} \threshold[2:0]; | ||||
| 	} \threshold @0x200000; | ||||
| 	reg { | ||||
| 		name="claim/complete"; | ||||
| 		desc="interrupt handling completed"; | ||||
| 		field {} interrupt_claimed[31:0]; | ||||
| 	} claim_complete @0x200004; | ||||
| }; | ||||
							
								
								
									
										41
									
								
								platform/gen_input/prci.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								platform/gen_input/prci.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| regfile prci_regs { | ||||
| 	reg { | ||||
| 		name ="hfrosccfg"; | ||||
| 		desc = ""; | ||||
| 		field {} hfroscdiv[5:0]; | ||||
| 		field {} hfrosctrim[20:16]; | ||||
| 		field {} hfroscen[30:30]; | ||||
| 		field {} hfroscrdy[31:31]; | ||||
| 	} hfrosccfg @0x00; | ||||
| 	reg { | ||||
| 		name ="hfxosccfg"; | ||||
| 		desc = ""; | ||||
| 		field {} hfxoscrdy[31:31]; | ||||
| 		field {} hfxoscen[30:30]; | ||||
| 	} hfxosccfg @0x04; | ||||
|      reg { | ||||
|         name ="pllcfg"; | ||||
|         desc = ""; | ||||
|         field {} pllr[2:0]; | ||||
|         field {} pllf[9:4]; | ||||
|         field {} pllq[11:10]; | ||||
|         field {} pllsel[16:16]; | ||||
|         field {} pllrefsel[17:17]; | ||||
|         field {} pllbypass[18:18]; | ||||
|         field {} plllock[31:31]; | ||||
|     } pllcfg @0x08; | ||||
| 	reg { | ||||
| 		name ="plloutdiv"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} plloutdiv  @0x0c; | ||||
| 	reg { | ||||
| 		name ="coreclkcfg"; | ||||
| 		desc = ""; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[31:0]; | ||||
| 	} coreclkcfg @0x10; | ||||
| }; | ||||
							
								
								
									
										173
									
								
								platform/gen_input/spi.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								platform/gen_input/spi.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| regfile spi_regs { | ||||
| 	reg { | ||||
| 		name="sckdiv"; | ||||
| 		desc="Serial clock divisor"; | ||||
| 		field { | ||||
| 			name ="div"; | ||||
| 		} div[12]; | ||||
| 	} sckdiv @0x000; | ||||
| 	reg { | ||||
| 		name="sckmode"; | ||||
| 		desc="Serial clock mode"; | ||||
| 		field { | ||||
| 			name="pha"; | ||||
| 		} pha[1]; | ||||
| 		field { | ||||
| 			name="pol"; | ||||
| 		} pol[1]; | ||||
| 	} sckmode @0x004; | ||||
| 	reg { | ||||
| 		name="csid"; | ||||
| 		desc="Chip select ID"; | ||||
| 		field { | ||||
| 			name="csid"; | ||||
| 		} csid[32]; | ||||
| 	} csid @0x010; | ||||
| 	reg { | ||||
| 		name="csdef"; | ||||
| 		desc="Chip select default"; | ||||
| 		field { | ||||
| 			name="csdef"; | ||||
| 		} csdef[32]; | ||||
| 	} csdef @0x014; | ||||
| 	reg { | ||||
| 		name="csmode"; | ||||
| 		desc="Chip select mode"; | ||||
| 		field { | ||||
| 			name="mode"; | ||||
| 		} mode[2]; | ||||
| 	} csmode @0x018; | ||||
| 	reg { | ||||
| 		name="delay0"; | ||||
| 		desc="Delay control 0"; | ||||
| 		field { | ||||
| 			name="cssck"; | ||||
| 		} cssck[7:0]; | ||||
| 		field { | ||||
| 			name ="sckcs"; | ||||
| 		} sckcs[23:16]; | ||||
| 	} delay0 @0x028; | ||||
| 	reg { | ||||
| 		name="delay1"; | ||||
| 		desc="Delay control 1"; | ||||
| 		field { | ||||
| 			name="intercs";			 | ||||
| 		}intercs[15:0]; | ||||
| 		field { | ||||
| 			name="interxfr"; | ||||
| 		} interxfr[23:16]; | ||||
| 	} delay1 @0x02C; | ||||
| 	reg { | ||||
| 		name="fmt"; | ||||
| 		desc="Frame format"; | ||||
| 		field{ | ||||
| 			name ="proto"; | ||||
| 		}proto[2]; | ||||
| 		field { | ||||
| 			name="endian"; | ||||
| 		} endian[1]; | ||||
| 		field { | ||||
| 			name="dir"; | ||||
| 		} dir[1]; | ||||
| 		field { | ||||
| 			name="len"; | ||||
| 		} len[19:16]; | ||||
| 	} fmt @0x040; | ||||
| 	reg { | ||||
| 		name="txdata"; | ||||
| 		desc="Tx FIFO data"; | ||||
| 		field { | ||||
| 			name="data"; | ||||
| 		} data[8]; | ||||
| 		field { | ||||
| 			name="full"; | ||||
| 		} full[31:31]; | ||||
| 	} txdata @0x048; | ||||
| 	reg { | ||||
| 		name="rxdata"; | ||||
| 		desc="Rx FIFO data"; | ||||
| 		field{ | ||||
| 			name="data"; | ||||
| 		} data[8]; | ||||
| 		field{ | ||||
| 			name="empty"; | ||||
| 		} empty[31:31]; | ||||
| 	} rxdata @0x04C; | ||||
| 	reg { | ||||
| 		name="txmark"; | ||||
| 		desc="Tx FIFO watermark"; | ||||
| 		field { | ||||
| 			name="txmark"; | ||||
| 		} txmark[3]; | ||||
| 	} txmark @0x050; | ||||
| 	reg { | ||||
| 		name="rxmark"; | ||||
| 		desc="Rx FIFO watermark"; | ||||
| 		field { | ||||
| 			name="rxmark"; | ||||
| 		} rxmark[3]; | ||||
| 	} rxmark @0x054; | ||||
| 	reg { | ||||
| 		name="fctrl"; | ||||
| 		desc="SPI flash interface control"; | ||||
| 		field { | ||||
| 			name="en"; | ||||
| 		} en[1]; | ||||
| 	} fctrl @0x060; | ||||
| 	reg { | ||||
| 		name="ffmt"; | ||||
| 		desc="SPI flash instruction format"; | ||||
| 		field { | ||||
| 			name="cmd_en"; | ||||
| 			reset=0x1; | ||||
| 		} cmd_en[1]; | ||||
| 		field { | ||||
| 			name="addr_len"; | ||||
| 			reset=0x3; | ||||
| 		} addr_len[2]; | ||||
| 		field { | ||||
| 			name="pad_cnt"; | ||||
| 			reset=0x0; | ||||
| 		} pad_cnt[4]; | ||||
| 		field { | ||||
| 			name="cmd_proto"; | ||||
| 			reset=0x0; | ||||
| 		} cmd_proto[2]; | ||||
| 		field { | ||||
| 			name="addr_proto"; | ||||
| 			reset=0x0; | ||||
| 		} addr_proto[2]; | ||||
| 		field { | ||||
| 			name="data_proto"; | ||||
| 			reset=0x0; | ||||
| 		} data_proto[2]; | ||||
| 		field { | ||||
| 			name="cmd_code"; | ||||
| 			reset=0x3; | ||||
| 		} cmd_code[23:16]; | ||||
| 		field { | ||||
| 			name="pad_code"; | ||||
| 			reset=0x0; | ||||
| 		} pad_code[8]; | ||||
| 	} ffmt @0x064; | ||||
| 	reg { | ||||
| 		name="ie"; | ||||
| 		desc="SPI interrupt enable"; | ||||
| 		field{ | ||||
| 			name="txwm"; | ||||
| 		} txwm[1]; | ||||
| 		field{ | ||||
| 			name="rxwm"; | ||||
| 		} rxwm[1]; | ||||
| 	} ie @0x070; | ||||
| 	reg { | ||||
| 		name="ip"; | ||||
| 		desc="SPI interrupt pending"; | ||||
| 		field{ | ||||
| 			name="txwm"; | ||||
| 		} txwm[1]; | ||||
| 		field{ | ||||
| 			name="rxwm"; | ||||
| 		} rxwm[1]; | ||||
| 	} ip @0x074; | ||||
| }; | ||||
							
								
								
									
										46
									
								
								platform/gen_input/uart.rdl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								platform/gen_input/uart.rdl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| regfile uart_regs { | ||||
| 	reg { | ||||
| 		name="txdata"; | ||||
| 		desc="Transmit data register"; | ||||
| 		field {} data[7:0]; | ||||
| 		field {} full[31:31]; | ||||
| 	} txdata @0x00; | ||||
| 	reg { | ||||
| 		name="rxdata"; | ||||
| 		desc="Receive data register"; | ||||
| 		field {} data[7:0]; | ||||
| 		field {} empty[31:31]; | ||||
| 	}rxdata @0x04; | ||||
| 	reg { | ||||
| 		name="txctrl"; | ||||
| 		desc="Transmit control register"; | ||||
| 		field {} txen[1]; | ||||
| 		field {} nstop[1]; | ||||
| 		field {} txcnt[18:16]; | ||||
| 	}txctrl @0x08; | ||||
| 	reg { | ||||
| 		name="rxctrl"; | ||||
| 		desc="Receive control register"; | ||||
| 		field {} rxen[1]; | ||||
| 		field {} rxcnt[18:16]; | ||||
| 	}rxctrl @0x0C; | ||||
| 	reg { | ||||
| 		name="ie"; | ||||
| 		desc="UART interrupt enable"; | ||||
| 		field{} txwm[1]; | ||||
| 		field{} rxwm[1]; | ||||
| 	}ie @0x10; | ||||
| 	reg { | ||||
| 		name="ip"; | ||||
| 		desc="UART Interrupt pending"; | ||||
| 		field{} txwm[1]; | ||||
| 		field{} rxwm[1]; | ||||
| 	} ip @0x14; | ||||
| 	reg { | ||||
| 		name="div"; | ||||
| 		desc="Baud rate divisor"; | ||||
| 		field{} div[16]; | ||||
| 	} div @0x18; | ||||
| }; | ||||
|  | ||||
|        | ||||
							
								
								
									
										67
									
								
								platform/incl/sysc/SiFive/aon.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								platform/incl/sysc/SiFive/aon.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _AON_H_ | ||||
| #define _AON_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class aon_regs; | ||||
|  | ||||
| class aon : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(aon); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool> erst_n_i; | ||||
|     sc_core::sc_out<sc_core::sc_time> lfclkc_o; | ||||
|     sc_core::sc_out<bool> rst_o; | ||||
|     aon(sc_core::sc_module_name nm); | ||||
|     virtual ~aon() override; // need to keep it in source file because of fwd declaration of aon_regs | ||||
|  | ||||
| protected: | ||||
|     void start_of_simulation() override; | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void reset_internal_cb(); | ||||
|     sc_core::sc_time clk; | ||||
|     std::unique_ptr<aon_regs> regs; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _GPIO_H_ */ | ||||
							
								
								
									
										78
									
								
								platform/incl/sysc/SiFive/clint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								platform/incl/sysc/SiFive/clint.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _CLINT_H_ | ||||
| #define _CLINT_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
|  | ||||
| namespace iss { | ||||
| namespace arch { | ||||
| template <typename BASE> class riscv_hart_msu_vp; | ||||
| } | ||||
| } | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class clint_regs; | ||||
| namespace SiFive { | ||||
| class core_complex; | ||||
| } | ||||
|  | ||||
| class clint : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(clint); | ||||
|     sc_core::sc_in<sc_core::sc_time> tlclk_i; | ||||
|     sc_core::sc_in<sc_core::sc_time> lfclk_i; | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     sc_core::sc_out<bool> mtime_int_o; | ||||
|     sc_core::sc_out<bool> msip_int_o; | ||||
|     clint(sc_core::sc_module_name nm); | ||||
|     virtual ~clint() override; // need to keep it in source file because of fwd declaration of clint_regs | ||||
|  | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void update_mtime(); | ||||
|     sc_core::sc_time clk, last_updt; | ||||
|     unsigned cnt_fraction; | ||||
|     std::unique_ptr<clint_regs> regs; | ||||
|     sc_core::sc_event mtime_evt; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _CLINT_H_ */ | ||||
							
								
								
									
										180
									
								
								platform/incl/sysc/SiFive/gen/aon_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								platform/incl/sysc/SiFive/gen/aon_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      aon_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _AON_REGS_H_ | ||||
| #define _AON_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class aon_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     uint32_t r_wdogcfg; | ||||
|      | ||||
|     uint32_t r_wdogcount; | ||||
|      | ||||
|     uint32_t r_wdogs; | ||||
|      | ||||
|     uint32_t r_wdogfeed; | ||||
|      | ||||
|     uint32_t r_wdogkey; | ||||
|      | ||||
|     uint32_t r_wdogcmp; | ||||
|      | ||||
|     uint32_t r_rtccfg; | ||||
|      | ||||
|     uint32_t r_rtclo; | ||||
|      | ||||
|     uint32_t r_rtchi; | ||||
|      | ||||
|     uint32_t r_rtcs; | ||||
|      | ||||
|     uint32_t r_rtccmp; | ||||
|      | ||||
|     uint32_t r_lfrosccfg; | ||||
|      | ||||
|     std::array<uint32_t, 32> r_backup; | ||||
|      | ||||
|     BEGIN_BF_DECL(pmuwakeupi_t, uint32_t); | ||||
|         BF_FIELD(delay, 0, 4); | ||||
|         BF_FIELD(vddpaden, 5, 1); | ||||
|         BF_FIELD(corerst, 7, 1); | ||||
|         BF_FIELD(hfclkrst, 8, 1); | ||||
|     END_BF_DECL() ; | ||||
|     std::array<pmuwakeupi_t, 8> r_pmuwakeupi; | ||||
|      | ||||
|     BEGIN_BF_DECL(pmusleepi_t, uint32_t); | ||||
|         BF_FIELD(delay, 0, 4); | ||||
|         BF_FIELD(vddpaden, 5, 1); | ||||
|         BF_FIELD(corerst, 7, 1); | ||||
|         BF_FIELD(hfclkrst, 8, 1); | ||||
|     END_BF_DECL() ; | ||||
|     std::array<pmusleepi_t, 8> r_pmusleepi; | ||||
|      | ||||
|     uint32_t r_pmuie; | ||||
|      | ||||
|     uint32_t r_pmucause; | ||||
|      | ||||
|     uint32_t r_pmusleep; | ||||
|      | ||||
|     uint32_t r_pmukey; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<uint32_t> wdogcfg; | ||||
|     scc::sc_register<uint32_t> wdogcount; | ||||
|     scc::sc_register<uint32_t> wdogs; | ||||
|     scc::sc_register<uint32_t> wdogfeed; | ||||
|     scc::sc_register<uint32_t> wdogkey; | ||||
|     scc::sc_register<uint32_t> wdogcmp; | ||||
|     scc::sc_register<uint32_t> rtccfg; | ||||
|     scc::sc_register<uint32_t> rtclo; | ||||
|     scc::sc_register<uint32_t> rtchi; | ||||
|     scc::sc_register<uint32_t> rtcs; | ||||
|     scc::sc_register<uint32_t> rtccmp; | ||||
|     scc::sc_register<uint32_t> lfrosccfg; | ||||
|     scc::sc_register_indexed<uint32_t, 32> backup; | ||||
|     scc::sc_register_indexed<pmuwakeupi_t, 8> pmuwakeupi; | ||||
|     scc::sc_register_indexed<pmusleepi_t, 8> pmusleepi; | ||||
|     scc::sc_register<uint32_t> pmuie; | ||||
|     scc::sc_register<uint32_t> pmucause; | ||||
|     scc::sc_register<uint32_t> pmusleep; | ||||
|     scc::sc_register<uint32_t> pmukey; | ||||
|      | ||||
|     aon_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::aon_regs::aon_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(wdogcfg, r_wdogcfg, 0, *this) | ||||
| , NAMED(wdogcount, r_wdogcount, 0, *this) | ||||
| , NAMED(wdogs, r_wdogs, 0, *this) | ||||
| , NAMED(wdogfeed, r_wdogfeed, 0, *this) | ||||
| , NAMED(wdogkey, r_wdogkey, 0, *this) | ||||
| , NAMED(wdogcmp, r_wdogcmp, 0, *this) | ||||
| , NAMED(rtccfg, r_rtccfg, 0, *this) | ||||
| , NAMED(rtclo, r_rtclo, 0, *this) | ||||
| , NAMED(rtchi, r_rtchi, 0, *this) | ||||
| , NAMED(rtcs, r_rtcs, 0, *this) | ||||
| , NAMED(rtccmp, r_rtccmp, 0, *this) | ||||
| , NAMED(lfrosccfg, r_lfrosccfg, 0, *this) | ||||
| , NAMED(backup, r_backup, 0, *this) | ||||
| , NAMED(pmuwakeupi, r_pmuwakeupi, 0, *this) | ||||
| , NAMED(pmusleepi, r_pmusleepi, 0, *this) | ||||
| , NAMED(pmuie, r_pmuie, 0, *this) | ||||
| , NAMED(pmucause, r_pmucause, 0, *this) | ||||
| , NAMED(pmusleep, r_pmusleep, 0, *this) | ||||
| , NAMED(pmukey, r_pmukey, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::aon_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(wdogcfg, 0x0UL); | ||||
|     target.addResource(wdogcount, 0x8UL); | ||||
|     target.addResource(wdogs, 0x10UL); | ||||
|     target.addResource(wdogfeed, 0x18UL); | ||||
|     target.addResource(wdogkey, 0x1cUL); | ||||
|     target.addResource(wdogcmp, 0x20UL); | ||||
|     target.addResource(rtccfg, 0x40UL); | ||||
|     target.addResource(rtclo, 0x48UL); | ||||
|     target.addResource(rtchi, 0x4cUL); | ||||
|     target.addResource(rtcs, 0x50UL); | ||||
|     target.addResource(rtccmp, 0x60UL); | ||||
|     target.addResource(lfrosccfg, 0x70UL); | ||||
|     target.addResource(backup, 0x80UL); | ||||
|     target.addResource(pmuwakeupi, 0x100UL); | ||||
|     target.addResource(pmusleepi, 0x120UL); | ||||
|     target.addResource(pmuie, 0x140UL); | ||||
|     target.addResource(pmucause, 0x144UL); | ||||
|     target.addResource(pmusleep, 0x148UL); | ||||
|     target.addResource(pmukey, 0x14cUL); | ||||
| } | ||||
|  | ||||
| #endif // _AON_REGS_H_ | ||||
							
								
								
									
										90
									
								
								platform/incl/sysc/SiFive/gen/clint_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								platform/incl/sysc/SiFive/gen/clint_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      clint_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _CLINT_REGS_H_ | ||||
| #define _CLINT_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class clint_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     BEGIN_BF_DECL(msip_t, uint32_t); | ||||
|         BF_FIELD(msip, 0, 1); | ||||
|     END_BF_DECL() r_msip; | ||||
|      | ||||
|     uint64_t r_mtimecmp; | ||||
|      | ||||
|     uint64_t r_mtime; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<msip_t> msip; | ||||
|     scc::sc_register<uint64_t> mtimecmp; | ||||
|     scc::sc_register<uint64_t> mtime; | ||||
|      | ||||
|     clint_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::clint_regs::clint_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(msip, r_msip, 0, *this) | ||||
| , NAMED(mtimecmp, r_mtimecmp, 0, *this) | ||||
| , NAMED(mtime, r_mtime, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::clint_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(msip, 0x0UL); | ||||
|     target.addResource(mtimecmp, 0x4000UL); | ||||
|     target.addResource(mtime, 0xbff8UL); | ||||
| } | ||||
|  | ||||
| #endif // _CLINT_REGS_H_ | ||||
							
								
								
									
										17
									
								
								platform/incl/sysc/SiFive/gen/e300_plat_t.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								platform/incl/sysc/SiFive/gen/e300_plat_t.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| #ifndef _E300_PLAT_MAP_H_ | ||||
| #define _E300_PLAT_MAP_H_ | ||||
| // need double braces, see https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191 | ||||
| const std::array<scc::target_memory_map_entry<32>, 10> e300_plat_map = {{ | ||||
|     {&i_clint, 0x2000000, 0xc000}, | ||||
|     {&i_plic, 0xc000000, 0x200008}, | ||||
|     {&i_aon, 0x10000000, 0x150}, | ||||
|     {&i_prci, 0x10008000, 0x14}, | ||||
|     {&i_gpio0, 0x10012000, 0x44}, | ||||
|     {&i_uart0, 0x10013000, 0x1c}, | ||||
|     {&i_qspi0, 0x10014000, 0x78}, | ||||
|     {&i_uart1, 0x10023000, 0x1c}, | ||||
|     {&i_qspi1, 0x10024000, 0x78}, | ||||
|     {&i_qspi2, 0x10034000, 0x78}, | ||||
| }}; | ||||
|  | ||||
| #endif /* _E300_PLAT_MAP_H_ */ | ||||
							
								
								
									
										158
									
								
								platform/incl/sysc/SiFive/gen/gpio_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								platform/incl/sysc/SiFive/gen/gpio_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      gpio_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _GPIO_REGS_H_ | ||||
| #define _GPIO_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class gpio_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     uint32_t r_value; | ||||
|      | ||||
|     uint32_t r_input_en; | ||||
|      | ||||
|     uint32_t r_output_en; | ||||
|      | ||||
|     uint32_t r_port; | ||||
|      | ||||
|     uint32_t r_pue; | ||||
|      | ||||
|     uint32_t r_ds; | ||||
|      | ||||
|     uint32_t r_rise_ie; | ||||
|      | ||||
|     uint32_t r_rise_ip; | ||||
|      | ||||
|     uint32_t r_fall_ie; | ||||
|      | ||||
|     uint32_t r_fall_ip; | ||||
|      | ||||
|     uint32_t r_high_ie; | ||||
|      | ||||
|     uint32_t r_high_ip; | ||||
|      | ||||
|     uint32_t r_low_ie; | ||||
|      | ||||
|     uint32_t r_low_ip; | ||||
|      | ||||
|     uint32_t r_iof_en; | ||||
|      | ||||
|     uint32_t r_iof_sel; | ||||
|      | ||||
|     uint32_t r_out_xor; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<uint32_t> value; | ||||
|     scc::sc_register<uint32_t> input_en; | ||||
|     scc::sc_register<uint32_t> output_en; | ||||
|     scc::sc_register<uint32_t> port; | ||||
|     scc::sc_register<uint32_t> pue; | ||||
|     scc::sc_register<uint32_t> ds; | ||||
|     scc::sc_register<uint32_t> rise_ie; | ||||
|     scc::sc_register<uint32_t> rise_ip; | ||||
|     scc::sc_register<uint32_t> fall_ie; | ||||
|     scc::sc_register<uint32_t> fall_ip; | ||||
|     scc::sc_register<uint32_t> high_ie; | ||||
|     scc::sc_register<uint32_t> high_ip; | ||||
|     scc::sc_register<uint32_t> low_ie; | ||||
|     scc::sc_register<uint32_t> low_ip; | ||||
|     scc::sc_register<uint32_t> iof_en; | ||||
|     scc::sc_register<uint32_t> iof_sel; | ||||
|     scc::sc_register<uint32_t> out_xor; | ||||
|      | ||||
|     gpio_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::gpio_regs::gpio_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(value, r_value, 0, *this) | ||||
| , NAMED(input_en, r_input_en, 0, *this) | ||||
| , NAMED(output_en, r_output_en, 0, *this) | ||||
| , NAMED(port, r_port, 0, *this) | ||||
| , NAMED(pue, r_pue, 0, *this) | ||||
| , NAMED(ds, r_ds, 0, *this) | ||||
| , NAMED(rise_ie, r_rise_ie, 0, *this) | ||||
| , NAMED(rise_ip, r_rise_ip, 0, *this) | ||||
| , NAMED(fall_ie, r_fall_ie, 0, *this) | ||||
| , NAMED(fall_ip, r_fall_ip, 0, *this) | ||||
| , NAMED(high_ie, r_high_ie, 0, *this) | ||||
| , NAMED(high_ip, r_high_ip, 0, *this) | ||||
| , NAMED(low_ie, r_low_ie, 0, *this) | ||||
| , NAMED(low_ip, r_low_ip, 0, *this) | ||||
| , NAMED(iof_en, r_iof_en, 0, *this) | ||||
| , NAMED(iof_sel, r_iof_sel, 0, *this) | ||||
| , NAMED(out_xor, r_out_xor, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::gpio_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(value, 0x0UL); | ||||
|     target.addResource(input_en, 0x4UL); | ||||
|     target.addResource(output_en, 0x8UL); | ||||
|     target.addResource(port, 0xcUL); | ||||
|     target.addResource(pue, 0x10UL); | ||||
|     target.addResource(ds, 0x14UL); | ||||
|     target.addResource(rise_ie, 0x18UL); | ||||
|     target.addResource(rise_ip, 0x1cUL); | ||||
|     target.addResource(fall_ie, 0x20UL); | ||||
|     target.addResource(fall_ip, 0x24UL); | ||||
|     target.addResource(high_ie, 0x28UL); | ||||
|     target.addResource(high_ip, 0x2cUL); | ||||
|     target.addResource(low_ie, 0x30UL); | ||||
|     target.addResource(low_ip, 0x34UL); | ||||
|     target.addResource(iof_en, 0x38UL); | ||||
|     target.addResource(iof_sel, 0x3cUL); | ||||
|     target.addResource(out_xor, 0x40UL); | ||||
| } | ||||
|  | ||||
| #endif // _GPIO_REGS_H_ | ||||
							
								
								
									
										103
									
								
								platform/incl/sysc/SiFive/gen/plic_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								platform/incl/sysc/SiFive/gen/plic_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      plic_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _PLIC_REGS_H_ | ||||
| #define _PLIC_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class plic_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     BEGIN_BF_DECL(priority_t, uint32_t); | ||||
|         BF_FIELD(priority, 0, 3); | ||||
|     END_BF_DECL() ; | ||||
|     std::array<priority_t, 256> r_priority; | ||||
|      | ||||
|     std::array<uint32_t, 8> r_pending; | ||||
|      | ||||
|     std::array<uint32_t, 8> r_enabled; | ||||
|      | ||||
|     BEGIN_BF_DECL(threshold_t, uint32_t); | ||||
|         BF_FIELD(threshold, 0, 3); | ||||
|     END_BF_DECL() r_threshold; | ||||
|      | ||||
|     uint32_t r_claim_complete; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register_indexed<priority_t, 256> priority; | ||||
|     scc::sc_register_indexed<uint32_t, 8> pending; | ||||
|     scc::sc_register_indexed<uint32_t, 8> enabled; | ||||
|     scc::sc_register<threshold_t> threshold; | ||||
|     scc::sc_register<uint32_t> claim_complete; | ||||
|      | ||||
|     plic_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::plic_regs::plic_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(priority, r_priority, 0, *this) | ||||
| , NAMED(pending, r_pending, 0, *this) | ||||
| , NAMED(enabled, r_enabled, 0, *this) | ||||
| , NAMED(threshold, r_threshold, 0, *this) | ||||
| , NAMED(claim_complete, r_claim_complete, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::plic_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(priority, 0x0UL); | ||||
|     target.addResource(pending, 0x1000UL); | ||||
|     target.addResource(enabled, 0x2000UL); | ||||
|     target.addResource(threshold, 0x200000UL); | ||||
|     target.addResource(claim_complete, 0x200004UL); | ||||
| } | ||||
|  | ||||
| #endif // _PLIC_REGS_H_ | ||||
							
								
								
									
										114
									
								
								platform/incl/sysc/SiFive/gen/prci_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								platform/incl/sysc/SiFive/gen/prci_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      prci_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _PRCI_REGS_H_ | ||||
| #define _PRCI_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class prci_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     BEGIN_BF_DECL(hfrosccfg_t, uint32_t); | ||||
|         BF_FIELD(hfroscdiv, 0, 6); | ||||
|         BF_FIELD(hfrosctrim, 16, 5); | ||||
|         BF_FIELD(hfroscen, 30, 1); | ||||
|         BF_FIELD(hfroscrdy, 31, 1); | ||||
|     END_BF_DECL() r_hfrosccfg; | ||||
|      | ||||
|     BEGIN_BF_DECL(hfxosccfg_t, uint32_t); | ||||
|         BF_FIELD(hfxoscrdy, 31, 1); | ||||
|         BF_FIELD(hfxoscen, 30, 1); | ||||
|     END_BF_DECL() r_hfxosccfg; | ||||
|      | ||||
|     BEGIN_BF_DECL(pllcfg_t, uint32_t); | ||||
|         BF_FIELD(pllr, 0, 3); | ||||
|         BF_FIELD(pllf, 4, 6); | ||||
|         BF_FIELD(pllq, 10, 2); | ||||
|         BF_FIELD(pllsel, 16, 1); | ||||
|         BF_FIELD(pllrefsel, 17, 1); | ||||
|         BF_FIELD(pllbypass, 18, 1); | ||||
|         BF_FIELD(plllock, 31, 1); | ||||
|     END_BF_DECL() r_pllcfg; | ||||
|      | ||||
|     uint32_t r_plloutdiv; | ||||
|      | ||||
|     uint32_t r_coreclkcfg; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<hfrosccfg_t> hfrosccfg; | ||||
|     scc::sc_register<hfxosccfg_t> hfxosccfg; | ||||
|     scc::sc_register<pllcfg_t> pllcfg; | ||||
|     scc::sc_register<uint32_t> plloutdiv; | ||||
|     scc::sc_register<uint32_t> coreclkcfg; | ||||
|      | ||||
|     prci_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::prci_regs::prci_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(hfrosccfg, r_hfrosccfg, 0, *this) | ||||
| , NAMED(hfxosccfg, r_hfxosccfg, 0x40000000, *this) | ||||
| , NAMED(pllcfg, r_pllcfg, 0, *this) | ||||
| , NAMED(plloutdiv, r_plloutdiv, 0, *this) | ||||
| , NAMED(coreclkcfg, r_coreclkcfg, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::prci_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(hfrosccfg, 0x0UL); | ||||
|     target.addResource(hfxosccfg, 0x4UL); | ||||
|     target.addResource(pllcfg, 0x8UL); | ||||
|     target.addResource(plloutdiv, 0xcUL); | ||||
|     target.addResource(coreclkcfg, 0x10UL); | ||||
| } | ||||
|  | ||||
| #endif // _PRCI_REGS_H_ | ||||
							
								
								
									
										198
									
								
								platform/incl/sysc/SiFive/gen/spi_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								platform/incl/sysc/SiFive/gen/spi_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,198 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      spi_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _SPI_REGS_H_ | ||||
| #define _SPI_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class spi_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     BEGIN_BF_DECL(sckdiv_t, uint32_t); | ||||
|         BF_FIELD(div, 0, 12); | ||||
|     END_BF_DECL() r_sckdiv; | ||||
|      | ||||
|     BEGIN_BF_DECL(sckmode_t, uint32_t); | ||||
|         BF_FIELD(pha, 0, 1); | ||||
|         BF_FIELD(pol, 1, 1); | ||||
|     END_BF_DECL() r_sckmode; | ||||
|      | ||||
|     uint32_t r_csid; | ||||
|      | ||||
|     uint32_t r_csdef; | ||||
|      | ||||
|     BEGIN_BF_DECL(csmode_t, uint32_t); | ||||
|         BF_FIELD(mode, 0, 2); | ||||
|     END_BF_DECL() r_csmode; | ||||
|      | ||||
|     BEGIN_BF_DECL(delay0_t, uint32_t); | ||||
|         BF_FIELD(cssck, 0, 8); | ||||
|         BF_FIELD(sckcs, 16, 8); | ||||
|     END_BF_DECL() r_delay0; | ||||
|      | ||||
|     BEGIN_BF_DECL(delay1_t, uint32_t); | ||||
|         BF_FIELD(intercs, 0, 16); | ||||
|         BF_FIELD(interxfr, 16, 8); | ||||
|     END_BF_DECL() r_delay1; | ||||
|      | ||||
|     BEGIN_BF_DECL(fmt_t, uint32_t); | ||||
|         BF_FIELD(proto, 0, 2); | ||||
|         BF_FIELD(endian, 2, 1); | ||||
|         BF_FIELD(dir, 3, 1); | ||||
|         BF_FIELD(len, 16, 4); | ||||
|     END_BF_DECL() r_fmt; | ||||
|      | ||||
|     BEGIN_BF_DECL(txdata_t, uint32_t); | ||||
|         BF_FIELD(data, 0, 8); | ||||
|         BF_FIELD(full, 31, 1); | ||||
|     END_BF_DECL() r_txdata; | ||||
|      | ||||
|     BEGIN_BF_DECL(rxdata_t, uint32_t); | ||||
|         BF_FIELD(data, 0, 8); | ||||
|         BF_FIELD(empty, 31, 1); | ||||
|     END_BF_DECL() r_rxdata; | ||||
|      | ||||
|     BEGIN_BF_DECL(txmark_t, uint32_t); | ||||
|         BF_FIELD(txmark, 0, 3); | ||||
|     END_BF_DECL() r_txmark; | ||||
|      | ||||
|     BEGIN_BF_DECL(rxmark_t, uint32_t); | ||||
|         BF_FIELD(rxmark, 0, 3); | ||||
|     END_BF_DECL() r_rxmark; | ||||
|      | ||||
|     BEGIN_BF_DECL(fctrl_t, uint32_t); | ||||
|         BF_FIELD(en, 0, 1); | ||||
|     END_BF_DECL() r_fctrl; | ||||
|      | ||||
|     BEGIN_BF_DECL(ffmt_t, uint32_t); | ||||
|         BF_FIELD(cmd_en, 0, 1); | ||||
|         BF_FIELD(addr_len, 1, 2); | ||||
|         BF_FIELD(pad_cnt, 3, 4); | ||||
|         BF_FIELD(cmd_proto, 7, 2); | ||||
|         BF_FIELD(addr_proto, 9, 2); | ||||
|         BF_FIELD(data_proto, 11, 2); | ||||
|         BF_FIELD(cmd_code, 16, 8); | ||||
|         BF_FIELD(pad_code, 24, 8); | ||||
|     END_BF_DECL() r_ffmt; | ||||
|      | ||||
|     BEGIN_BF_DECL(ie_t, uint32_t); | ||||
|         BF_FIELD(txwm, 0, 1); | ||||
|         BF_FIELD(rxwm, 1, 1); | ||||
|     END_BF_DECL() r_ie; | ||||
|      | ||||
|     BEGIN_BF_DECL(ip_t, uint32_t); | ||||
|         BF_FIELD(txwm, 0, 1); | ||||
|         BF_FIELD(rxwm, 1, 1); | ||||
|     END_BF_DECL() r_ip; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<sckdiv_t> sckdiv; | ||||
|     scc::sc_register<sckmode_t> sckmode; | ||||
|     scc::sc_register<uint32_t> csid; | ||||
|     scc::sc_register<uint32_t> csdef; | ||||
|     scc::sc_register<csmode_t> csmode; | ||||
|     scc::sc_register<delay0_t> delay0; | ||||
|     scc::sc_register<delay1_t> delay1; | ||||
|     scc::sc_register<fmt_t> fmt; | ||||
|     scc::sc_register<txdata_t> txdata; | ||||
|     scc::sc_register<rxdata_t> rxdata; | ||||
|     scc::sc_register<txmark_t> txmark; | ||||
|     scc::sc_register<rxmark_t> rxmark; | ||||
|     scc::sc_register<fctrl_t> fctrl; | ||||
|     scc::sc_register<ffmt_t> ffmt; | ||||
|     scc::sc_register<ie_t> ie; | ||||
|     scc::sc_register<ip_t> ip; | ||||
|      | ||||
|     spi_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::spi_regs::spi_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(sckdiv, r_sckdiv, 0, *this) | ||||
| , NAMED(sckmode, r_sckmode, 0, *this) | ||||
| , NAMED(csid, r_csid, 0, *this) | ||||
| , NAMED(csdef, r_csdef, 0, *this) | ||||
| , NAMED(csmode, r_csmode, 0, *this) | ||||
| , NAMED(delay0, r_delay0, 0, *this) | ||||
| , NAMED(delay1, r_delay1, 0, *this) | ||||
| , NAMED(fmt, r_fmt, 0, *this) | ||||
| , NAMED(txdata, r_txdata, 0, *this) | ||||
| , NAMED(rxdata, r_rxdata, 0, *this) | ||||
| , NAMED(txmark, r_txmark, 0, *this) | ||||
| , NAMED(rxmark, r_rxmark, 0, *this) | ||||
| , NAMED(fctrl, r_fctrl, 0, *this) | ||||
| , NAMED(ffmt, r_ffmt, 0, *this) | ||||
| , NAMED(ie, r_ie, 0, *this) | ||||
| , NAMED(ip, r_ip, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::spi_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(sckdiv, 0x0UL); | ||||
|     target.addResource(sckmode, 0x4UL); | ||||
|     target.addResource(csid, 0x10UL); | ||||
|     target.addResource(csdef, 0x14UL); | ||||
|     target.addResource(csmode, 0x18UL); | ||||
|     target.addResource(delay0, 0x28UL); | ||||
|     target.addResource(delay1, 0x2cUL); | ||||
|     target.addResource(fmt, 0x40UL); | ||||
|     target.addResource(txdata, 0x48UL); | ||||
|     target.addResource(rxdata, 0x4cUL); | ||||
|     target.addResource(txmark, 0x50UL); | ||||
|     target.addResource(rxmark, 0x54UL); | ||||
|     target.addResource(fctrl, 0x60UL); | ||||
|     target.addResource(ffmt, 0x64UL); | ||||
|     target.addResource(ie, 0x70UL); | ||||
|     target.addResource(ip, 0x74UL); | ||||
| } | ||||
|  | ||||
| #endif // _SPI_REGS_H_ | ||||
							
								
								
									
										129
									
								
								platform/incl/sysc/SiFive/gen/uart_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								platform/incl/sysc/SiFive/gen/uart_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Fri Nov 10 18:01:53 CET 2017 | ||||
| //             *      uart_regs.h Author: <RDL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _UART_REGS_H_ | ||||
| #define _UART_REGS_H_ | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <util/bit_field.h> | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class uart_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public scc::resetable | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     BEGIN_BF_DECL(txdata_t, uint32_t); | ||||
|         BF_FIELD(data, 0, 8); | ||||
|         BF_FIELD(full, 31, 1); | ||||
|     END_BF_DECL() r_txdata; | ||||
|      | ||||
|     BEGIN_BF_DECL(rxdata_t, uint32_t); | ||||
|         BF_FIELD(data, 0, 8); | ||||
|         BF_FIELD(empty, 31, 1); | ||||
|     END_BF_DECL() r_rxdata; | ||||
|      | ||||
|     BEGIN_BF_DECL(txctrl_t, uint32_t); | ||||
|         BF_FIELD(txen, 0, 1); | ||||
|         BF_FIELD(nstop, 1, 1); | ||||
|         BF_FIELD(txcnt, 16, 3); | ||||
|     END_BF_DECL() r_txctrl; | ||||
|      | ||||
|     BEGIN_BF_DECL(rxctrl_t, uint32_t); | ||||
|         BF_FIELD(rxen, 0, 1); | ||||
|         BF_FIELD(rxcnt, 16, 3); | ||||
|     END_BF_DECL() r_rxctrl; | ||||
|      | ||||
|     BEGIN_BF_DECL(ie_t, uint32_t); | ||||
|         BF_FIELD(txwm, 0, 1); | ||||
|         BF_FIELD(rxwm, 1, 1); | ||||
|     END_BF_DECL() r_ie; | ||||
|      | ||||
|     BEGIN_BF_DECL(ip_t, uint32_t); | ||||
|         BF_FIELD(txwm, 0, 1); | ||||
|         BF_FIELD(rxwm, 1, 1); | ||||
|     END_BF_DECL() r_ip; | ||||
|      | ||||
|     BEGIN_BF_DECL(div_t, uint32_t); | ||||
|         BF_FIELD(div, 0, 16); | ||||
|     END_BF_DECL() r_div; | ||||
|      | ||||
|     // register declarations | ||||
|     scc::sc_register<txdata_t> txdata; | ||||
|     scc::sc_register<rxdata_t> rxdata; | ||||
|     scc::sc_register<txctrl_t> txctrl; | ||||
|     scc::sc_register<rxctrl_t> rxctrl; | ||||
|     scc::sc_register<ie_t> ie; | ||||
|     scc::sc_register<ip_t> ip; | ||||
|     scc::sc_register<div_t> div; | ||||
|      | ||||
|     uart_regs(sc_core::sc_module_name nm); | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(scc::tlm_target<BUSWIDTH>& target); | ||||
| }; | ||||
| } | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| inline sysc::uart_regs::uart_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(txdata, r_txdata, 0, *this) | ||||
| , NAMED(rxdata, r_rxdata, 0, *this) | ||||
| , NAMED(txctrl, r_txctrl, 0, *this) | ||||
| , NAMED(rxctrl, r_rxctrl, 0, *this) | ||||
| , NAMED(ie, r_ie, 0, *this) | ||||
| , NAMED(ip, r_ip, 0, *this) | ||||
| , NAMED(div, r_div, 0, *this) | ||||
| { | ||||
| } | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::uart_regs::registerResources(scc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(txdata, 0x0UL); | ||||
|     target.addResource(rxdata, 0x4UL); | ||||
|     target.addResource(txctrl, 0x8UL); | ||||
|     target.addResource(rxctrl, 0xcUL); | ||||
|     target.addResource(ie, 0x10UL); | ||||
|     target.addResource(ip, 0x14UL); | ||||
|     target.addResource(div, 0x18UL); | ||||
| } | ||||
|  | ||||
| #endif // _UART_REGS_H_ | ||||
							
								
								
									
										91
									
								
								platform/incl/sysc/SiFive/gpio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								platform/incl/sysc/SiFive/gpio.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _GPIO_H_ | ||||
| #define _GPIO_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
| #include "scc/signal_target_mixin.h" | ||||
| #include "scc/signal_initiator_mixin.h" | ||||
| #include <tlm/tlm_signal.h> | ||||
| #include "cci_configuration" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class gpio_regs; | ||||
| class WsHandler; | ||||
|  | ||||
| class gpio : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(gpio); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     // sc_core::sc_inout_rv<32> pins_io; | ||||
|  | ||||
|     sc_core::sc_vector<scc::tlm_signal_logic_out> pins_o; | ||||
|     sc_core::sc_vector<scc::tlm_signal_logic_in>  pins_i; | ||||
|  | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_out> iof0_o; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_out> iof1_o; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_in>  iof0_i; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_in>  iof1_i; | ||||
|  | ||||
|     gpio(sc_core::sc_module_name nm); | ||||
|     virtual ~gpio() override; // need to keep it in source file because of fwd declaration of gpio_regs | ||||
|  | ||||
|     cci::cci_param<bool> write_to_ws; | ||||
|  | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void update_pins(); | ||||
|     void before_end_of_elaboration(); | ||||
|     void pin_input(unsigned int tag, tlm::tlm_signal_gp<sc_logic>& gp, sc_core::sc_time& delay); | ||||
|     void forward_pin_input(unsigned int tag, tlm::tlm_signal_gp<sc_logic>& gp); | ||||
|     void iof_input(unsigned int tag, unsigned iof_idx, tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay); | ||||
|     sc_core::sc_time clk; | ||||
|     std::array<bool, 32> last_iof0, last_iof1; | ||||
|     std::unique_ptr<gpio_regs> regs; | ||||
|     std::shared_ptr<sysc::WsHandler> handler; | ||||
|  | ||||
| private: | ||||
|     tlm::tlm_phase write_output(tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, size_t i, sc_dt::sc_logic val); | ||||
|     void enable_outputs(uint32_t new_iof_en, uint32_t new_iof_sel); | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _GPIO_H_ */ | ||||
							
								
								
									
										101
									
								
								platform/incl/sysc/SiFive/hifive1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								platform/incl/sysc/SiFive/hifive1.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _PLATFORM_H_ | ||||
| #define _PLATFORM_H_ | ||||
|  | ||||
| #include "aon.h" | ||||
| #include "clint.h" | ||||
| #include "gpio.h" | ||||
| #include "plic.h" | ||||
| #include "prci.h" | ||||
| #include "spi.h" | ||||
| #include "uart.h" | ||||
| #include "sysc/core_complex.h" | ||||
|  | ||||
| #include "scc/memory.h" | ||||
| #include "scc/router.h" | ||||
| #include "scc/utilities.h" | ||||
| #include "tlm/tlm_signal_sockets.h" | ||||
| #include <sysc/kernel/sc_module.h> | ||||
| #include <array> | ||||
|  | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class hifive1 : public sc_core::sc_module { | ||||
| public: | ||||
|     SC_HAS_PROCESS(hifive1); | ||||
|  | ||||
|     sc_core::sc_vector<tlm::tlm_signal_initiator_socket<sc_dt::sc_logic>> pins_o; | ||||
|     sc_core::sc_vector<tlm::tlm_signal_target_socket<sc_dt::sc_logic>>    pins_i; | ||||
|  | ||||
|     sc_core::sc_in<bool> erst_n; | ||||
|  | ||||
|     hifive1(sc_core::sc_module_name nm); | ||||
|  | ||||
| private: | ||||
|     SiFive::core_complex i_core_complex; | ||||
|     scc::router<> i_router; | ||||
|     uart i_uart0, i_uart1; | ||||
|     spi i_qspi0, i_qspi1, i_qspi2; | ||||
|     gpio i_gpio0; | ||||
|     plic i_plic; | ||||
|     aon i_aon; | ||||
|     prci i_prci; | ||||
|     clint i_clint; | ||||
|  | ||||
|     scc::memory<512_MB, 32> i_mem_qspi; | ||||
|     scc::memory<128_kB, 32> i_mem_ram; | ||||
|     sc_core::sc_signal<sc_core::sc_time> s_tlclk; | ||||
|     sc_core::sc_signal<sc_core::sc_time> s_lfclk; | ||||
|     sc_core::sc_signal<bool> s_rst, s_mtime_int, s_msie_int; | ||||
|     sc_core::sc_vector<sc_core::sc_signal<bool, SC_MANY_WRITERS>> s_global_int, s_local_int; | ||||
|     sc_core::sc_signal<bool> s_core_int; | ||||
|     sc_core::sc_vector<sc_core::sc_signal<bool>> s_dummy; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_in>  s_dummy_sck_i; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_out> s_dummy_sck_o; | ||||
|  | ||||
|  | ||||
| protected: | ||||
|     void gen_reset(); | ||||
|  | ||||
| #include "gen/e300_plat_t.h" | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _PLATFORM_H_ */ | ||||
							
								
								
									
										77
									
								
								platform/incl/sysc/SiFive/plic.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								platform/incl/sysc/SiFive/plic.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _PLIC_H_ | ||||
| #define _PLIC_H_ | ||||
|  | ||||
| #include <scc/register.h> | ||||
| #include <scc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class plic_regs; | ||||
|  | ||||
| class plic : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(plic); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     sc_core::sc_vector<sc_core::sc_in<bool>> global_interrupts_i; | ||||
|     sc_core::sc_out<bool> core_interrupt_o; | ||||
|     sc_core::sc_event raise_int_ev; | ||||
|     sc_core::sc_event clear_int_ev; | ||||
|     plic(sc_core::sc_module_name nm); | ||||
|     ~plic() override; | ||||
|  | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void init_callbacks(); | ||||
|  | ||||
|     void global_int_port_cb(); | ||||
|     void handle_pending_int(); | ||||
|     void reset_pending_int(uint32_t irq); | ||||
|  | ||||
|     void raise_core_interrupt(); | ||||
|     void clear_core_interrupt(); | ||||
|     sc_core::sc_time clk; | ||||
|     std::unique_ptr<plic_regs> regs; | ||||
|     std::function<bool(scc::sc_register<uint32_t>, uint32_t)> m_claim_complete_write_cb; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _PLIC_H_ */ | ||||
							
								
								
									
										68
									
								
								platform/incl/sysc/SiFive/prci.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								platform/incl/sysc/SiFive/prci.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _PRCI_H_ | ||||
| #define _PRCI_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class prci_regs; | ||||
|  | ||||
| class prci : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(prci); | ||||
|     sc_core::sc_port<sc_core::sc_signal_in_if<sc_core::sc_time>,1,SC_ZERO_OR_MORE_BOUND> hfxosc_i; | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     sc_core::sc_out<sc_core::sc_time> hfclk_o; | ||||
|     prci(sc_core::sc_module_name nm); | ||||
|     virtual ~prci() override; // need to keep it in source file because of fwd declaration of prci_regs | ||||
|  | ||||
| protected: | ||||
|     void hfxosc_cb(); | ||||
|     void reset_cb(); | ||||
|     void hfrosc_en_cb(); | ||||
|     void hfxosc_en_cb(); | ||||
|     void update_hfclk(); | ||||
|     sc_core::sc_time hfxosc_clk, hfrosc_clk, pll_clk, hfclk; | ||||
|     std::unique_ptr<prci_regs> regs; | ||||
|     sc_core::sc_event hfrosc_en_evt, hfxosc_en_evt; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _GPIO_H_ */ | ||||
							
								
								
									
										81
									
								
								platform/incl/sysc/SiFive/spi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								platform/incl/sysc/SiFive/spi.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _SPI_H_ | ||||
| #define _SPI_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
| #include "scc/signal_target_mixin.h" | ||||
| #include "scc/signal_initiator_mixin.h" | ||||
| #include <tlm/tlm_signal.h> | ||||
| #include "cci_configuration" | ||||
| #include <sysc/utils/sc_vector.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class spi_regs; | ||||
|  | ||||
| class spi : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(spi); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool>             rst_i; | ||||
|     scc::tlm_signal_bool_opt_out         sck_o; | ||||
|     scc::tlm_signal_bool_opt_out         mosi_o; | ||||
|     scc::tlm_signal_bool_opt_in          miso_i; | ||||
|     sc_core::sc_vector<scc::tlm_signal_bool_opt_out> scs_o; | ||||
|  | ||||
|     sc_core::sc_out<bool> irq_o; | ||||
|  | ||||
|     cci::cci_param<bool> bit_true_transfer; | ||||
|  | ||||
|     spi(sc_core::sc_module_name nm); | ||||
|     virtual ~spi() override; | ||||
|  | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void transmit_data(); | ||||
|     void receive_data(tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay); | ||||
|     void update_irq(); | ||||
|     sc_core::sc_time clk; | ||||
|     std::unique_ptr<spi_regs> regs; | ||||
|     sc_core::sc_fifo<uint8_t> rx_fifo, tx_fifo; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _SPI_H_ */ | ||||
							
								
								
									
										79
									
								
								platform/incl/sysc/SiFive/uart.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								platform/incl/sysc/SiFive/uart.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _UART_H_ | ||||
| #define _UART_H_ | ||||
|  | ||||
| #include "scc/tlm_target.h" | ||||
| #include "scc/signal_target_mixin.h" | ||||
| #include "scc/signal_initiator_mixin.h" | ||||
| #include <tlm/tlm_signal.h> | ||||
| #include "cci_configuration" | ||||
|  | ||||
| namespace sysc { | ||||
| class tlm_signal_uart_extension; | ||||
| class uart_regs; | ||||
| class WsHandler; | ||||
|  | ||||
| class uart : public sc_core::sc_module, public scc::tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(uart); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     scc::tlm_signal_bool_out tx_o; | ||||
|     scc::tlm_signal_bool_in  rx_i; | ||||
|  | ||||
|     sc_core::sc_out<bool> irq_o; | ||||
|  | ||||
|     cci::cci_param<bool> bit_true_transfer; | ||||
|  | ||||
|     uart(sc_core::sc_module_name nm); | ||||
|     virtual ~uart() override; | ||||
|  | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     void transmit_data(); | ||||
|     void receive_data(tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay); | ||||
|     void update_irq(); | ||||
|     sc_core::sc_time clk{SC_ZERO_TIME},rx_last_start{SC_ZERO_TIME}; | ||||
|     std::unique_ptr<uart_regs> regs; | ||||
|     sc_core::sc_fifo<uint8_t> rx_fifo, tx_fifo; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _UART_H_ */ | ||||
							
								
								
									
										113
									
								
								platform/incl/sysc/sc_comm_singleton.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								platform/incl/sysc/sc_comm_singleton.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef _SYSC_SC_COMM_SINGLETON_H_ | ||||
| #define _SYSC_SC_COMM_SINGLETON_H_ | ||||
|  | ||||
| #include <sysc/kernel/sc_module.h> | ||||
| #include <seasocks/PageHandler.h> | ||||
| #include "seasocks/WebSocket.h" | ||||
|  | ||||
| #include <memory> | ||||
| #include <thread> | ||||
| #include <cstring> | ||||
| #include <functional> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class WsHandler: public seasocks::WebSocket::Handler { | ||||
| public: | ||||
|     explicit WsHandler() { } | ||||
|  | ||||
|     void onConnect(seasocks::WebSocket* connection) override; | ||||
|  | ||||
|     void onData(seasocks::WebSocket* connection, const char* data) override; | ||||
|  | ||||
|     void onDisconnect(seasocks::WebSocket* connection) override; | ||||
|  | ||||
|     void send(std::string msg) { for (auto *con : _connections) con->send(msg); } | ||||
|  | ||||
|     void set_receive_callback(std::function<void(const char* data)> cb){callback=cb;} | ||||
|  | ||||
| private: | ||||
|     std::set<seasocks::WebSocket*> _connections; | ||||
|     std::function<void(const char* data)> callback; | ||||
| }; | ||||
|  | ||||
| class sc_comm_singleton: public sc_core::sc_module { | ||||
| 	struct DefaultPageHandler: public seasocks::PageHandler { | ||||
| 		DefaultPageHandler(sc_comm_singleton& o):owner(o){} | ||||
| 	    virtual std::shared_ptr<seasocks::Response> handle(const seasocks::Request& request); | ||||
| 	    sc_comm_singleton& owner; | ||||
| 	}; | ||||
| public: | ||||
| 	sc_comm_singleton() = delete; | ||||
|  | ||||
| 	sc_comm_singleton(const sc_comm_singleton&) = delete; | ||||
|  | ||||
| 	sc_comm_singleton& operator=(sc_comm_singleton& o) = delete; | ||||
|  | ||||
| 	virtual ~sc_comm_singleton(); | ||||
|  | ||||
| 	static sc_comm_singleton& inst(){ | ||||
| 		static sc_comm_singleton i("__sc_singleton"); | ||||
| 		return i; | ||||
| 	} | ||||
|  | ||||
| 	seasocks::Server& get_server(); | ||||
|  | ||||
|     void registerWebSocketHandler(const char* endpoint, std::shared_ptr<seasocks::WebSocket::Handler> handler, bool allowCrossOriginRequests = false); | ||||
|  | ||||
|     void execute(std::function<void()> f); | ||||
|  | ||||
|     void start_client(); | ||||
|  | ||||
| protected: | ||||
| 	void start_of_simulation() override; | ||||
| 	void end_of_simulation() override; | ||||
|  | ||||
| private: | ||||
| 	sc_comm_singleton(sc_core::sc_module_name nm); | ||||
| 	std::unique_ptr<seasocks::Server> m_serv; | ||||
| 	std::thread t; | ||||
| 	void thread_func(); | ||||
| 	bool needs_client, client_started; | ||||
| 	std::vector<std::string> endpoints; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _SYSC_SC_COMM_SINGLETON_H_ */ | ||||
							
								
								
									
										48
									
								
								platform/incl/sysc/tlm_extensions.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								platform/incl/sysc/tlm_extensions.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * tlm_extensions.h | ||||
|  * | ||||
|  *  Created on: 12.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYSC_TLM_EXTENSIONS_H_ | ||||
| #define _SYSC_TLM_EXTENSIONS_H_ | ||||
|  | ||||
| #include "tlm/tlm_extensions.h" | ||||
|  | ||||
| namespace sysc { | ||||
| struct tlm_signal_uart_extension : public tlm::tlm_unmanaged_extension<tlm_signal_uart_extension> { | ||||
|  | ||||
|     struct uart_tx { | ||||
|         unsigned data_bits:4; | ||||
|         unsigned stop_bits:2; | ||||
|         bool parity:1; | ||||
|         unsigned baud_rate:24; | ||||
|         unsigned data; | ||||
|     } tx; | ||||
|     sc_core::sc_time start_time; | ||||
|  | ||||
| }; | ||||
|  | ||||
| struct tlm_signal_spi_extension : public tlm::tlm_unmanaged_extension<tlm_signal_spi_extension> { | ||||
|  | ||||
|     struct spi_tx { | ||||
|         unsigned data_bits:5; | ||||
|         bool msb_first:1; | ||||
|         bool s2m_data_valid:1; | ||||
|         unsigned m2s_data, s2m_data; | ||||
|     } tx; | ||||
|     sc_core::sc_time start_time; | ||||
|  | ||||
|     void copy_from(tlm_extension_base const & other) override { | ||||
|         auto& o = static_cast<const type&>(other); | ||||
|         this->tx=o.tx; | ||||
|         this->start_time=o.start_time; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* _SYSC_TLM_EXTENSIONS_H_ */ | ||||
							
								
								
									
										105
									
								
								platform/incl/sysc/top/BLDC.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								platform/incl/sysc/top/BLDC.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| /* | ||||
|  * BLDC.h | ||||
|  * | ||||
|  *  Created on: 26.06.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef BLDC_H_ | ||||
| #define BLDC_H_ | ||||
|  | ||||
| #include <boost/numeric/odeint.hpp> | ||||
| namespace odeint = boost::numeric::odeint; | ||||
|  | ||||
| inline | ||||
| double norm_angle(double alpha){ | ||||
|   double alpha_n = fmod(alpha, M_PI * 2); | ||||
|   if (alpha_n < 0.) alpha_n += (M_PI * 2); | ||||
|   return alpha_n; | ||||
| } | ||||
|  | ||||
|  | ||||
| class BLDC { | ||||
| public: | ||||
|     struct Config { | ||||
|         double inertia = 0.0005;        /* aka 'J' in kg/(m^2) */ | ||||
|         double damping = 0.000089;      /* aka 'B' in Nm/(rad/s) */ | ||||
|         double static_friction = 0.0;   /* in Nm */ | ||||
|         //double Kv = 0.0042;             /* motor constant in RPM/V */ | ||||
|         double Ke = 0.0042;             /* back emf constant in V/rad/s*/ | ||||
|         double L = 0.0027;              /* Coil inductance in H */ | ||||
|         double M = -0.000069;            /* Mutual coil inductance in H */ | ||||
|         double R = 2.875;               /* Coil resistence in Ohm */ | ||||
|         int NbPoles = 2;                /* NbPoles / 2 = Number of pole pairs (you count the permanent magnets on the rotor to get NbPoles) */ | ||||
|     }; | ||||
|  | ||||
|     using StateVector = std::array<double, 5>; | ||||
|  | ||||
|     struct State{ | ||||
|         double& theta;   /* angle of the rotor */ | ||||
|         double& omega;   /* angular speed of the rotor */ | ||||
|         double& ia;          /* phase a current */ | ||||
|         double& ib;          /* phase b current */ | ||||
|         double& ic;          /* phase c current */ | ||||
|         explicit State(StateVector& v):theta(v[0]), omega(v[1]), ia(v[2]), ib(v[3]), ic(v[4]){} | ||||
|         State(State&&) = delete; | ||||
|         State(const State&) = delete; | ||||
|         State& operator=(const State&) = delete;  // Copy assignment operator | ||||
|         State& operator=(const State&&) = delete;  // Move assignment operator | ||||
|         ~State(){} | ||||
|         void init(){ | ||||
|             theta = ia = ib = ic = 0; | ||||
|             omega = 0.; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     explicit BLDC(const Config config); | ||||
|  | ||||
|     virtual ~BLDC(); | ||||
|  | ||||
|     void set_input(std::array<double, 3> vin){ | ||||
|         this->vin=vin; | ||||
|     } | ||||
|  | ||||
|     void run(double dt); | ||||
|  | ||||
|     void printToStream(std::ostream&) const; | ||||
|  | ||||
|     double get_current_time(){return current_time;} | ||||
|  | ||||
|     std::tuple<double, double, double> get_voltages(){ | ||||
|         return std::tuple<double, double, double>( | ||||
|                 voltages[VA]+voltages[EA]+state.ia*config.R, | ||||
|                 voltages[VB]+voltages[EB]+state.ib*config.R, | ||||
|                 voltages[VC]+voltages[EC]+state.ic*config.R | ||||
|                 ); | ||||
|     } | ||||
|     const State& getState(){ return state;} | ||||
|  | ||||
|     void setLoad(double torque){torque_load=torque;} | ||||
| protected: | ||||
|     Config config; | ||||
|     StateVector stateVector; | ||||
|     State state; | ||||
|     std::array<double, 3> vin; | ||||
|     double current_time = 0.0; | ||||
|     double torque_load=0.0; | ||||
|     double etorque=0.0, mtorque=0.0; | ||||
|     const double dt = 0.000001; | ||||
|     std::array<double, 7> voltages; | ||||
|     enum VoltageNames {EA=0, EB=1, EC=2, VA=3, VB=4, VC=5, VCENTER=6}; | ||||
|     double calc_bemf_factor(const State& state, double theta ); | ||||
|     void calc_back_emf(const State& state, double theta_e ); | ||||
|     void calc_voltages(); | ||||
|     // ODE part | ||||
|     //boost::numeric::odeint::runge_kutta4< StateVector > stepper; | ||||
|     //boost::numeric::odeint::runge_kutta_cash_karp54<StateVector > stepper; | ||||
|     //using  stepper_type = odeint::runge_kutta_dopri5<StateVector>; | ||||
|     //using  stepper_type = odeint::runge_kutta_cash_karp54< StateVector>; | ||||
|     using  stepper_type = odeint::runge_kutta_fehlberg78< StateVector>; | ||||
|     void rotor_dyn( const StateVector& x , StateVector& dxdt , const double t ); | ||||
| }; | ||||
|  | ||||
| std::ostream& operator<<(std::ostream& os, const BLDC& bldc); | ||||
|  | ||||
| #endif /* BLDC_H_ */ | ||||
							
								
								
									
										38
									
								
								platform/incl/sysc/top/dcmotor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								platform/incl/sysc/top/dcmotor.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /* | ||||
|  * dcmotor.h | ||||
|  * | ||||
|  *  Created on: 25.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYSC_TOP_DCMOTOR_H_ | ||||
| #define _SYSC_TOP_DCMOTOR_H_ | ||||
|  | ||||
| #include "BLDC.h" | ||||
| #include "scc/traceable.h" | ||||
| #include <systemc> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class dc_motor: public sc_core::sc_module, public scc::traceable { | ||||
| public: | ||||
|     SC_HAS_PROCESS(dc_motor); | ||||
|  | ||||
|     sc_core::sc_in<double> va_i, vb_i, vc_i; | ||||
|     sc_core::sc_out<double> va_o, vb_o, vc_o; | ||||
|  | ||||
|     dc_motor(const sc_core::sc_module_name& nm ); | ||||
|  | ||||
|     virtual ~dc_motor(); | ||||
|  | ||||
|     void trace(sc_core::sc_trace_file *trf) override; | ||||
|  | ||||
| private: | ||||
|     void thread(void); | ||||
|     BLDC bldc_model; | ||||
|     const BLDC::State& bldc_state; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* RISCV_SC_INCL_SYSC_TOP_DCMOTOR_H_ */ | ||||
							
								
								
									
										39
									
								
								platform/incl/sysc/top/h_bridge.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								platform/incl/sysc/top/h_bridge.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * h_bridge.h | ||||
|  * | ||||
|  *  Created on: 25.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef RISCV_SC_INCL_SYSC_TOP_H_BRIDGE_H_ | ||||
| #define RISCV_SC_INCL_SYSC_TOP_H_BRIDGE_H_ | ||||
|  | ||||
| #include "cci_configuration" | ||||
| #include <sysc/kernel/sc_module.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class h_bridge: public sc_core::sc_module { | ||||
| public: | ||||
|     SC_HAS_PROCESS(h_bridge); | ||||
|  | ||||
|     sc_core::sc_in<sc_dt::sc_logic> ha_i, la_i; | ||||
|     sc_core::sc_in<sc_dt::sc_logic> hb_i, lb_i; | ||||
|     sc_core::sc_in<sc_dt::sc_logic> hc_i, lc_i; | ||||
|  | ||||
|     sc_core::sc_out<double> va_o, vb_o, vc_o; | ||||
|  | ||||
|     cci::cci_param<double> vcc; | ||||
|  | ||||
|     h_bridge(const sc_core::sc_module_name& nm); | ||||
|  | ||||
|     virtual ~h_bridge(); | ||||
| private: | ||||
|     void ain_cb(); | ||||
|     void bin_cb(); | ||||
|     void cin_cb(); | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* RISCV_SC_INCL_SYSC_TOP_H_BRIDGE_H_ */ | ||||
							
								
								
									
										47
									
								
								platform/incl/sysc/top/mcp3008.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								platform/incl/sysc/top/mcp3008.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| /* | ||||
|  * mcp3008.h | ||||
|  * | ||||
|  *  Created on: 17.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYSC_TOP_MCP3008_H_ | ||||
| #define _SYSC_TOP_MCP3008_H_ | ||||
|  | ||||
| #include "scc/signal_target_mixin.h" | ||||
| #include "scc/signal_initiator_mixin.h" | ||||
| #include "sysc/tlm_extensions.h" | ||||
| #include <tlm/tlm_signal.h> | ||||
| #include "cci_configuration" | ||||
| #include <sysc/utils/sc_vector.h> | ||||
| #include <sysc/kernel/sc_module.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class mcp3008: public sc_core::sc_module { | ||||
| public: | ||||
|     SC_HAS_PROCESS(mcp3008); | ||||
|     scc::tlm_signal_logic_in  sck_i; | ||||
|     scc::tlm_signal_logic_out miso_o; | ||||
|     scc::tlm_signal_logic_in  mosi_i; | ||||
|     scc::tlm_signal_logic_in  cs_i; | ||||
|  | ||||
|     sc_core::sc_in<double> vref_i; | ||||
|     sc_core::sc_vector<sc_core::sc_in<double>> ch_i; | ||||
|  | ||||
|     mcp3008(sc_core::sc_module_name nm); | ||||
|     virtual ~mcp3008(); | ||||
|  | ||||
| private: | ||||
|     tlm::tlm_sync_enum receive(tlm::tlm_signal_gp<sc_dt::sc_logic> &, tlm::tlm_phase &, sc_core::sc_time &); | ||||
|     void do_conversion(); | ||||
|     unsigned idx, rx_bits; | ||||
|     std::array<uint8_t, 3> rx_bytes, tx_bytes; | ||||
|     sc_dt::sc_logic mosi_v, miso_v, cs_v; | ||||
|     sysc::tlm_signal_spi_extension* ext, tx_ext; | ||||
|     sc_core::sc_time last_tx_start; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
| #endif /* _SYSC_TOP_MCP3008_H_ */ | ||||
							
								
								
									
										42
									
								
								platform/incl/sysc/top/system.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								platform/incl/sysc/top/system.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| /* | ||||
|  * system.h | ||||
|  * | ||||
|  *  Created on: 11.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef __SYSC_GENERAL_SYSTEM_H_ | ||||
| #define __SYSC_GENERAL_SYSTEM_H_ | ||||
|  | ||||
| #include <systemc> | ||||
| #include "sysc/SiFive/hifive1.h" | ||||
| #include "mcp3008.h" | ||||
| #include "terminal.h" | ||||
| #include "h_bridge.h" | ||||
| #include "dcmotor.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class system: sc_core::sc_module { | ||||
| public: | ||||
|     SC_HAS_PROCESS(system); | ||||
|  | ||||
|     system(sc_core::sc_module_name nm); | ||||
|     virtual ~system(); | ||||
|  | ||||
|  | ||||
| private: | ||||
|     sc_core::sc_vector<tlm::tlm_signal<sc_dt::sc_logic>> s_gpio; | ||||
|     sc_core::sc_signal<bool> s_rst_n; | ||||
|     sc_core::sc_signal<double> s_vref, s_va, s_vb, s_vc, s_vasens, s_vbsens, s_vcsens; | ||||
|     sc_core::sc_vector<sc_core::sc_signal<double>> s_ana; | ||||
|     sysc::hifive1 i_platform; | ||||
|     sysc::terminal i_terminal; | ||||
|     sysc::mcp3008 i_adc; | ||||
|     sysc::h_bridge i_h_bridge; | ||||
|     sysc::dc_motor i_motor; | ||||
|     void gen_por(); | ||||
| }; | ||||
|  | ||||
| } | ||||
| #endif /* __SYSC_GENERAL_SYSTEM_H_ */ | ||||
							
								
								
									
										44
									
								
								platform/incl/sysc/top/terminal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								platform/incl/sysc/top/terminal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| /* | ||||
|  * terminal.h | ||||
|  * | ||||
|  *  Created on: 07.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYSC_TOP_TERMINAL_H_ | ||||
| #define _SYSC_TOP_TERMINAL_H_ | ||||
|  | ||||
| #include "scc/signal_target_mixin.h" | ||||
| #include "scc/signal_initiator_mixin.h" | ||||
| #include "tlm/tlm_signal.h" | ||||
| #include "cci_configuration" | ||||
| #include <sysc/kernel/sc_module.h> | ||||
| #include <memory> | ||||
|  | ||||
| namespace sysc { | ||||
| class WsHandler; | ||||
|  | ||||
| class terminal: public sc_core::sc_module { | ||||
| public: | ||||
|     scc::tlm_signal_logic_out tx_o; | ||||
|     scc::tlm_signal_logic_in  rx_i; | ||||
|  | ||||
|     terminal(); | ||||
|  | ||||
|     terminal(const sc_core::sc_module_name& nm); | ||||
|  | ||||
|     virtual ~terminal(); | ||||
|  | ||||
|     cci::cci_param<bool> write_to_ws; | ||||
|  | ||||
| protected: | ||||
|     void before_end_of_elaboration(); | ||||
|     void receive(tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, sc_core::sc_time& delay); | ||||
|  | ||||
|     std::vector<uint8_t> queue; | ||||
|     std::shared_ptr<sysc::WsHandler> handler; | ||||
|     sc_core::sc_time last_tx_start=sc_core::SC_ZERO_TIME; | ||||
| }; | ||||
| } | ||||
|  | ||||
| #endif /* _SYSC_TOP_TERMINAL_H_ */ | ||||
							
								
								
									
										77
									
								
								platform/src/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								platform/src/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| # library files | ||||
| FILE(GLOB RiscVSCHeaders *.h */*.h) | ||||
| FILE(GLOB RiscvSCSources sysc/*.cpp) | ||||
|  | ||||
| set(LIB_HEADERS ${RiscVSCHeaders} ) | ||||
| set(LIB_SOURCES ${RiscvSCSources} ) | ||||
|  | ||||
| set(APP_HEADERS ) | ||||
| set(APP_SOURCES sc_main.cpp) | ||||
|  | ||||
| # Define two variables in order not to repeat ourselves. | ||||
| set(LIBRARY_NAME platform) | ||||
|  | ||||
| ## the following setting needs to be consistent with the library | ||||
| #add_definitions(-DSC_DEFAULT_WRITER_POLICY=SC_MANY_WRITERS) | ||||
|  | ||||
| # Define the library | ||||
| add_library(${LIBRARY_NAME} ${LIB_SOURCES}) | ||||
|  | ||||
| set_target_properties(${LIBRARY_NAME} PROPERTIES | ||||
|   VERSION ${VERSION}  # ${VERSION} was defined in the main CMakeLists. | ||||
|   FRAMEWORK FALSE | ||||
|   PUBLIC_HEADER "${LIB_HEADERS}" # specify the public headers | ||||
| ) | ||||
|  | ||||
| # This is a make target, so you can do a "make riscv-sc" | ||||
| set(APPLICATION_NAME riscv.vp) | ||||
|  | ||||
| include_directories(${CONAN_INCLUDE_DIRS_SEASOCKS}) | ||||
| include_directories(${SystemC_INCLUDE_DIRS}) | ||||
| include_directories(${CCI_INCLUDE_DIRS}) | ||||
|  | ||||
| link_directories(${SystemC_LIBRARY_DIR}) | ||||
| link_directories(${CCI_LIBRARY_DIR}) | ||||
| link_directories(${CONAN_LIB_DIRS_SEASOCKS}) | ||||
|  | ||||
| add_executable(${APPLICATION_NAME} ${APP_SOURCES}) | ||||
|  | ||||
| # Links the target exe against the libraries | ||||
|  | ||||
| target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME}) | ||||
| target_link_libraries(${APPLICATION_NAME} riscv.sc) | ||||
| target_link_libraries(${APPLICATION_NAME} riscv) | ||||
| target_link_libraries(${APPLICATION_NAME} dbt-core) | ||||
| target_link_libraries(${APPLICATION_NAME} softfloat) | ||||
| target_link_libraries(${APPLICATION_NAME} sc-components) | ||||
| target_link_libraries(${APPLICATION_NAME} ${CONAN_LIBS_SEASOCKS}) | ||||
| target_link_libraries(${APPLICATION_NAME} external) | ||||
| target_link_libraries(${APPLICATION_NAME} ${llvm_libs}) | ||||
| target_link_libraries(${APPLICATION_NAME} ${CCI_LIBRARIES} ) | ||||
| target_link_libraries(${APPLICATION_NAME} ${SystemC_LIBRARIES} ) | ||||
| if(SCV_FOUND) | ||||
|     add_definitions(-DWITH_SCV) | ||||
|     include_directories(${SCV_INCLUDE_DIRS}) | ||||
|     link_directories(${SCV_LIBRARY_DIRS}) | ||||
|     target_link_libraries (${APPLICATION_NAME} ${SCV_LIBRARIES}) | ||||
| endif() | ||||
| target_link_libraries(${APPLICATION_NAME} ${Boost_LIBRARIES} ) | ||||
| if (Tcmalloc_FOUND) | ||||
|     target_link_libraries(${APPLICATION_NAME} ${Tcmalloc_LIBRARIES}) | ||||
| endif(Tcmalloc_FOUND) | ||||
|  | ||||
| # Says how and where to install software | ||||
| # Targets: | ||||
| #   * <prefix>/lib/<libraries> | ||||
| #   * header location after install: <prefix>/include/<project>/*.h | ||||
| #   * headers can be included by C++ code `#<project>/Bar.hpp>` | ||||
| install(TARGETS ${LIBRARY_NAME} ${APPLICATION_NAME} | ||||
|   EXPORT ${PROJECT_NAME}Targets            # for downstream dependencies | ||||
|   ARCHIVE DESTINATION lib COMPONENT libs   # static lib | ||||
|   RUNTIME DESTINATION bin COMPONENT libs   # binaries | ||||
|   LIBRARY DESTINATION lib COMPONENT libs   # shared lib | ||||
|   FRAMEWORK DESTINATION bin COMPONENT libs # for mac | ||||
|   PUBLIC_HEADER DESTINATION incl/${PROJECT_NAME} COMPONENT devel   # headers for mac (note the different component -> different package) | ||||
|   INCLUDES DESTINATION incl             # headers | ||||
| ) | ||||
|  | ||||
							
								
								
									
										186
									
								
								platform/src/sc_main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								platform/src/sc_main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include <boost/program_options.hpp> | ||||
| #include <iss/log_categories.h> | ||||
| #include <sstream> | ||||
| #include "scc/configurer.h" | ||||
| #include "scc/report.h" | ||||
| #include "scc/scv_tr_db.h" | ||||
| #include "scc/tracer.h" | ||||
| #include <cci_utils/broker.h> | ||||
| #include <iss/jit/jit_helper.h> | ||||
| #include "../incl/sysc/top/system.h" | ||||
|  | ||||
| using namespace sysc; | ||||
| namespace po = boost::program_options; | ||||
|  | ||||
| namespace { | ||||
| const size_t ERROR_IN_COMMAND_LINE = 1; | ||||
| const size_t SUCCESS = 0; | ||||
| const size_t ERROR_UNHANDLED_EXCEPTION = 2; | ||||
| } // namespace | ||||
|  | ||||
| #include "sysc/kernel/sc_externs.h" | ||||
| int | ||||
| main( int argc, char* argv[]){ | ||||
| #ifdef _POSIX_SOURCE | ||||
|     putenv(const_cast<char*>("SC_SIGNAL_WRITE_CHECK=DISABLE")); | ||||
|     putenv(const_cast<char*>("SC_VCD_SCOPES=ENABLE")); | ||||
| #endif | ||||
|     return sc_core::sc_elab_and_sim( argc, argv ); | ||||
| } | ||||
|  | ||||
| int sc_main(int argc, char *argv[]) { | ||||
|     //    sc_report_handler::set_handler(my_report_handler); | ||||
|     scc::Logger<>::reporting_level() = logging::ERROR; | ||||
|     cci::cci_register_broker(new cci_utils::broker("Global Broker")); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // CLI argument parsing | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     po::options_description desc("Options"); | ||||
|     // clang-format off | ||||
|     desc.add_options() | ||||
|             ("help,h", "Print help message") | ||||
|             ("verbose,v", po::value<int>()->implicit_value(3), "Sets logging verbosity") | ||||
|             ("log-file", po::value<std::string>(), "Sets default log file.") | ||||
|             ("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly") | ||||
|             ("elf,l", po::value<std::string>(), "ELF file to load") | ||||
|             ("gdb-port,g", po::value<unsigned short>()->default_value(0), "enable gdb server and specify port to use") | ||||
|             ("dump-ir", "dump the intermediate representation") | ||||
|             ("quantum", po::value<unsigned>(), "SystemC quantum time in ns") | ||||
|             ("reset,r", po::value<std::string>(), "reset address") | ||||
|             ("trace,t", po::value<unsigned>()->default_value(0), "enable tracing, or combintation of 1=signals and 2=TX text, 4=TX compressed text, 6=TX in SQLite") | ||||
|             ("max_time,m", po::value<std::string>(), "maximum time to run") | ||||
|             ("config-file,c", po::value<std::string>()->default_value(""), "read configuration from file") | ||||
| 			("dump-config", po::value<std::string>()->default_value(""), "dump configuration to file file"); | ||||
|     // clang-format on | ||||
|     po::variables_map vm; | ||||
|     try { | ||||
|         po::store(po::parse_command_line(argc, argv, desc), vm); // can throw | ||||
|         // --help option | ||||
|         if (vm.count("help")) { | ||||
|             std::cout << "DBT-RISE-RiscV simulator for RISC-V" << std::endl << desc << std::endl; | ||||
|             return SUCCESS; | ||||
|         } | ||||
|         po::notify(vm); // throws on error, so do after help in case | ||||
|                         // there are any problems | ||||
|     } catch (po::error &e) { | ||||
|         std::cerr << "ERROR: " << e.what() << std::endl << std::endl; | ||||
|         std::cerr << desc << std::endl; | ||||
|         return ERROR_IN_COMMAND_LINE; | ||||
|     } | ||||
|     if (vm.count("verbose")) { | ||||
|         auto l = logging::as_log_level(vm["verbose"].as<int>()); | ||||
|         LOGGER(DEFAULT)::reporting_level() = l; | ||||
|         LOGGER(connection)::reporting_level() = l; | ||||
|         LOGGER(SystemC)::reporting_level() = l; | ||||
|         scc::Logger<>::reporting_level() = l; | ||||
|     } | ||||
|     if (vm.count("log-file")) { | ||||
|         // configure the connection logger | ||||
|         auto f = fopen(vm["log-file"].as<std::string>().c_str(), "w"); | ||||
|         LOG_OUTPUT(DEFAULT)::stream() = f; | ||||
|         LOG_OUTPUT(connection)::stream() = f; | ||||
|         LOG_OUTPUT(SystemC)::stream() = f; | ||||
|     } | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // set up infrastructure | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     iss::init_jit(argc, argv); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // set up configuration | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     scc::configurer cfg(vm["config-file"].as<std::string>()); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // instantiate top level | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     auto i_system = std::make_unique<sysc::system>("i_system"); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // set up tracing & transaction recording | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     auto trace_val = vm["trace"].as<unsigned>(); | ||||
|     scc::tracer trace("simple_system", static_cast<scc::tracer::file_type>(trace_val >> 1), trace_val != 0); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // dump configuration if requested | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     if(vm["dump-config"].as<std::string>().size()>0){ | ||||
|     	std::ofstream of{vm["dump-config"].as<std::string>()}; | ||||
|     	if(of.is_open()) | ||||
|     	    cfg.dump_configuration(of); | ||||
|     } | ||||
| 	cfg.configure(); | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // overwrite config with command line settings | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|    if (vm["gdb-port"].as<unsigned short>()) | ||||
|     	cfg.set_value("i_system.i_platform.i_core_complex.gdb_server_port", vm["gdb-port"].as<unsigned short>()); | ||||
|     if (vm.count("dump-ir")) | ||||
|     	cfg.set_value("i_system.i_platform.i_core_complex.dump_ir", vm.count("dump-ir") != 0); | ||||
|     if (vm.count("elf")) | ||||
|     	cfg.set_value("i_system.i_platform.i_core_complex.elf_file", vm["elf"].as<std::string>()); | ||||
|     if (vm.count("quantum")) | ||||
|         tlm::tlm_global_quantum::instance().set(sc_core::sc_time(vm["quantum"].as<unsigned>(), sc_core::SC_NS)); | ||||
|     if (vm.count("reset")) { | ||||
|         auto str = vm["reset"].as<std::string>(); | ||||
|         uint64_t start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), 0, 16) : std::stoull(str, 0, 10); | ||||
|         cfg.set_value("i_system.i_platform.i_core_complex.reset_address", start_address); | ||||
|     } | ||||
|     if (vm.count("disass")) { | ||||
|         cfg.set_value("i_system.i_platform.i_core_complex.enable_disass", true); | ||||
|         LOGGER(disass)::reporting_level() = logging::INFO; | ||||
|         auto file_name = vm["disass"].as<std::string>(); | ||||
|         if (file_name.length() > 0) { | ||||
|             LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w"); | ||||
|             LOGGER(disass)::print_time() = false; | ||||
|             LOGGER(disass)::print_severity() = false; | ||||
|         } | ||||
|     } | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // run simulation | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     try { | ||||
|         if(vm.count("max_time")){ | ||||
|             sc_core::sc_time max_time = scc::parse_from_string(vm["max_time"].as<std::string>()); | ||||
|             sc_core::sc_start(max_time); | ||||
|         } else | ||||
|             sc_core::sc_start(); | ||||
|     } catch(sc_core::sc_report& rep){ | ||||
|         CLOG(FATAL, SystemC)<<"IWEF"[rep.get_severity()]<<"("<<rep.get_id()<<") "<<rep.get_msg_type()<<": "<<rep.get_msg()<<std::endl; | ||||
|     } | ||||
|     if (!sc_core::sc_end_of_simulation_invoked()) sc_core::sc_stop(); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										164
									
								
								platform/src/sysc/BLDC.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								platform/src/sysc/BLDC.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| /* | ||||
|  * BLDC.cpp | ||||
|  * | ||||
|  *  Created on: 26.06.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/BLDC.h" | ||||
|  | ||||
| // implementation according to Modeling of BLDC Motor with Ideal Back-EMF for Automotive Applications | ||||
| // Proceedings of the World Congress on Engineering 2011 Vol II WCE 2011, July 6 - 8, 2011, London, U.K. | ||||
| BLDC::BLDC(const Config config) | ||||
| : config(config) | ||||
| , stateVector({{0.0, 0.0, 0.0, 0.0, 0.0}}) | ||||
| , state(stateVector) | ||||
| , vin({{0.0, 0.0, 0.0}}) | ||||
| , voltages({{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}) | ||||
| { | ||||
|     state.init(); | ||||
| } | ||||
|  | ||||
| BLDC::~BLDC() { | ||||
|  | ||||
| } | ||||
|  | ||||
| double BLDC::calc_bemf_factor(const State& x, double theta){ | ||||
|     if(theta>=0 && theta < 2./3.*M_PI){ | ||||
|         return 1; | ||||
|     } else if(theta>=2./3.*M_PI && theta < M_PI){ | ||||
|         return 1-6/M_PI*(theta-2./3.*M_PI); | ||||
|     } else if(theta>=M_PI && theta < 5./3. * M_PI){ | ||||
|         return -1; | ||||
|     } else if(theta>=5./3. * M_PI && theta < 2. * M_PI){ | ||||
|         return -1+6/M_PI*(theta-5./3.*M_PI); | ||||
|     } else { | ||||
|         fprintf(stderr, "ERROR: angle out of bounds can not calculate bemf %f\n", theta); | ||||
|         throw std::runtime_error("angle out of bounds can not calculate bemf"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void BLDC::calc_back_emf(const State& state, double theta_e) { | ||||
|     double max_bemf = config.Ke * state.omega; | ||||
|     voltages[EA] = max_bemf*calc_bemf_factor(state, norm_angle(theta_e)); | ||||
|     voltages[EB] = max_bemf*calc_bemf_factor(state, norm_angle(theta_e + M_PI * (2. / 3.))); | ||||
|     voltages[EC] = max_bemf*calc_bemf_factor(state, norm_angle(theta_e + M_PI * (4. / 3.))); | ||||
| } | ||||
|  | ||||
|  | ||||
| void BLDC::calc_voltages(){ | ||||
|     const double NaN = nan(""); | ||||
|     /* Check which phases are excited. */ | ||||
|     bool pa = isnan(vin[0])?false:true; | ||||
|     bool pb = isnan(vin[1])?false:true; | ||||
|     bool pc = isnan(vin[2])?false:true; | ||||
|  | ||||
|     if (pa && pb && pc) { | ||||
|         voltages[VA] = vin[0]; | ||||
|         voltages[VB] = vin[1]; | ||||
|         voltages[VC] = vin[2]; | ||||
|         voltages[VCENTER] = (voltages[VA] + voltages[VB] + voltages[VC] - voltages[EA] - voltages[EB] - voltages[EC]) / 3.; | ||||
|     } else if (pa && pb) { | ||||
|         voltages[VA] = vin[0]; | ||||
|         voltages[VB] = vin[1]; | ||||
|         voltages[VCENTER] = (voltages[VA] + voltages[VB] - voltages[EA] - voltages[EB]) / 2.; | ||||
|         voltages[VC] = voltages[EC] + voltages[VCENTER]; | ||||
|     } else if (pa && pc) { | ||||
|         voltages[VA] = vin[0]; | ||||
|         voltages[VC] = vin[2]; | ||||
|         voltages[VCENTER] = (voltages[VA] + voltages[VC] - voltages[EA] - voltages[EC]) / 2.; | ||||
|         voltages[VB] = voltages[EB] + voltages[VCENTER]; | ||||
|     } else if (pb && pc) { | ||||
|         voltages[VB] = vin[1]; | ||||
|         voltages[VC] = vin[2]; | ||||
|         voltages[VCENTER] = (voltages[VB] + voltages[VC] - voltages[EB] - voltages[EC]) / 2.; | ||||
|         voltages[VA] = voltages[EA] + voltages[VCENTER]; | ||||
|     } else if (pa) { | ||||
|         voltages[VA] = vin[0]; | ||||
|         voltages[VCENTER] = (voltages[VA] - voltages[EA]); | ||||
|         voltages[VB] = voltages[EB] + voltages[VCENTER]; | ||||
|         voltages[VC] = voltages[EC] + voltages[VCENTER]; | ||||
|     } else if (pb) { | ||||
|         voltages[VB] = vin[1]; | ||||
|         voltages[VCENTER] = (voltages[VB] - voltages[EB]); | ||||
|         voltages[VA] = voltages[EA] + voltages[VCENTER]; | ||||
|         voltages[VC] = voltages[EC] + voltages[VCENTER]; | ||||
|     } else if (pc) { | ||||
|         voltages[VC] = vin[0]; | ||||
|         voltages[VCENTER] = (voltages[VC] - voltages[EC]); | ||||
|         voltages[VA] = voltages[EA] + voltages[VCENTER]; | ||||
|         voltages[VB] = voltages[EB] + voltages[VCENTER]; | ||||
|     } else { | ||||
|         voltages[VA] = voltages[EA]; | ||||
|         voltages[VB] = voltages[EB]; | ||||
|         voltages[VC] = voltages[EC]; | ||||
|         voltages[VCENTER] = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void BLDC::printToStream(std::ostream& os) const { | ||||
|     os<<state.omega<<";"<<state.theta<<";" | ||||
|             <<state.ia<<";"<<state.ib<<";"<<state.ic<<";" | ||||
|             <<voltages[VA]<<";"<<voltages[VB]<<";"<<voltages[VC]<<";" | ||||
|             <<voltages[EA]<<";"<<voltages[EB]<<";"<<voltages[EC]<<";"<<voltages[VCENTER]<<";" | ||||
|             <<vin[0]<<";"<<vin[1]<<";"<<vin[2]<<";"<<etorque; | ||||
| } | ||||
|  | ||||
| void BLDC::rotor_dyn(const StateVector& x_, StateVector& dxdt_, const double t) { | ||||
|     const State x(const_cast<StateVector&>(x_)); | ||||
|     State dxdt(dxdt_); | ||||
|     double theta_e = state.theta * (config.NbPoles / 2.); | ||||
|     /* Calculate backemf voltages. */ | ||||
|     calc_back_emf(x, theta_e); | ||||
|     /* Calculate voltages. */ | ||||
|     calc_voltages(); | ||||
|     /* Electromagnetic torque. */ | ||||
| //    if (x.omega == 0) { | ||||
| //        printf("ERROR: input state vector omega equals 0!!!\n"); | ||||
| //        throw std::runtime_error("input state vector omega equals 0"); | ||||
| //    } | ||||
|     /* electrical torque */ | ||||
|     //etorque = ((voltages[EA] * x.ia) + (voltages[EB] * x.ib) + (voltages[EC] * x.ic)) / x.omega; | ||||
|     // which is equivalent to: | ||||
|     etorque = config.Ke*( | ||||
|             x.ia * (calc_bemf_factor(state, norm_angle(theta_e))) + | ||||
|             x.ib * (calc_bemf_factor(state, norm_angle(theta_e + M_PI * (2. / 3.)))) + | ||||
|             x.ic * (calc_bemf_factor(state, norm_angle(theta_e + M_PI * (4. / 3.)))) | ||||
|             ); | ||||
|     /* Mechanical torque. */ | ||||
|     mtorque = ((etorque * (config.NbPoles / 2)) - (config.damping * x.omega) - torque_load); | ||||
|  | ||||
|     if ((mtorque > 0) && (mtorque <= config.static_friction)) { | ||||
|         mtorque = 0; | ||||
|     } else if (mtorque > config.static_friction) { | ||||
|         mtorque -= config.static_friction; | ||||
|     } else if ((mtorque < 0) && (mtorque >= -(config.static_friction))) { | ||||
|         mtorque = 0; | ||||
|     } else if (mtorque < -(config.static_friction)) { | ||||
|         mtorque += config.static_friction; | ||||
|     } | ||||
|     /* Position of the rotor */ | ||||
|     dxdt.theta = x.omega; | ||||
|     /* Acceleration of the rotor. (omega_dot) */ | ||||
|     // a=M/J with M->torque, J->Inertia, a->angular acceleration | ||||
|     dxdt.omega = mtorque / config.inertia; | ||||
|     /* Calculate dot currents. */ | ||||
|     dxdt.ia = (voltages[VA] - (config.R * x.ia) - voltages[EA] - voltages[VCENTER]) / (config.L - config.M); | ||||
|     dxdt.ib = (voltages[VB] - (config.R * x.ib) - voltages[EB] - voltages[VCENTER]) / (config.L - config.M); | ||||
|     dxdt.ic = (voltages[VC] - (config.R * x.ic) - voltages[EC] - voltages[VCENTER]) / (config.L - config.M); | ||||
| } | ||||
|  | ||||
| void BLDC::run(double incr) { | ||||
|     if(dt>incr) throw std::runtime_error("incr needs to be larger than dt"); | ||||
|     double next_time = current_time+incr; | ||||
|     odeint::integrate_adaptive(make_controlled( 1.0e-10 , 1.0e-6 , stepper_type() ), | ||||
|             [this]( const StateVector &x , StateVector &dxdt , double t ) {this->rotor_dyn(x, dxdt,t);}, | ||||
|             stateVector, current_time, next_time, dt); | ||||
|     current_time=next_time; | ||||
|     state.theta=norm_angle(state.theta); | ||||
| } | ||||
|  | ||||
| std::ostream& operator <<(std::ostream& os, const BLDC& bldc) { | ||||
|     bldc.printToStream(os); | ||||
|     return os; | ||||
| } | ||||
							
								
								
									
										83
									
								
								platform/src/sysc/aon.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								platform/src/sysc/aon.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/aon.h" | ||||
|  | ||||
| #include "scc/utilities.h" | ||||
| #include "sysc/SiFive/gen/aon_regs.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| aon::aon(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMED(erst_n_i) | ||||
| , NAMED(lfclkc_o) | ||||
| , NAMED(rst_o) | ||||
| , NAMEDD(aon_regs, regs) { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << erst_n_i; | ||||
| } | ||||
|  | ||||
| void aon::start_of_simulation() { | ||||
|     rst_o=true; | ||||
| } | ||||
|  | ||||
| void aon::clock_cb() { | ||||
| 	this->clk = clk_i.read(); | ||||
| } | ||||
|  | ||||
| aon::~aon() {} | ||||
|  | ||||
| void aon::reset_cb() { | ||||
|     if (!erst_n_i.read()){ | ||||
|         regs->reset_start(); | ||||
|         rst_o=true; | ||||
|     } else { | ||||
|         regs->reset_stop(); | ||||
|         rst_o=false; | ||||
|     } | ||||
|     lfclkc_o.write(sc_core::sc_time(1/32768., sc_core::SC_SEC)); | ||||
| } | ||||
|  | ||||
| void aon::reset_internal_cb() { | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										124
									
								
								platform/src/sysc/clint.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								platform/src/sysc/clint.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/clint.h" | ||||
|  | ||||
| #include "scc/utilities.h" | ||||
| #include "scc/report.h" | ||||
| #include "sysc/SiFive/gen/clint_regs.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| const int lfclk_mutiplier = 1 << 12; | ||||
|  | ||||
| clint::clint(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(tlclk_i) | ||||
| , NAMED(lfclk_i) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(mtime_int_o) | ||||
| , NAMED(msip_int_o) | ||||
| , NAMEDD(clint_regs, regs) | ||||
| , cnt_fraction(0) { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << tlclk_i<<lfclk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
|     regs->mtimecmp.set_write_cb([this](scc::sc_register<uint64_t> ®, uint64_t data) -> bool { | ||||
|         if (!regs->in_reset()) { | ||||
|             reg.put(data); | ||||
|             this->update_mtime(); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->mtime.set_read_cb([this](const scc::sc_register<uint64_t> ®, uint64_t &data) -> bool { | ||||
|         this->update_mtime(); | ||||
|         data = reg.get(); | ||||
|         return true; | ||||
|     }); | ||||
|     regs->mtime.set_write_cb([this](scc::sc_register<uint64_t> ®, uint64_t data) -> bool { return false; }); | ||||
|     regs->msip.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         reg.put(data); | ||||
|         msip_int_o.write(regs->r_msip.msip); | ||||
|         return true; | ||||
|     }); | ||||
|     SC_METHOD(update_mtime); | ||||
|     sensitive << mtime_evt; | ||||
|     dont_initialize(); | ||||
| } | ||||
|  | ||||
| void clint::clock_cb() { | ||||
|     update_mtime(); | ||||
|     clk = lfclk_i.read(); | ||||
|     update_mtime(); | ||||
| } | ||||
|  | ||||
| clint::~clint() {} | ||||
|  | ||||
| void clint::reset_cb() { | ||||
|     if (rst_i.read()) { | ||||
|         regs->reset_start(); | ||||
|         msip_int_o.write(false); | ||||
|         mtime_int_o.write(false); | ||||
|         cnt_fraction = 0; | ||||
|     } else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| void clint::update_mtime() { | ||||
|     if(clk>SC_ZERO_TIME){ | ||||
|         uint64_t elapsed_clks = (sc_time_stamp()-last_updt)/clk; // get the number of clock periods since last invocation | ||||
|         last_updt += elapsed_clks*clk; // increment the last_updt timestamp by the number of clocks | ||||
|         if(elapsed_clks){ // update mtime reg if we have more than 0 elapsed clk periods | ||||
|             regs->r_mtime+=elapsed_clks; | ||||
|             mtime_evt.cancel(); | ||||
|             if (regs->r_mtimecmp > 0) | ||||
|                 if(regs->r_mtimecmp > regs->r_mtime && clk > sc_core::SC_ZERO_TIME) { | ||||
|                     sc_core::sc_time next_trigger = (clk * lfclk_mutiplier) * (regs->r_mtimecmp - regs->mtime) - cnt_fraction * clk; | ||||
|                     LOG(DEBUG)<<"Timer fires at "<< sc_time_stamp()+next_trigger; | ||||
|                     mtime_evt.notify(next_trigger); | ||||
|                     mtime_int_o.write(false); | ||||
|                 } else | ||||
|                     mtime_int_o.write(true); | ||||
|         } | ||||
|     } else | ||||
|         last_updt = sc_time_stamp(); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										69
									
								
								platform/src/sysc/dcmotor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								platform/src/sysc/dcmotor.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|  * dcmotor.cpp | ||||
|  * | ||||
|  *  Created on: 25.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/dcmotor.h" | ||||
| #include "scc/utilities.h" | ||||
| #include <future> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| using namespace sc_core; | ||||
|  | ||||
| auto get_config = []() -> BLDC::Config { | ||||
|     BLDC::Config config{}; | ||||
|     config.Ke=1./4000. ,//0.01; // V/rad/s, = 1/Kv | ||||
|     config.R=0.5; // Ohm | ||||
|     config.inertia = 0.0005; | ||||
|     config.NbPoles = 2; | ||||
|     config.damping = 0.00001; | ||||
|     return config; | ||||
| }; | ||||
|  | ||||
| dc_motor::dc_motor(const sc_module_name& nm ) | ||||
| : sc_module(nm) | ||||
| , bldc_model(get_config()) | ||||
| , bldc_state(bldc_model.getState()) | ||||
| { | ||||
|     bldc_model.setLoad(0.0001); | ||||
|     SC_THREAD(thread); | ||||
| } | ||||
|  | ||||
| dc_motor::~dc_motor() { | ||||
| } | ||||
|  | ||||
| void dc_motor::trace(sc_trace_file* trf) { | ||||
|     auto ia=bldc_state.ia;       TRACE_VAR(trf, ia); | ||||
|     auto ib=bldc_state.ib;       TRACE_VAR(trf, ib); | ||||
|     auto ic=bldc_state.ic;       TRACE_VAR(trf, ic); | ||||
|     auto theta=bldc_state.theta; TRACE_VAR(trf, theta); | ||||
|     auto omega=bldc_state.omega; TRACE_VAR(trf, omega); | ||||
| } | ||||
|  | ||||
| void dc_motor::thread(void) { | ||||
|     wait(SC_ZERO_TIME); | ||||
|     std::array<double, 3> vin{0., 0., 0.}; | ||||
|     const sc_time step(1, SC_US); | ||||
|     auto eval_model = [this](std::array<double, 3> vin, const sc_time step)->std::tuple<double, double, double> { | ||||
|         bldc_model.set_input(vin); | ||||
|         bldc_model.run(step.to_seconds()); | ||||
|         return bldc_model.get_voltages(); | ||||
|     }; | ||||
|     while(true){ | ||||
|         vin[0]=va_i.read(); | ||||
|         vin[1]=vb_i.read(); | ||||
|         vin[2]=vc_i.read(); | ||||
| //        auto sim_res=std::async(std::launch::async, eval_model, vin, step); | ||||
|         wait(step); | ||||
| //        auto vout=sim_res.get(); | ||||
|         auto vout = eval_model(vin, step); | ||||
|         va_o=std::get<0>(vout); | ||||
|         vb_o=std::get<1>(vout); | ||||
|         vc_o=std::get<2>(vout); | ||||
|     } | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										247
									
								
								platform/src/sysc/gpio.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								platform/src/sysc/gpio.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/gpio.h" | ||||
| #include "sysc/sc_comm_singleton.h" | ||||
| #include "scc/report.h" | ||||
| #include "scc/utilities.h" | ||||
| #include "sysc/SiFive/gen/gpio_regs.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| gpio::gpio(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(pins_o, 32) | ||||
| , NAMED(pins_i, 32) | ||||
| , NAMED(iof0_o, 32) | ||||
| , NAMED(iof1_o, 32) | ||||
| , NAMED(iof0_i, 32) | ||||
| , NAMED(iof1_i, 32) | ||||
| , NAMEDD(gpio_regs, regs) | ||||
| , NAMED(write_to_ws, false){ | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
|     auto pins_i_cb =[this](unsigned int tag, tlm::tlm_signal_gp<sc_logic>& gp, | ||||
|             tlm::tlm_phase& phase, sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|         this->pin_input(tag, gp, delay); | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }; | ||||
|     auto i=0U; | ||||
|     for(auto& s:pins_i){ | ||||
|         s.register_nb_transport(pins_i_cb, i); | ||||
|         ++i; | ||||
|     } | ||||
|     auto iof0_i_cb =[this](unsigned int tag, tlm::tlm_signal_gp<bool>& gp, | ||||
|             tlm::tlm_phase& phase, sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|         last_iof0[tag]=gp.get_value(); | ||||
|         this->iof_input(tag, 0, gp, delay); | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }; | ||||
|     i=0; | ||||
|     for(auto& s:iof0_i){ | ||||
|         s.register_nb_transport(iof0_i_cb, i); | ||||
|         ++i; | ||||
|     } | ||||
|     auto iof1_i_cb =[this](unsigned int tag, tlm::tlm_signal_gp<bool>& gp, | ||||
|             tlm::tlm_phase& phase, sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|         last_iof1[tag]=gp.get_value(); | ||||
|         this->iof_input(tag, 1, gp, delay); | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }; | ||||
|     i=0; | ||||
|     for(auto& s:iof1_i){ | ||||
|         s.register_nb_transport(iof1_i_cb, i); | ||||
|         ++i; | ||||
|     } | ||||
|     regs->port.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             reg.put(data); | ||||
|             // read r_ports and update pins_io | ||||
|             update_pins(); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->iof_en.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             enable_outputs(data, regs->r_iof_sel); | ||||
|             reg.put(data); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->iof_sel.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             enable_outputs(regs->r_iof_en, data); | ||||
|             reg.put(data); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|  | ||||
| } | ||||
|  | ||||
| gpio::~gpio() {} | ||||
|  | ||||
| void gpio::before_end_of_elaboration() { | ||||
| 	if(write_to_ws.get_value()) { | ||||
| 		LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name()); | ||||
| 		handler=std::make_shared<WsHandler>(); | ||||
| 		sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void gpio::reset_cb() { | ||||
|     if (rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| void gpio::clock_cb() { | ||||
| 	this->clk = clk_i.read(); | ||||
| } | ||||
|  | ||||
| tlm::tlm_phase gpio::write_output(tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, size_t i, sc_dt::sc_logic val) { | ||||
|     sc_core::sc_time delay{SC_ZERO_TIME}; | ||||
|     tlm::tlm_phase phase{ tlm::BEGIN_REQ }; | ||||
|     gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|     gp.set_response_status(tlm::TLM_OK_RESPONSE); | ||||
|     gp.set_value(val); | ||||
|     pins_o.at(i)->nb_transport_fw(gp, phase, delay); | ||||
|     return phase; | ||||
| } | ||||
|  | ||||
| void gpio::update_pins() { | ||||
| 	sc_core::sc_inout_rv<32>::data_type out_val; | ||||
| 	tlm::tlm_signal_gp<sc_dt::sc_logic> gp; | ||||
| 	for(size_t i=0, mask = 1; i<32; ++i, mask<<=1){ | ||||
| 	    if((regs->iof_en&mask == 0) || (iof0_i[i].size()==0 && iof1_i[i].size()==0)){ | ||||
| 	        auto val = regs->r_output_en&mask? | ||||
| 	                regs->r_port&mask? | ||||
| 	                        sc_dt::Log_1: | ||||
| 	                        sc_dt::Log_0: | ||||
| 	                sc_dt::Log_Z; | ||||
|             tlm::tlm_phase phase = write_output(gp, i, val); | ||||
| 	    } | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void gpio::enable_outputs(uint32_t new_iof_en, uint32_t new_iof_sel) { | ||||
|     auto changed_bits = (regs->r_iof_en^new_iof_en) | (regs->r_iof_sel^new_iof_sel); | ||||
|     tlm::tlm_signal_gp<sc_dt::sc_logic> gp; | ||||
|     for(size_t i=0, mask=1; i<32; ++i, mask<<=1){ | ||||
|         if(changed_bits&mask){ | ||||
|             if(new_iof_en&mask){ | ||||
|                 if((regs->r_iof_sel&mask)==0 && iof0_i[i].size()>0){ | ||||
|                     tlm::tlm_phase phase = write_output(gp, i, last_iof0[i]?sc_dt::Log_1:sc_dt::Log_0); | ||||
|                 } else if((regs->r_iof_sel&mask)==1 && iof1_i[i].size()>0) | ||||
|                     tlm::tlm_phase phase = write_output(gp, i, last_iof1[i]?sc_dt::Log_1:sc_dt::Log_0); | ||||
|             } else { | ||||
|                 auto val = regs->r_output_en&mask? | ||||
|                         regs->r_port&mask?sc_dt::Log_1:sc_dt::Log_0: | ||||
|                         sc_dt::Log_Z; | ||||
|                 tlm::tlm_phase phase = write_output(gp, i, val); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void gpio::pin_input(unsigned int tag, tlm::tlm_signal_gp<sc_logic>& gp, sc_core::sc_time& delay) { | ||||
|     if(delay>SC_ZERO_TIME){ | ||||
|          wait(delay); | ||||
|          delay=SC_ZERO_TIME; | ||||
|      } | ||||
|      switch(gp.get_value().value()){ | ||||
|      case sc_dt::Log_1: | ||||
|          regs->r_value|=1<<tag; | ||||
|          forward_pin_input(tag, gp); | ||||
|          break; | ||||
|      case sc_dt::Log_0: | ||||
|          regs->r_value&=~(1<<tag); | ||||
|          forward_pin_input(tag, gp); | ||||
|          break; | ||||
|      } | ||||
| } | ||||
|  | ||||
| void gpio::forward_pin_input(unsigned int tag, tlm::tlm_signal_gp<sc_logic>& gp) { | ||||
|     const auto mask = 1U<<tag; | ||||
|     if(regs->iof_en&mask){ | ||||
|         auto& socket = regs->iof_sel&mask?iof1_o[tag]:iof0_o[tag]; | ||||
|         tlm::tlm_signal_gp<> new_gp; | ||||
|         for(size_t i=0; i<socket.size(); ++i){ | ||||
|             sc_core::sc_time delay{SC_ZERO_TIME}; | ||||
|             tlm::tlm_phase phase{tlm::BEGIN_REQ}; | ||||
|             new_gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|             new_gp.set_response_status(tlm::TLM_OK_RESPONSE); | ||||
|             new_gp.set_value(gp.get_value().value()==sc_dt::Log_1); | ||||
|             new_gp.update_extensions_from(gp); | ||||
|             socket->nb_transport_fw(new_gp, phase, delay); // we don't care about phase and sync enum | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void gpio::iof_input(unsigned int tag, unsigned iof_idx, tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay) { | ||||
|     if(delay>SC_ZERO_TIME){ | ||||
|          wait(delay); | ||||
|          delay=SC_ZERO_TIME; | ||||
|     } | ||||
|     const auto mask = 1U<<tag; | ||||
|     if(regs->r_iof_en&mask){ | ||||
|         const auto idx = regs->r_iof_sel&mask?1:0; | ||||
|         if(iof_idx == idx){ | ||||
|             auto& socket = pins_o[tag]; | ||||
|             for(size_t i=0; i<socket.size(); ++i){ | ||||
|                 sc_core::sc_time delay{SC_ZERO_TIME}; | ||||
|                 tlm::tlm_phase phase{tlm::BEGIN_REQ}; | ||||
|                 tlm::tlm_signal_gp<sc_logic> new_gp; | ||||
|                 new_gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|                 auto val = gp.get_value(); | ||||
|                 new_gp.set_value(val?sc_dt::Log_1:sc_dt::Log_0); | ||||
|                 new_gp.copy_extensions_from(gp); | ||||
|                 socket->nb_transport_fw(new_gp, phase, delay); // we don't care about phase and sync enum | ||||
|                 gp.update_extensions_from(new_gp); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
							
								
								
									
										47
									
								
								platform/src/sysc/h_bridge.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								platform/src/sysc/h_bridge.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| /* | ||||
|  * h_bridge.cpp | ||||
|  * | ||||
|  *  Created on: 25.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/h_bridge.h" | ||||
| #include "scc/utilities.h" | ||||
|  | ||||
| namespace sysc { | ||||
| using namespace sc_core; | ||||
|  | ||||
| h_bridge::h_bridge(const sc_module_name& nm) | ||||
| :sc_module(nm) | ||||
| , NAMED(ha_i) | ||||
| , NAMED(la_i) | ||||
| , NAMED(hb_i) | ||||
| , NAMED(lb_i) | ||||
| , NAMED(hc_i) | ||||
| , NAMED(lc_i) | ||||
| , NAMED(va_o) | ||||
| , NAMED(vb_o) | ||||
| , NAMED(vc_o) | ||||
| , NAMED(vcc, 48.0) | ||||
| { | ||||
|     SC_METHOD(ain_cb); | ||||
|     sensitive<<ha_i<<la_i; | ||||
|     SC_METHOD(bin_cb); | ||||
|     sensitive<<hb_i<<lb_i; | ||||
|     SC_METHOD(cin_cb); | ||||
|     sensitive<<hc_i<<lc_i; | ||||
| } | ||||
|  | ||||
| h_bridge::~h_bridge() { | ||||
| } | ||||
|  | ||||
| void h_bridge::ain_cb() { | ||||
| } | ||||
|  | ||||
| void h_bridge::bin_cb() { | ||||
| } | ||||
|  | ||||
| void h_bridge::cin_cb() { | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										145
									
								
								platform/src/sysc/hifive1.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								platform/src/sysc/hifive1.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/hifive1.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| hifive1::hifive1(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(pins_o, 32) | ||||
| , NAMED(pins_i, 32) | ||||
| , NAMED(erst_n) | ||||
| , NAMED(i_core_complex) | ||||
| , NAMED(i_router, 12, 1) | ||||
| , NAMED(i_uart0) | ||||
| , NAMED(i_uart1) | ||||
| , NAMED(i_qspi0) | ||||
| , NAMED(i_qspi1) | ||||
| , NAMED(i_qspi2) | ||||
| , NAMED(i_gpio0) | ||||
| , NAMED(i_plic) | ||||
| , NAMED(i_aon) | ||||
| , NAMED(i_prci) | ||||
| , NAMED(i_clint) | ||||
| , NAMED(i_mem_qspi) | ||||
| , NAMED(i_mem_ram) | ||||
| , NAMED(s_tlclk) | ||||
| , NAMED(s_rst) | ||||
| , NAMED(s_global_int, 256) | ||||
| , NAMED(s_local_int, 16) | ||||
| , NAMED(s_core_int) | ||||
| , NAMED(s_dummy, 16) | ||||
| , NAMED(s_dummy_sck_i, 16) | ||||
| , NAMED(s_dummy_sck_o, 16) | ||||
| { | ||||
|     i_core_complex.initiator(i_router.target[0]); | ||||
|     size_t i = 0; | ||||
|     for (const auto &e : e300_plat_map) { | ||||
|         i_router.initiator.at(i)(e.target->socket); | ||||
|         i_router.add_target_range(i, e.start, e.size); | ||||
|         i++; | ||||
|     } | ||||
|     i_router.initiator.at(i)(i_mem_qspi.target); | ||||
|     i_router.add_target_range(i, 0x20000000, 512_MB); | ||||
|     i_router.initiator.at(++i)(i_mem_ram.target); | ||||
|     i_router.add_target_range(i, 0x80000000, 128_kB); | ||||
|  | ||||
|     i_uart0.clk_i(s_tlclk); | ||||
|     i_uart1.clk_i(s_tlclk); | ||||
|     i_qspi0.clk_i(s_tlclk); | ||||
|     i_qspi1.clk_i(s_tlclk); | ||||
|     i_qspi2.clk_i(s_tlclk); | ||||
|     i_gpio0.clk_i(s_tlclk); | ||||
|     i_plic.clk_i(s_tlclk); | ||||
|     i_aon.clk_i(s_tlclk); | ||||
|     i_aon.lfclkc_o(s_lfclk); | ||||
|     i_prci.hfclk_o(s_tlclk); // clock driver | ||||
|     i_clint.tlclk_i(s_tlclk); | ||||
|     i_clint.lfclk_i(s_lfclk); | ||||
|     i_core_complex.clk_i(s_tlclk); | ||||
|  | ||||
|     i_uart0.rst_i(s_rst); | ||||
|     i_uart1.rst_i(s_rst); | ||||
|     i_qspi0.rst_i(s_rst); | ||||
|     i_qspi1.rst_i(s_rst); | ||||
|     i_qspi2.rst_i(s_rst); | ||||
|     i_gpio0.rst_i(s_rst); | ||||
|     i_plic.rst_i(s_rst); | ||||
|     i_aon.rst_o(s_rst); | ||||
|     i_prci.rst_i(s_rst); | ||||
|     i_clint.rst_i(s_rst); | ||||
|     i_core_complex.rst_i(s_rst); | ||||
|  | ||||
|     i_aon.erst_n_i(erst_n); | ||||
|  | ||||
|     i_clint.mtime_int_o(s_mtime_int); | ||||
|     i_clint.msip_int_o(s_msie_int); | ||||
|  | ||||
|     i_plic.global_interrupts_i(s_global_int); | ||||
|     i_plic.core_interrupt_o(s_core_int); | ||||
|  | ||||
|     i_core_complex.sw_irq_i(s_msie_int); | ||||
|     i_core_complex.timer_irq_i(s_mtime_int); | ||||
|     i_core_complex.global_irq_i(s_core_int); | ||||
|     i_core_complex.local_irq_i(s_local_int); | ||||
|  | ||||
|     pins_i(i_gpio0.pins_i); | ||||
|     i_gpio0.pins_o(pins_o); | ||||
|  | ||||
|     i_gpio0.iof0_i[17](i_uart0.tx_o); | ||||
|     i_uart0.rx_i(i_gpio0.iof0_o[16]); | ||||
|     i_uart0.irq_o(s_global_int[3]); | ||||
|  | ||||
|     i_gpio0.iof0_i[2](i_qspi1.scs_o[0]); | ||||
|     i_gpio0.iof0_i[3](i_qspi1.mosi_o); | ||||
|     i_qspi1.miso_i(i_gpio0.iof0_o[4]); | ||||
|     i_gpio0.iof0_i[5](i_qspi1.sck_o); | ||||
|     i_gpio0.iof0_i[9](i_qspi1.scs_o[2]); | ||||
|     i_gpio0.iof0_i[10](i_qspi1.scs_o[3]); | ||||
|  | ||||
|     i_qspi0.irq_o(s_global_int[5]); | ||||
|     i_qspi1.irq_o(s_global_int[6]); | ||||
|     i_qspi2.irq_o(s_global_int[7]); | ||||
|  | ||||
|     s_dummy_sck_i[0](i_uart1.tx_o); | ||||
|     i_uart1.rx_i(s_dummy_sck_o[0]); | ||||
|     i_uart1.irq_o(s_global_int[4]); | ||||
|  | ||||
|     for(auto& sock:s_dummy_sck_i) sock.error_if_no_callback=false; | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										86
									
								
								platform/src/sysc/mcp3008.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								platform/src/sysc/mcp3008.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| /* | ||||
|  * mcp3008.cpp | ||||
|  * | ||||
|  *  Created on: 17.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/mcp3008.h" | ||||
|  | ||||
| #include <scc/report.h> | ||||
| #include <util/ities.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| mcp3008::mcp3008(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(sck_i) | ||||
| , NAMED(miso_o) | ||||
| , NAMED(mosi_i) | ||||
| , NAMED(cs_i) | ||||
| , NAMED(vref_i) | ||||
| , NAMED(ch_i, 8) | ||||
| , last_tx_start(sc_core::SC_ZERO_TIME) | ||||
| { | ||||
|     sck_i.register_nb_transport([this](tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) | ||||
|             -> tlm::tlm_sync_enum{ | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }); | ||||
|  | ||||
|     mosi_i.register_nb_transport([this](tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) | ||||
|             -> tlm::tlm_sync_enum{ | ||||
|         if(cs_v==sc_dt::Log_0) | ||||
|             return receive(gp, phase, delay); | ||||
|     }); | ||||
|  | ||||
|     cs_i.register_nb_transport([this](tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) | ||||
|             -> tlm::tlm_sync_enum{ | ||||
|         if(cs_v!=sc_dt::Log_0 && gp.get_value()==sc_dt::Log_0){ | ||||
|             idx=0; // falling edge | ||||
|             rx_bits=0; | ||||
|         } | ||||
|         cs_v=gp.get_value(); | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }); | ||||
| } | ||||
|  | ||||
| mcp3008::~mcp3008() { | ||||
| } | ||||
|  | ||||
| tlm::tlm_sync_enum mcp3008::receive(tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) { | ||||
|     gp.get_extension(ext); | ||||
|     if(ext){ | ||||
|         if( ext->start_time!=last_tx_start){ | ||||
|             assert(ext->tx.data_bits==8); | ||||
|             rx_bytes[idx]=bit_sub<0,8>(ext->tx.m2s_data); | ||||
|             if(idx==1) | ||||
|                 do_conversion(); | ||||
|             ext->tx.s2m_data=tx_bytes[idx]; | ||||
|             ext->tx.s2m_data_valid=true; | ||||
|             idx++; | ||||
|             last_tx_start=ext->start_time; | ||||
|         } | ||||
|     } | ||||
|     return tlm::TLM_COMPLETED; | ||||
| } | ||||
|  | ||||
| void mcp3008::do_conversion() { | ||||
|     if(rx_bytes[0]==0x1){ | ||||
|         auto mode = bit_sub<7,1>(rx_bytes[1]); | ||||
|         auto channel = bit_sub<4,3>(rx_bytes[1]); | ||||
|         auto vref=vref_i.read(); | ||||
|         if(mode){ // single ended | ||||
|             auto inp = ch_i[channel].read(); | ||||
|             auto norm = inp/vref*1024.0; | ||||
|             auto res = static_cast<int>(norm); | ||||
|             CLOG(DEBUG, SystemC)<<"Converting "<<inp<<" to "<<norm<<" as int "<<res; | ||||
|             tx_bytes[1]=bit_sub<8,2>(res); | ||||
|             tx_bytes[2]=bit_sub<0,8>(res); | ||||
|         } else { | ||||
|             tx_bytes[1]=0; | ||||
|             tx_bytes[2]=0; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										181
									
								
								platform/src/sysc/plic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								platform/src/sysc/plic.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,181 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include <sysc/SiFive/plic.h> | ||||
|  | ||||
| #include <scc/utilities.h> | ||||
| #include <scc/report.h> | ||||
| #include <sysc/SiFive/gen/plic_regs.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| plic::plic(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(global_interrupts_i, 256) | ||||
| , NAMED(core_interrupt_o) | ||||
| , NAMEDD(plic_regs, regs) | ||||
|  | ||||
| { | ||||
|     regs->registerResources(*this); | ||||
|     // register callbacks | ||||
|     init_callbacks(); | ||||
|     regs->claim_complete.set_write_cb(m_claim_complete_write_cb); | ||||
|  | ||||
|     // port callbacks | ||||
|     SC_METHOD(global_int_port_cb); | ||||
|     for (uint8_t i = 0; i < 255; i++) { | ||||
|         sensitive << global_interrupts_i[i].pos(); | ||||
|     } | ||||
|     dont_initialize(); | ||||
|  | ||||
|     // register event callbacks | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
| } | ||||
|  | ||||
| plic::~plic() {} | ||||
|  | ||||
| void plic::init_callbacks() { | ||||
|     m_claim_complete_write_cb = [=](scc::sc_register<uint32_t> reg, uint32_t v) -> bool { | ||||
|         reg.put(v); | ||||
|         reset_pending_int(v); | ||||
|         // std::cout << "Value of register: 0x" << std::hex << reg << std::endl; | ||||
|         // todo: reset related interrupt and find next high-prio interrupt | ||||
|         return true; | ||||
|     }; | ||||
| } | ||||
|  | ||||
| void plic::clock_cb() { | ||||
| 	this->clk = clk_i.read(); | ||||
| } | ||||
|  | ||||
| void plic::reset_cb() { | ||||
|     if (rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| // Functional handling of interrupts: | ||||
| // - global_int_port_cb() | ||||
| //   - set pending register bits | ||||
| //   - called by: incoming global_int | ||||
| // - handle_pending_int() | ||||
| //   - update claim register content | ||||
| //   - generate core-interrupt pulse | ||||
| //   - called by: | ||||
| //     - incoming global_int | ||||
| //     - complete-register write access | ||||
| // - reset_pending_int(int-id) | ||||
| //   - reset pending bit | ||||
| //   - call next handle_pending_int() | ||||
| //   - called by: | ||||
| //     - complete-reg write register content | ||||
|  | ||||
| void plic::global_int_port_cb() { | ||||
|  | ||||
|     // set related pending bit if enable is set for incoming global_interrupt | ||||
|     for (uint32_t i = 1; i < 256; i++) { | ||||
|     	auto reg_idx = i>>5; | ||||
|     	auto bit_ofs = i & 0x1F; | ||||
|         bool enable = regs->r_enabled[reg_idx] & (0x1 << bit_ofs); // read enable bit | ||||
|  | ||||
|         if (enable && global_interrupts_i[i].read() == 1) { | ||||
|             regs->r_pending[reg_idx] = regs->r_pending[reg_idx] | (0x1 << bit_ofs); | ||||
|             LOG(DEBUG) << "pending interrupt identified: " << i; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     handle_pending_int(); | ||||
| } | ||||
|  | ||||
| void plic::handle_pending_int() { | ||||
|     // identify high-prio pending interrupt and raise a core-interrupt | ||||
|     uint32_t claim_int = 0;  // claim interrupt | ||||
|     uint32_t claim_prio = 0; // related priority (highest prio interrupt wins the race) | ||||
|     bool raise_int = 0; | ||||
|     uint32_t thold = regs->r_threshold.threshold; // threshold value | ||||
|  | ||||
|     for (uint32_t i = 1; i < 255; i++) { | ||||
|     	auto reg_idx = i>>5; | ||||
|     	auto bit_ofs = i & 0x1F; | ||||
|         bool pending = (regs->r_pending[reg_idx] & (0x1 << bit_ofs)) ? true : false; | ||||
|         uint32_t prio = regs->r_priority[i - 1].priority; // read priority value | ||||
|  | ||||
|         if (pending && thold < prio) { | ||||
|             regs->r_pending[reg_idx] = regs->r_pending[reg_idx] | (0x1 << bit_ofs); | ||||
|             // below condition ensures implicitly that lowest id is selected in case of multiple identical | ||||
|             // priority-interrupts | ||||
|             if (prio > claim_prio) { | ||||
|                 claim_prio = prio; | ||||
|                 claim_int = i; | ||||
|                 raise_int = 1; | ||||
|                 LOG(DEBUG) << "pending interrupt activated: " << i; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (raise_int) { | ||||
|         regs->r_claim_complete = claim_int; | ||||
|         core_interrupt_o.write(1); | ||||
|         // todo: evluate clock period | ||||
|     } else { | ||||
|         regs->r_claim_complete = 0; | ||||
|         LOG(DEBUG) << "no further pending interrupt."; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void plic::reset_pending_int(uint32_t irq) { | ||||
|     // todo: evaluate enable register (see spec) | ||||
|     // todo: make sure that pending is set, otherwise don't reset irq ... read spec. | ||||
|     LOG(TRACE) << "reset pending interrupt: " << irq; | ||||
|     // reset related pending bit | ||||
| 	auto reg_idx = irq>>5; | ||||
| 	auto bit_ofs = irq & 0x1F; | ||||
|     regs->r_pending[reg_idx] &= ~(0x1 << bit_ofs); | ||||
|     core_interrupt_o.write(0); | ||||
|  | ||||
|     // evaluate next pending interrupt | ||||
|     handle_pending_int(); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										145
									
								
								platform/src/sysc/prci.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								platform/src/sysc/prci.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/prci.h" | ||||
|  | ||||
| #include "scc/utilities.h" | ||||
| #include "sysc/SiFive/gen/prci_regs.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| prci::prci(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(hfclk) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(hfclk_o) | ||||
| , NAMEDD(prci_regs, regs) { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
|     SC_METHOD(hfxosc_cb); | ||||
|     sensitive << hfxosc_i; | ||||
|     SC_METHOD(hfrosc_en_cb); | ||||
|     sensitive << hfrosc_en_evt; | ||||
|     dont_initialize(); | ||||
|  | ||||
|     regs->hfxosccfg.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         reg.put(data); | ||||
|         if (this->regs->r_hfxosccfg.hfxoscen==1) { // check rosc_en | ||||
|             this->hfxosc_en_evt.notify(1, sc_core::SC_US); | ||||
|         } else { | ||||
|             this->hfxosc_en_evt.notify(SC_ZERO_TIME); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->hfrosccfg.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         reg.put(data); | ||||
|         if (this->regs->r_hfrosccfg.hfroscen==1) { // check rosc_en | ||||
|             this->hfrosc_en_evt.notify(1, sc_core::SC_US); | ||||
|         } else { | ||||
|             this->hfrosc_en_evt.notify(SC_ZERO_TIME); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->pllcfg.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         reg.put(data); | ||||
|         auto &pllcfg = this->regs->r_pllcfg; | ||||
|         if (pllcfg.pllbypass == 0 && pllcfg.pllq != 0) { // set pll_lock if pll is selected | ||||
|             pllcfg.plllock = 1; | ||||
|         } | ||||
|         update_hfclk(); | ||||
|         return true; | ||||
|     }); | ||||
|     regs->plloutdiv.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         reg.put(data); | ||||
|         update_hfclk(); | ||||
|         return true; | ||||
|     }); | ||||
|     hfxosc_clk=62.5_ns; | ||||
| } | ||||
|  | ||||
| prci::~prci() {} | ||||
|  | ||||
| void prci::reset_cb() { | ||||
|     if (rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else { | ||||
|         regs->reset_stop(); | ||||
|         this->hfxosc_en_evt.notify(1, sc_core::SC_US); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void prci::hfxosc_cb() { | ||||
|     this->regs->r_hfxosccfg.hfxoscrdy=0; | ||||
|     this->hfxosc_en_evt.notify(1, sc_core::SC_US); | ||||
|  | ||||
| } | ||||
|  | ||||
| void prci::hfxosc_en_cb() { | ||||
|     update_hfclk(); | ||||
|     if(regs->r_hfxosccfg.hfxoscen==1)// set rosc_rdy | ||||
|         regs->r_hfxosccfg.hfxoscrdy =1; | ||||
|     else | ||||
|         regs->r_hfxosccfg.hfxoscrdy =0; | ||||
| } | ||||
|  | ||||
| void prci::hfrosc_en_cb() { | ||||
|     update_hfclk(); | ||||
|     auto& hfrosccfg=regs->r_hfrosccfg; | ||||
|     if(regs->r_hfrosccfg.hfroscen==1) {// set rosc_rdy | ||||
|         regs->r_hfrosccfg.hfroscrdy =1; | ||||
|     } else { | ||||
|         regs->r_hfrosccfg.hfroscrdy =0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void prci::update_hfclk() { | ||||
|     auto& hfrosccfg=regs->r_hfrosccfg; | ||||
|     auto& pllcfg=regs->r_pllcfg; | ||||
|     auto& plldiv=regs->r_plloutdiv; | ||||
|     hfrosc_clk = sc_core::sc_time(((hfrosccfg.hfroscdiv+1)*1.0)/(1125000.0*(hfrosccfg.hfrosctrim+1)), sc_core::SC_SEC); | ||||
|     auto pll_ref = pllcfg.pllrefsel==1?hfxosc_clk:hfrosc_clk; | ||||
|     auto r = pllcfg.pllr+1; | ||||
|     auto f = 2*(pllcfg.pllf+1); | ||||
|     auto q = 1<<pllcfg.pllq; | ||||
|     auto pll_out = pllcfg.pllbypass==1 || pllcfg.plllock==0?pll_ref:((pll_ref*r)/f)*q; | ||||
|     auto pll_res = plldiv&0x100?pll_out:2*pll_out*((plldiv&0x3f)+1); | ||||
|     hfclk = pllcfg.pllsel?pll_res:hfrosc_clk; | ||||
|     hfclk_o.write(hfclk); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										184
									
								
								platform/src/sysc/sc_comm_singleton.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								platform/src/sysc/sc_comm_singleton.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/sc_comm_singleton.h" | ||||
|  | ||||
| #include "seasocks/PrintfLogger.h" | ||||
| #include "seasocks/Server.h" | ||||
| #include "seasocks/StringUtil.h" | ||||
| #include "seasocks/util/Json.h" | ||||
| #include "seasocks/ResponseWriter.h" | ||||
| #include "seasocks/util/RootPageHandler.h" | ||||
| #include "seasocks/util/CrackedUriPageHandler.h" | ||||
| #include "seasocks/util/StaticResponseHandler.h" | ||||
|  | ||||
| #include <cstdio> | ||||
| #include <csignal> | ||||
| #include <sys/stat.h> | ||||
| #include <cerrno> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| using namespace seasocks; | ||||
| using namespace std; | ||||
|  | ||||
| namespace { | ||||
| inline void die(){perror(nullptr);exit(errno);} | ||||
| } | ||||
|  | ||||
| sc_comm_singleton::sc_comm_singleton(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , m_serv(new Server(std::make_shared<PrintfLogger>(Logger::Level::WARNING))) | ||||
| , needs_client(false) | ||||
| , client_started(false){ | ||||
| 	m_serv->addPageHandler(std::make_shared<DefaultPageHandler>(*this)); | ||||
| } | ||||
|  | ||||
| sc_comm_singleton::~sc_comm_singleton() { | ||||
| 	//Join the thread with the main thread | ||||
| 	t.join(); | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::start_of_simulation() { | ||||
| 	//Launch a thread | ||||
| 	t=std::thread(&sc_comm_singleton::thread_func, this); | ||||
| 	if(needs_client) start_client(); | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::end_of_simulation() { | ||||
| 	get_server().terminate(); | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::start_client() { | ||||
| 	if(client_started) return; | ||||
| 	std::stringstream ss; | ||||
| #ifndef WIN32 | ||||
| 	if(fork()==0){ | ||||
| 		// daemonizing, see http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon_in_c.html#id2407077 | ||||
| 	    // Fork, allowing the parent process to terminate. | ||||
| 	    pid_t pid = fork(); | ||||
| 	    if (pid == -1) { | ||||
| 	        die(); | ||||
| 	    } else if (pid != 0) { | ||||
| 	        _exit(0); | ||||
| 	    } | ||||
| 	    // Start a new session for the daemon. | ||||
| 	    if (setsid()==-1) die(); | ||||
| 	    // Fork again, allowing the parent process to terminate. | ||||
| 	    signal(SIGHUP,SIG_IGN); | ||||
| 	    pid=fork(); | ||||
| 	    if (pid == -1) { | ||||
| 	        die(); | ||||
| 	    } else if (pid != 0) { | ||||
| 	        _exit(0); | ||||
| 	    } | ||||
| 	    // Set the current working directory to the root directory. | ||||
| 	    if (chdir("/") == -1) die(); | ||||
| 	    // Set the user file creation mask to zero. | ||||
| 	    umask(0); | ||||
|  | ||||
| 	    // Close then reopen standard file descriptors. | ||||
| 	    close(STDIN_FILENO); | ||||
| 	    close(STDOUT_FILENO); | ||||
| 	    close(STDERR_FILENO); | ||||
| 	    if (open("/dev/null",O_RDONLY) == -1) die(); | ||||
| 	    if (open("/dev/null",O_WRONLY) == -1) die(); | ||||
| 	    if (open("/dev/null",O_RDWR) == -1)  die(); | ||||
| 		// now do what is needed | ||||
| 		ss<<"x-www-browser http://localhost:9090/ws.html"; //Linux | ||||
| 		auto res = system (ss.str().c_str()); | ||||
| 		if(res==0) exit(0); | ||||
| 		ss.str(""); | ||||
| 		ss<<"xdg-open  http://localhost:9090/ws.html"; // Linux | ||||
| 		res=system (ss.str().c_str()); | ||||
| 		if(res==0) exit(0); | ||||
| 		ss.str(""); | ||||
| 		ss<<"open  http://localhost:9090/ws.html"; // MacOS | ||||
| 		res=system (ss.str().c_str()); | ||||
| 		exit(0); | ||||
| 	} | ||||
| 	// #else | ||||
| 	// on windows should be open, see https://www.experts-exchange.com/articles/1595/Execute-a-Program-with-C.html | ||||
| #endif | ||||
| 	client_started=true; | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::registerWebSocketHandler(const char* endpoint, | ||||
| 		std::shared_ptr<WebSocket::Handler> handler, | ||||
| 		bool allowCrossOriginRequests) { | ||||
| 	get_server().addWebSocketHandler(endpoint, handler, allowCrossOriginRequests); | ||||
| 	endpoints.push_back(endpoint); | ||||
| 	needs_client=true; | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::execute(std::function<void()> f) { | ||||
| 	get_server().execute(f); | ||||
| } | ||||
|  | ||||
| void sc_comm_singleton::thread_func() { | ||||
| 	get_server().serve("./html", 9090); | ||||
| } | ||||
|  | ||||
| Server& sc_comm_singleton::get_server() { | ||||
| 	return *m_serv.get(); | ||||
| } | ||||
|  | ||||
|  | ||||
| std::shared_ptr<Response> sc_comm_singleton::DefaultPageHandler::handle(const Request& request) { | ||||
| 	if(request.verb() == Request::Verb::Get && request.getRequestUri()=="conf.json"){ | ||||
| 		return Response::htmlResponse("{}"); | ||||
| 	} | ||||
| 	return Response::unhandled(); | ||||
| } | ||||
|  | ||||
| void WsHandler::onConnect(WebSocket* connection) { | ||||
| 	_connections.insert(connection); | ||||
| } | ||||
|  | ||||
| void WsHandler::onData(WebSocket* connection, const char* data) { | ||||
| 	if (0 == strcmp("close", data)) { | ||||
| 		connection->close(); | ||||
| 	} else if(callback) | ||||
| 		callback(data); | ||||
| } | ||||
|  | ||||
| void WsHandler::onDisconnect(WebSocket* connection) { | ||||
| 	_connections.erase(connection); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
							
								
								
									
										219
									
								
								platform/src/sysc/spi.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								platform/src/sysc/spi.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/spi.h" | ||||
|  | ||||
| #include "sysc/tlm_extensions.h" | ||||
| #include "scc/utilities.h" | ||||
| #include "sysc/SiFive/gen/spi_regs.h" | ||||
| #include <util/ities.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| spi::spi(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(sck_o) | ||||
| , NAMED(mosi_o) | ||||
| , NAMED(miso_i) | ||||
| , NAMED(scs_o, 4) | ||||
| , NAMED(irq_o) | ||||
| , NAMED(bit_true_transfer, false) | ||||
| , NAMEDD(spi_regs, regs) { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
|     SC_THREAD(transmit_data); | ||||
|     miso_i.register_nb_transport([this](tlm::tlm_signal_gp<bool>& gp, | ||||
|             tlm::tlm_phase& phase, sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|        this->receive_data(gp, delay); | ||||
|        return tlm::TLM_COMPLETED; | ||||
|     }); | ||||
|     regs->txdata.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             reg.put(data); | ||||
|             tx_fifo.nb_write(static_cast<uint8_t>(regs->r_txdata.data)); | ||||
|             regs->r_txdata.full=tx_fifo.num_free()==0; | ||||
|             update_irq(); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->rxdata.set_read_cb([this](const scc::sc_register<uint32_t> ®, uint32_t& data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             uint8_t val; | ||||
|             if(rx_fifo.nb_read(val)){ | ||||
|                 regs->r_rxdata.empty=0; | ||||
|                 regs->r_rxdata.data=val; | ||||
|                 if(regs->r_rxmark.rxmark<=rx_fifo.num_available()){ | ||||
|                     regs->r_ip.rxwm=1; | ||||
|                     update_irq(); | ||||
|                 } | ||||
|             } else | ||||
|                 regs->r_rxdata.empty=1; | ||||
|             data = reg.get()®.rdmask; | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->csmode.set_write_cb([this](const scc::sc_register<uint32_t> ®, uint32_t& data) -> bool { | ||||
|         if(regs->r_csmode.mode==2 && regs->r_csmode.mode != bit_sub<0, 2>(data) && regs->r_csid<4){ | ||||
|             tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|             sc_core::sc_time delay(SC_ZERO_TIME); | ||||
|             tlm::tlm_signal_gp<> gp; | ||||
|             gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|             gp.set_value(true); | ||||
|             scs_o[regs->r_csid]->nb_transport_fw(gp, phase, delay); | ||||
|         } | ||||
|         reg.put(data); | ||||
|         return true; | ||||
|     }); | ||||
|     regs->csid.set_write_cb([this](const scc::sc_register<uint32_t> ®, uint32_t& data) -> bool { | ||||
|         if(regs->r_csmode.mode==2 && regs->csid != data && regs->r_csid<4){ | ||||
|             tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|             sc_core::sc_time delay(SC_ZERO_TIME); | ||||
|             tlm::tlm_signal_gp<> gp; | ||||
|             gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|             gp.set_value(true); | ||||
|             scs_o[regs->r_csid]->nb_transport_fw(gp, phase, delay); | ||||
|         } | ||||
|         reg.put(data); | ||||
|         return true; | ||||
|     }); | ||||
|     regs->csdef.set_write_cb([this](const scc::sc_register<uint32_t> ®, uint32_t& data) -> bool { | ||||
|         auto diff = regs->csdef ^ data; | ||||
|         if(regs->r_csmode.mode==2 && diff!=0 && (regs->r_csid<4) && (diff & (1<<regs->r_csid))!=0){ | ||||
|             tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|             sc_core::sc_time delay(SC_ZERO_TIME); | ||||
|             tlm::tlm_signal_gp<> gp; | ||||
|             gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|             gp.set_value(true); | ||||
|             scs_o[regs->r_csid]->nb_transport_fw(gp, phase, delay); | ||||
|         } | ||||
|         reg.put(data); | ||||
|         return true; | ||||
|     }); | ||||
|     regs->ie.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         update_irq(); | ||||
|     }); | ||||
|     regs->ip.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         update_irq(); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| spi::~spi() {} | ||||
|  | ||||
| void spi::clock_cb() { | ||||
| 	this->clk = clk_i.read(); | ||||
| } | ||||
|  | ||||
| void spi::reset_cb() { | ||||
|     if (rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| void spi::transmit_data() { | ||||
|     uint8_t txdata; | ||||
|     sysc::tlm_signal_spi_extension ext; | ||||
|     tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|     tlm::tlm_signal_gp<> gp; | ||||
|     sc_core::sc_time delay(SC_ZERO_TIME); | ||||
|     sc_core::sc_time bit_duration(SC_ZERO_TIME); | ||||
|  | ||||
|     gp.set_extension(&ext); | ||||
|     ext.tx.data_bits=8; | ||||
|  | ||||
|     auto set_bit = [&](bool val, scc::tlm_signal_bool_opt_out& socket){ | ||||
|         if(socket.get_interface()==nullptr) return; | ||||
|         gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|         gp.set_value(val); | ||||
|         tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|         socket->nb_transport_fw(gp, phase, delay); | ||||
|     }; | ||||
|  | ||||
|     wait(delay); //intentionally 0ns; | ||||
|     while(true){ | ||||
|         wait(tx_fifo.data_written_event()); | ||||
|         if(regs->r_csmode.mode != 3 && regs->r_csid<4) // not in OFF mode | ||||
|             set_bit(false, scs_o[regs->r_csid]); | ||||
|         set_bit(regs->r_sckmode.pol, sck_o); | ||||
|         while(tx_fifo.nb_read(txdata)){ | ||||
|             regs->r_txdata.full=tx_fifo.num_free()==0; | ||||
|             regs->r_ip.txwm=regs->r_txmark.txmark<=(7-tx_fifo.num_free())?1:0; | ||||
|             bit_duration = 2*(regs->r_sckdiv.div+1)*clk; | ||||
|             ext.start_time = sc_core::sc_time_stamp(); | ||||
|             ext.tx.m2s_data=txdata; | ||||
|             ext.tx.s2m_data_valid=false; | ||||
|             set_bit(txdata&0x80, mosi_o); // 8 data bits, MSB first | ||||
|             set_bit(1-regs->r_sckmode.pol, sck_o); | ||||
|             wait(bit_duration/2); | ||||
|             set_bit(regs->r_sckmode.pol, sck_o); | ||||
|             wait(bit_duration/2); | ||||
|             if(bit_true_transfer.get_value()){ | ||||
|                 for(size_t i = 0, mask=0x40; i<7; ++i, mask>=1){ | ||||
|                     set_bit(txdata&mask, mosi_o); // 8 data bits, MSB first | ||||
|                     set_bit(1-regs->r_sckmode.pol, sck_o); | ||||
|                     wait(bit_duration/2); | ||||
|                     set_bit(regs->r_sckmode.pol, sck_o); | ||||
|                     wait(bit_duration/2); | ||||
|  | ||||
|                 } | ||||
|             } else | ||||
|                 wait(7*bit_duration); | ||||
|             rx_fifo.nb_write(ext.tx.s2m_data&0xff); | ||||
|             if(regs->r_rxmark.rxmark<=rx_fifo.num_available()){ | ||||
|                 regs->r_ip.rxwm=1; | ||||
|                 update_irq(); | ||||
|             } | ||||
|         } | ||||
|         if(regs->r_csmode.mode == 0 && regs->r_csid<4) // in AUTO mode | ||||
|             set_bit(false, scs_o[regs->r_csid]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void spi::receive_data(tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay) { | ||||
| } | ||||
|  | ||||
| void spi::update_irq() { | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
							
								
								
									
										88
									
								
								platform/src/sysc/system.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								platform/src/sysc/system.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| /* | ||||
|  * system.cpp | ||||
|  * | ||||
|  *  Created on: 11.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/system.h" | ||||
|  | ||||
| using namespace sysc; | ||||
|  | ||||
| system::system(sc_core::sc_module_name nm) | ||||
| : sc_module(nm) | ||||
| , NAMED(s_gpio, 32) | ||||
| , NAMED(s_rst_n) | ||||
| , NAMED(s_vref) | ||||
| , NAMED(s_va) | ||||
| , NAMED(s_vb) | ||||
| , NAMED(s_vc) | ||||
| , NAMED(s_ana, 5) | ||||
| , NAMED(i_platform) | ||||
| , NAMED(i_terminal) | ||||
| , NAMED(i_adc) | ||||
| , NAMED(i_h_bridge) | ||||
| , NAMED(i_motor) | ||||
| { | ||||
|     // connect platform | ||||
|     i_platform.erst_n(s_rst_n); | ||||
|  | ||||
|     for(auto i=0U; i<s_gpio.size(); ++i){ | ||||
|       s_gpio[i].in(i_platform.pins_o[i]); | ||||
|       i_platform.pins_i[i](s_gpio[i].out); | ||||
|     } | ||||
|     // connect other units | ||||
|     // terminal | ||||
|     i_terminal.tx_o(s_gpio[16].in); | ||||
|     s_gpio[17].out(i_terminal.rx_i); | ||||
|     // adc digital io | ||||
|     s_gpio[2].out(i_adc.cs_i); | ||||
|     s_gpio[3].out(i_adc.mosi_i); | ||||
|     i_adc.miso_o(s_gpio[4].in); | ||||
|     s_gpio[5].out(i_adc.sck_i); | ||||
|     // adc analog inputs | ||||
|     i_adc.vref_i(s_vref); | ||||
|     i_adc.ch_i[0](s_vasens); | ||||
|     i_adc.ch_i[1](s_vbsens); | ||||
|     i_adc.ch_i[2](s_vcsens); | ||||
|     i_adc.ch_i[3](s_ana[0]); | ||||
|     i_adc.ch_i[4](s_ana[1]); | ||||
|     i_adc.ch_i[5](s_ana[2]); | ||||
|     i_adc.ch_i[6](s_ana[3]); | ||||
|     i_adc.ch_i[7](s_ana[4]); | ||||
|  | ||||
|     i_h_bridge.ha_i(s_gpio[0]); | ||||
|     i_h_bridge.la_i(s_gpio[1]); | ||||
|     i_h_bridge.hb_i(s_gpio[10]); | ||||
|     i_h_bridge.lb_i(s_gpio[11]); | ||||
|     i_h_bridge.hc_i(s_gpio[19]); | ||||
|     i_h_bridge.lc_i(s_gpio[20]); | ||||
|     i_h_bridge.va_o(s_va); | ||||
|     i_h_bridge.vb_o(s_vb); | ||||
|     i_h_bridge.vc_o(s_vc); | ||||
|  | ||||
|     i_motor.va_i(s_va); | ||||
|     i_motor.vb_i(s_vb); | ||||
|     i_motor.vc_i(s_vc); | ||||
|     i_motor.va_o(s_vasens); | ||||
|     i_motor.vb_o(s_vbsens); | ||||
|     i_motor.vc_o(s_vcsens); | ||||
|  | ||||
|     SC_THREAD(gen_por); | ||||
| } | ||||
|  | ||||
| system::~system() { | ||||
| } | ||||
|  | ||||
| void sysc::system::gen_por() { | ||||
|     // single shot | ||||
|     s_rst_n = false; | ||||
|     wait(10_ns); | ||||
|     s_rst_n = true; | ||||
|     s_vref=1.024; | ||||
|     double val=0.1; | ||||
|     for(auto& sig:s_ana){ | ||||
|         sig=val; | ||||
|         val+=0.12; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										69
									
								
								platform/src/sysc/terminal.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								platform/src/sysc/terminal.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|  * terminal.cpp | ||||
|  * | ||||
|  *  Created on: 07.07.2018 | ||||
|  *      Author: eyck | ||||
|  */ | ||||
|  | ||||
| #include "sysc/top/terminal.h" | ||||
|  | ||||
| #include "sysc/sc_comm_singleton.h" | ||||
| #include "sysc/tlm_extensions.h" | ||||
| #include "scc/report.h" | ||||
|  | ||||
| using namespace sysc; | ||||
|  | ||||
| terminal::terminal() | ||||
| : terminal(sc_core::sc_gen_unique_name("terminal")) | ||||
| { | ||||
| } | ||||
|  | ||||
| terminal::terminal(const sc_core::sc_module_name& nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(tx_o) | ||||
| , NAMED(rx_i) | ||||
| , NAMED(write_to_ws, false) | ||||
| { | ||||
|     rx_i.register_nb_transport([this]( | ||||
|             tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, | ||||
|             tlm::tlm_phase& phase, | ||||
|             sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|         this->receive(gp, delay); | ||||
|         return tlm::TLM_COMPLETED; | ||||
|     }); | ||||
| } | ||||
|  | ||||
| terminal::~terminal() { | ||||
| } | ||||
|  | ||||
| void terminal::before_end_of_elaboration() { | ||||
|     if(write_to_ws.get_value()) { | ||||
|         LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name()); | ||||
|         handler=std::make_shared<WsHandler>(); | ||||
|         sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| void terminal::receive(tlm::tlm_signal_gp<sc_dt::sc_logic>& gp, sc_core::sc_time& delay) { | ||||
|     sysc::tlm_signal_uart_extension* ext; | ||||
|     gp.get_extension(ext); | ||||
|     if(ext && ext->start_time!=last_tx_start){ | ||||
|         uint8_t txdata = static_cast<uint8_t>(ext->tx.data); | ||||
|         last_tx_start = ext->start_time; | ||||
|         if(txdata != '\r') queue.push_back(txdata); | ||||
|         if (queue.size() >> 0 && (txdata == '\n' || txdata == 0)) { | ||||
|             std::string msg(queue.begin(), queue.end()-1); | ||||
|             sc_core::sc_time now = sc_core::sc_time_stamp(); | ||||
|             if(handler) | ||||
|                 sysc::sc_comm_singleton::inst().execute([this, msg, now](){ | ||||
|                     std::stringstream os; | ||||
|                     os << "{\"time\":\"" << now << "\",\"message\":\""<<msg<<"\"}"; | ||||
|                     this->handler->send(os.str()); | ||||
|                 }); | ||||
|             else | ||||
|                 LOG(INFO) << this->name() << " receive: '" << msg << "'"; | ||||
|             queue.clear(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										183
									
								
								platform/src/sysc/uart.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								platform/src/sysc/uart.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Contributors: | ||||
| //       eyck@minres.com - initial implementation | ||||
| // | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "sysc/SiFive/uart.h" | ||||
|  | ||||
| #include "sysc/tlm_extensions.h" | ||||
| #include "scc/report.h" | ||||
| #include "scc/utilities.h" | ||||
| #include "sysc/SiFive/gen/uart_regs.h" | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| uart::uart(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMED(rst_i) | ||||
| , NAMED(tx_o) | ||||
| , NAMED(rx_i) | ||||
| , NAMED(irq_o) | ||||
| , NAMED(bit_true_transfer, false) | ||||
| , NAMEDD(uart_regs, regs) | ||||
| , NAMED(rx_fifo, 8) | ||||
| , NAMED(tx_fifo, 8) | ||||
| { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive << clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive << rst_i; | ||||
|     dont_initialize(); | ||||
|     SC_THREAD(transmit_data); | ||||
|     rx_i.register_nb_transport([this](tlm::tlm_signal_gp<bool>& gp, | ||||
|             tlm::tlm_phase& phase, sc_core::sc_time& delay)->tlm::tlm_sync_enum{ | ||||
|        this->receive_data(gp, delay); | ||||
|        return tlm::TLM_COMPLETED; | ||||
|     }); | ||||
|     regs->txdata.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             reg.put(data); | ||||
|             tx_fifo.nb_write(static_cast<uint8_t>(regs->r_txdata.data)); | ||||
|             regs->r_txdata.full=tx_fifo.num_free()==0; | ||||
|             regs->r_ip.txwm=regs->r_txctrl.txcnt<=(7-tx_fifo.num_free())?1:0; | ||||
|             update_irq(); | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->rxdata.set_read_cb([this](const scc::sc_register<uint32_t> ®, uint32_t& data) -> bool { | ||||
|         if (!this->regs->in_reset()) { | ||||
|             uint8_t val; | ||||
|             if(rx_fifo.nb_read(val)){ | ||||
|                 regs->r_rxdata.data=val; | ||||
|                 if(regs->r_rxctrl.rxcnt<=rx_fifo.num_available()){ | ||||
|                     regs->r_ip.rxwm=1; | ||||
|                     update_irq(); | ||||
|                 } | ||||
|             } | ||||
|             data = reg.get()®.rdmask; | ||||
|         } | ||||
|         return true; | ||||
|     }); | ||||
|     regs->ie.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         update_irq(); | ||||
|     }); | ||||
|     regs->ip.set_write_cb([this](scc::sc_register<uint32_t> ®, uint32_t data) -> bool { | ||||
|         update_irq(); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| uart::~uart() {} | ||||
|  | ||||
| void uart::update_irq() { | ||||
|     irq_o=(regs->r_ip.rxwm==1 && regs->r_ie.rxwm==1) || (regs->r_ip.txwm==1 && regs->r_ie.txwm==1); | ||||
| } | ||||
|  | ||||
| void uart::clock_cb() { | ||||
| 	this->clk = clk_i.read(); | ||||
| } | ||||
|  | ||||
| void uart::reset_cb() { | ||||
|     if (rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| void uart::transmit_data() { | ||||
|     uint8_t txdata; | ||||
|     sysc::tlm_signal_uart_extension ext; | ||||
|     tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|     tlm::tlm_signal_gp<> gp; | ||||
|     sc_core::sc_time delay(SC_ZERO_TIME); | ||||
|     sc_core::sc_time bit_duration(SC_ZERO_TIME); | ||||
|  | ||||
|     gp.set_extension(&ext); | ||||
|     ext.tx.data_bits=8; | ||||
|     ext.tx.parity=false; | ||||
|  | ||||
|     auto set_bit = [&](bool val){ | ||||
|         gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|         gp.set_value(val); | ||||
|         tlm::tlm_phase phase(tlm::BEGIN_REQ); | ||||
|         tx_o->nb_transport_fw(gp, phase, delay); | ||||
|         if(delay<bit_duration) wait(bit_duration-delay); | ||||
|     }; | ||||
|     wait(delay); | ||||
|     while(true){ | ||||
|         set_bit(true); | ||||
|         wait(tx_fifo.data_written_event()); | ||||
|         while(tx_fifo.nb_read(txdata)){ | ||||
|             regs->r_txdata.full=tx_fifo.num_free()==0; | ||||
|             regs->r_ip.txwm=regs->r_txctrl.txcnt<=(7-tx_fifo.num_free())?1:0; | ||||
|             bit_duration = (regs->r_div.div+1)*clk; | ||||
|             ext.start_time = sc_core::sc_time_stamp(); | ||||
|             ext.tx.stop_bits=1+regs->r_txctrl.nstop; | ||||
|             ext.tx.baud_rate=static_cast<unsigned>(1/bit_duration.to_seconds()); | ||||
|             ext.tx.data=txdata; | ||||
|             set_bit(false); // start bit | ||||
|             if(bit_true_transfer.get_value()){ | ||||
|                 for(int i = 8; i>0; --i) | ||||
|                     set_bit(txdata&(1<<(i-1))); // 8 data bits, MSB first | ||||
|                 if(regs->r_txctrl.nstop) set_bit(true); // stop bit 1 | ||||
|             } else | ||||
|                 wait(8*bit_duration); | ||||
|             set_bit(true); // stop bit 1/2 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void uart::receive_data(tlm::tlm_signal_gp<>& gp, sc_core::sc_time& delay) { | ||||
|     sysc::tlm_signal_uart_extension* ext{nullptr}; | ||||
|     gp.get_extension(ext); | ||||
|     if(ext && ext->start_time != rx_last_start){ | ||||
|         auto data = static_cast<uint8_t>(ext->tx.data); | ||||
|         if(ext->tx.parity || ext->tx.data_bits!=8) data = rand(); // random value if wrong config | ||||
|         rx_fifo.write(data); | ||||
|         if(regs->r_rxctrl.rxcnt<=rx_fifo.num_available()){ | ||||
|             regs->r_ip.rxwm=1; | ||||
|             update_irq(); | ||||
|         } | ||||
|         rx_last_start=ext->start_time; // omit repeated handling of signal changes | ||||
|     } | ||||
|     gp.set_response_status(tlm::TLM_OK_RESPONSE); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user