URL
https://opencores.org/ocsvn/ion/ion/trunk
Subversion Repositories ion
[/] [ion/] [trunk/] [doc/] [src/] [tex/] [sw_samples.tex] - Rev 243
Go to most recent revision | Compare with Previous | Blame | View Log
\chapter{Code samples} \label{samples} Directory /src directory contains a few test applications that can be simulated and run on real hardware, except for the opcode test which can only be simulated. See the readme file and the makefile for each program.\\ Please read the /src/reame.txt file for information that will probably be more up-to-date than this doc.\\ The makefiles have been tested with the CodeSourcery toolchain for windows (that can be downloaded from www.codesourcery.com) and with the Buildroot toolchain for GNU/Linux.\\ Most makefiles have two targets, to create a simulation test bench and a synthesizable demo.\\ Target 'sim' will build the simulation test bench package files as described in section~\ref{logic_simulation}. Target 'demo' will build a synthesizable demo; it will compile the sample sources and place the resulting object code in file '/vhdl/SoC/bootstrap\_code\_pkg.vhdl'.\\ The build process will produce two or more binary files ('*.code' and '*.data', or '*.bin') that can be run on the software simulator, plus a listing file (*.lst) handy for debugging.\\ All projects include a DOS batch file 'swsim.bat' that invokes the software simulator with the proper parameters. As an example, these are the contents of the 'swsim.bat' file for the 'hello' demo: \needspace{8\baselineskip} \begin{verbatim} @rem Run software simulator in hands-off mode ..\..\tools\slite\slite\bin\Debug\slite.exe ^ --bram=hello.code ^ --trigger=bfc00000 ^ --noprompt ^ --nomips32 ^ --map=hello.map ^ --trace_log=trace_log.txt \end{verbatim}\\ As you can see, the simulator is invoked in 'batch' or 'hands-off' mode, so the simulated program will be run to completion, generating a simulation log. The point of this is comparing that log to the log generated by the Modelsim simulation of the same program, as has already been explained. The python script 'bin2hdl.py' is used to insert binary data on vhdl templates. Assuming you have Python 2.5 or later in your machine, call the script with: \needspace{1\baselineskip} \begin{verbatim} python bin2hdl.py --help \end{verbatim}\\ to get a short description (see section~\ref{python_script}). \section{Support Code} \label{support_code} \subsection{Bootstrap Code} \label{asm_bootstrap_code} File \emph{'/src/common/bootstrap.s'} contains the reset code and the stub interrupt handler. This code is meant to be placed at the reset vector address; in the present revision of the project, the bootstrap code would be placed in the bootstrap BRAM of the SoC module (see section ~\ref{bootstrap_code}). It can be placed in external memory if the SoC memory map and the makefiles are altered accordingly. The reset code initializes both I-Cache and D-Cache and jumps to symbol \texttt{'entry'} with the CPU in kernel mode and interrupts disabled. The interrupt code is somewhat more elaborate but nevertheless is still a stub. The interrupt code will find out the cause of the interrupt and will proceed. Table ~\ref{tab_irq_handling} shows interrupt sources recognized in the current version, and how the interrupt code deals with them. \begin{table}[h] \caption{Interrupt handling\label{tab_irq_handling}} \begin{tabularx}{\textwidth}{ l|X } \toprule Cause & Processing \\ \midrule SYSCALL instruction & Return immediately (STUB). \\ BREAK instruction & Return immediately (STUB). \\ Invalid opcode & Return immediately (STUB). \\ Unimplemented MIPS-32 opcode & Emulate opcode. \\ \bottomrule \end{tabularx} \end{table} Please note that the interrupt code does not even \emph{know} there is such a thing as a hardware interrupt -- hardware interrupts are not implemented yet in the CPU. As can be seen, most of the interrupt processing is missing, replaced by stubs. Eventually, those stubs will be replaced with calls to C functions that will be defined in the supporting libraries. I have yet to work out exactly how to do it without reinventing the wheel. The only interrupt processing that is performed (even if only partially) is the emulation of \emph{some} MIPS-32 opcodes. \subsection{MIPS-32 Opcode Emulation} \label{mips32_opcode_emulation} I have found out that most MIPS toolchains target the MIPS-32 architecture and can only be made to work with the MIPS-I architecture with some difficulty. This applies specially to the C support libraries, where MIPS-32 opcodes are used occasionally. Other reasons, such as the availability of MIPS-32 ports of uClinux, make at least partial compatibility to MIPS-32 very desirable. On the other hand, extending the core to implement the full MIPS-32 specs (as opposed to the far simpler MIPS-I) might not be possible without running into a patent minefield -- I may be wrong in this. Therefore, I have chosen to just emulate whatever subset of the MIPS-32 ISA is enough to overcome the above obstacles. I have run some experiments with uClinux and have found out that only a few MIPS-32 opcodes need to be emulated -- see table ~\ref{tab_emulated_opcodes}. \begin{table}[h] \caption{Emulated MIPS-32 opcodes\label{tab_emulated_opcodes}} \begin{tabularx}{\textwidth}{ l|X } \toprule Opcode & Emulation \\ \midrule EXT & Fully emulated. \\ INS & Fully emulated. \\ CLO & Fully emulated. \\ CLZ & Fully emulated. \\ \midrule MUL (3-reg version) & To Be Done. \\ LWL & To Be Done. \\ LWR & To Be Done. \\ SWL & To Be Done. \\ SWR & To Be Done. \\ \bottomrule \end{tabularx} \end{table} Opcode emulation is implemented in file \emph{/src/common/opcode\_emu.s}. The emulation code has been tested (code sample \emph{'opcodes'}) but is still unfinished: not only are there opcodes to be emulated, as can be seen in table ~\ref{tab_emulated_opcodes}, but the emulation does NOT work when the MIPS-32 opcode is in a delay slot; or more precisely, the jump instruction of the delay slot is not emulated as it should -- this is just work to be done, nothing specially difficult. If the trapped MIPS-32 opcode is not one of the emulated opcodes, it is ignored exactly as if it was a NOP. A flag is raised in a special, reserved area of the BSS segment -- see the source for details. Eventually the trap handling will be complete and unimplemented MIPS-32 opcodes will be dealt with as undefined opcodes. Note that opcode emulation can be disabled in the makefiles, by defining symbol \texttt{NO\_EMU\_MIPS32} when assembling \emph{bootstrap.s}. \subsection{C Startup Code} \label{c_startup_code} File \emph{'/src/common/c\_startup.s'} contains the C startup code used in all C code samples. This startup code does what's usual in these cases, namely: \begin{enumerate} \item Initialize the stack at the end of the bss area. \item Clear the bss area. \item Move the data section from FLASH to RAM (if applicable). \item Call main(). \item Freeze in endless loop after main() returns, if it does. \end{enumerate} See the makefile of any of the C code samples for examples on how to assemble, configure and link the startup code. \subsection{C Support Library Replacement} \label{libsoc} The core will eventually be tested with one of the regular, free libc replacement libraries available. It isn't yet because building those libraries for a MIPS-I target (i.e. with no MIPS-32 stuff mixed in) has turned out to be much more difficult than I had anticipated. In order to be able to use the C toolchain and provide some code samples in C, I have built a minimalistic libc replacement called 'libsoc'. The source code can be found in \emph{/src/common/libsoc/src}. This mini-libc provides only those C support functions I have found necessary so far; it will be extended with new functionality as I add more code samples, until I can finally use some real C library. Apart from a number of utility functions that the C runtime needs, libsoc provides the following: \begin{itemize} \item Floating point support (SW, float and double). \item \texttt{putchar} and \texttt{getchar} using the SoC UART. \item Replacement for the built-in \texttt{printf} provided by gcc. \end{itemize} That's it. Yet, even this little is enough to run the Adventure demo... All the source code has been lifted from the original Plasma supporting code or has been scavenged from the net -- see credits in the file headers.
Go to most recent revision | Compare with Previous | Blame | View Log