|
|
SIS - Sparc Instruction Simulator README file (v2.0, 05-02-1996)
|
SIS - Sparc Instruction Simulator README file (v2.0, 05-02-1996)
|
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
|
|
1. Introduction
|
1. Introduction
|
|
|
The SIS is a SPARC V7 architecture simulator. It consist of two parts,
|
The SIS is a SPARC V7 architecture simulator. It consist of two parts,
|
the simulator core and a user defined memory module. The simulator
|
the simulator core and a user defined memory module. The simulator
|
core executes the instructions while the memory module emulates memory
|
core executes the instructions while the memory module emulates memory
|
and peripherals.
|
and peripherals.
|
|
|
2. Usage
|
2. Usage
|
|
|
The simulator is started as follows:
|
The simulator is started as follows:
|
|
|
sis [-uart1 uart_device1] [-uart2 uart_device2]
|
sis [-uart1 uart_device1] [-uart2 uart_device2]
|
[-nfp] [-freq frequency] [-c batch_file] [files]
|
[-nfp] [-freq frequency] [-c batch_file] [files]
|
|
|
The default uart devices for SIS are /dev/ptypc and /dev/ptypd. The
|
The default uart devices for SIS are /dev/ptypc and /dev/ptypd. The
|
-uart[1,2] switch can be used to connect the uarts to other devices.
|
-uart[1,2] switch can be used to connect the uarts to other devices.
|
Use 'tip /dev/ttypc' to connect a terminal emulator to the uarts.
|
Use 'tip /dev/ttypc' to connect a terminal emulator to the uarts.
|
The '-nfp' will disable the simulated FPU, so each FPU instruction will
|
The '-nfp' will disable the simulated FPU, so each FPU instruction will
|
generate a FPU disabled trap. The '-freq' switch can be used to define
|
generate a FPU disabled trap. The '-freq' switch can be used to define
|
which "frequency" the simulator runs at. This is used by the 'perf'
|
which "frequency" the simulator runs at. This is used by the 'perf'
|
command to calculated the MIPS figure for a particular configuration.
|
command to calculated the MIPS figure for a particular configuration.
|
The give frequency must be an integer indicating the frequency in MHz.
|
The give frequency must be an integer indicating the frequency in MHz.
|
|
|
The -c option indicates that sis commands should be read from 'batch_file'
|
The -c option indicates that sis commands should be read from 'batch_file'
|
at startup.
|
at startup.
|
|
|
Files to be loaded must be in one of the supported formats (see INSTALLATION),
|
Files to be loaded must be in one of the supported formats (see INSTALLATION),
|
and will be loaded into the simulated memory. The file formats are
|
and will be loaded into the simulated memory. The file formats are
|
automatically recognised.
|
automatically recognised.
|
|
|
The script 'startsim' will start the simulator in one xterm window and
|
The script 'startsim' will start the simulator in one xterm window and
|
open a terminal emulator (tip) connected to the UART A in a second
|
open a terminal emulator (tip) connected to the UART A in a second
|
xterm window. Below is description of commands that are recognized by
|
xterm window. Below is description of commands that are recognized by
|
the simulator. The command-line is parsed using GNU readline. A command
|
the simulator. The command-line is parsed using GNU readline. A command
|
history of 64 commands is maintained. Use the up/down arrows to recall
|
history of 64 commands is maintained. Use the up/down arrows to recall
|
previous commands. For more details, see the readline documentation.
|
previous commands. For more details, see the readline documentation.
|
|
|
batch
|
batch
|
|
|
Execute a batch file of SIS commands.
|
Execute a batch file of SIS commands.
|
|
|
+bp
|
+bp
|
|
|
Adds an breakpoint at address .
|
Adds an breakpoint at address .
|
|
|
bp
|
bp
|
|
|
Prints all breakpoints
|
Prints all breakpoints
|
|
|
-bp
|
-bp
|
|
|
Deletes breakpoint . Use 'bp' to see which number is assigned to the
|
Deletes breakpoint . Use 'bp' to see which number is assigned to the
|
breakpoints.
|
breakpoints.
|
|
|
cont [inst_count]
|
cont [inst_count]
|
|
|
Continue execution at present position, optionally for [inst_count]
|
Continue execution at present position, optionally for [inst_count]
|
instructions.
|
instructions.
|
|
|
dis [addr] [count]
|
dis [addr] [count]
|
|
|
Disassemble [count] instructions at address [addr]. Default values for
|
Disassemble [count] instructions at address [addr]. Default values for
|
count is 16 and addr is the present address.
|
count is 16 and addr is the present address.
|
|
|
echo
|
echo
|
|
|
Print to the simulator window.
|
Print to the simulator window.
|
|
|
float
|
float
|
|
|
Prints the FPU registers
|
Prints the FPU registers
|
|
|
go [inst_count]
|
go [inst_count]
|
|
|
The go command will set pc to and npc to + 4, and start
|
The go command will set pc to and npc to + 4, and start
|
execution. No other initialisation will be done. If inst_count is given,
|
execution. No other initialisation will be done. If inst_count is given,
|
execution will stop after the specified number of instructions.
|
execution will stop after the specified number of instructions.
|
|
|
help
|
help
|
|
|
Print a small help menu for the SIS commands.
|
Print a small help menu for the SIS commands.
|
|
|
hist [trace_length]
|
hist [trace_length]
|
|
|
Enable the instruction trace buffer. The 'trace_length' last executed
|
Enable the instruction trace buffer. The 'trace_length' last executed
|
instructions will be placed in the trace buffer. A 'hist' command without
|
instructions will be placed in the trace buffer. A 'hist' command without
|
a trace_length will display the trace buffer. Specifying a zero trace
|
a trace_length will display the trace buffer. Specifying a zero trace
|
length will disable the trace buffer.
|
length will disable the trace buffer.
|
|
|
load
|
load
|
|
|
Loads a file into simulator memory.
|
Loads a file into simulator memory.
|
|
|
mem [addr] [count]
|
mem [addr] [count]
|
|
|
Display memory at [addr] for [count] bytes. Same default values as above.
|
Display memory at [addr] for [count] bytes. Same default values as above.
|
|
|
quit
|
quit
|
|
|
Exits the simulator.
|
Exits the simulator.
|
|
|
perf [reset]
|
perf [reset]
|
|
|
The 'perf' command will display various execution statistics. A 'perf reset'
|
The 'perf' command will display various execution statistics. A 'perf reset'
|
command will reset the statistics. This can be used if statistics shall
|
command will reset the statistics. This can be used if statistics shall
|
be calculated only over a part of the program. The 'run' and 'reset'
|
be calculated only over a part of the program. The 'run' and 'reset'
|
command also resets the statistic information.
|
command also resets the statistic information.
|
|
|
reg [reg_name] [value]
|
reg [reg_name] [value]
|
|
|
Prints and sets the IU regiters. 'reg' without parameters prints the IU
|
Prints and sets the IU regiters. 'reg' without parameters prints the IU
|
registers. 'reg [reg_name] [value]' sets the corresponding register to
|
registers. 'reg [reg_name] [value]' sets the corresponding register to
|
[value]. Valid register names are psr, tbr, wim, y, g1-g7, o0-o7 and
|
[value]. Valid register names are psr, tbr, wim, y, g1-g7, o0-o7 and
|
l0-l7.
|
l0-l7.
|
|
|
reset
|
reset
|
|
|
Performs a power-on reset. This command is equal to 'run 0'.
|
Performs a power-on reset. This command is equal to 'run 0'.
|
|
|
run [inst_count]
|
run [inst_count]
|
|
|
Resets the simulator and starts execution from address 0. If an instruction
|
Resets the simulator and starts execution from address 0. If an instruction
|
count is given (inst_count), the simulator will stop after the specified
|
count is given (inst_count), the simulator will stop after the specified
|
number of instructions. The event queue is emptied but any set breakpoints
|
number of instructions. The event queue is emptied but any set breakpoints
|
remain.
|
remain.
|
|
|
step
|
step
|
|
|
Equal to 'trace 1'
|
Equal to 'trace 1'
|
|
|
tra [inst_count]
|
tra [inst_count]
|
|
|
Starts the simulator at the present position and prints each instruction
|
Starts the simulator at the present position and prints each instruction
|
it executes. If an instruction count is given (inst_count), the simulator
|
it executes. If an instruction count is given (inst_count), the simulator
|
will stop after the specified number of instructions.
|
will stop after the specified number of instructions.
|
|
|
Typing a 'Ctrl-C' will interrupt a running simulator.
|
Typing a 'Ctrl-C' will interrupt a running simulator.
|
|
|
Short forms of the commands are allowed, e.g 'c' 'co' or 'con' are all
|
Short forms of the commands are allowed, e.g 'c' 'co' or 'con' are all
|
interpreted as 'cont'.
|
interpreted as 'cont'.
|
|
|
|
|
3. Simulator core
|
3. Simulator core
|
|
|
The SIS emulates the behavior of the 90C601E and 90C602E sparc IU and
|
The SIS emulates the behavior of the 90C601E and 90C602E sparc IU and
|
FPU from Matra MHS. These are roughly equivalent to the Cypress C601
|
FPU from Matra MHS. These are roughly equivalent to the Cypress C601
|
and C602. The simulator is cycle true, i.e a simulator time is
|
and C602. The simulator is cycle true, i.e a simulator time is
|
maintained and inremented according the IU and FPU instruction timing.
|
maintained and inremented according the IU and FPU instruction timing.
|
The parallel execution between the IU and FPU is modelled, as well as
|
The parallel execution between the IU and FPU is modelled, as well as
|
stalls due to operand dependencies (FPU). The core interacts with the
|
stalls due to operand dependencies (FPU). The core interacts with the
|
user-defined memory modules through a number of functions. The memory
|
user-defined memory modules through a number of functions. The memory
|
module must provide the following functions:
|
module must provide the following functions:
|
|
|
int memory_read(asi,addr,data,ws)
|
int memory_read(asi,addr,data,ws)
|
int asi;
|
int asi;
|
unsigned int addr;
|
unsigned int addr;
|
unsigned int *data;
|
unsigned int *data;
|
int *ws;
|
int *ws;
|
|
|
int memory_write(asi,addr,data,sz,ws)
|
int memory_write(asi,addr,data,sz,ws)
|
int asi;
|
int asi;
|
unsigned int addr;
|
unsigned int addr;
|
unsigned int *data;
|
unsigned int *data;
|
int sz;
|
int sz;
|
int *ws;
|
int *ws;
|
|
|
int sis_memory_read(addr, data, length)
|
int sis_memory_read(addr, data, length)
|
unsigned int addr;
|
unsigned int addr;
|
char *data;
|
char *data;
|
unsigned int length;
|
unsigned int length;
|
|
|
int sis_memory_write(addr, data, length)
|
int sis_memory_write(addr, data, length)
|
unsigned int addr;
|
unsigned int addr;
|
char *data;
|
char *data;
|
unsigned int length;
|
unsigned int length;
|
|
|
int init_sim()
|
int init_sim()
|
|
|
int reset()
|
int reset()
|
|
|
int error_mode(pc)
|
int error_mode(pc)
|
unsigned int pc;
|
unsigned int pc;
|
|
|
memory_read() is used by the simulator to fetch instructions and
|
memory_read() is used by the simulator to fetch instructions and
|
operands. The address space identifier (asi) and address is passed as
|
operands. The address space identifier (asi) and address is passed as
|
parameters. The read data should be assigned to the data pointer
|
parameters. The read data should be assigned to the data pointer
|
(*data) and the number of waitstate to *ws. 'memory_read' should return
|
(*data) and the number of waitstate to *ws. 'memory_read' should return
|
0 on success and 1 on failure. A failure will cause a data or
|
0 on success and 1 on failure. A failure will cause a data or
|
instruction fetch trap. memory_read() always reads one 32-bit word.
|
instruction fetch trap. memory_read() always reads one 32-bit word.
|
|
|
sis_memory_read() is used by the simulator to display and disassemble
|
sis_memory_read() is used by the simulator to display and disassemble
|
memory contants. The function should copy 'length' bytes of the simulated
|
memory contants. The function should copy 'length' bytes of the simulated
|
memory starting at 'addr' to '*data'.
|
memory starting at 'addr' to '*data'.
|
The sis_memory_read() should return 1 on success and 0 on failure.
|
The sis_memory_read() should return 1 on success and 0 on failure.
|
Failure should only be indicated if access to unimplemented memory is attempted.
|
Failure should only be indicated if access to unimplemented memory is attempted.
|
|
|
memory_write() is used to write to memory. In addition to the asi
|
memory_write() is used to write to memory. In addition to the asi
|
and address parameters, the size of the written data is given by 'sz'.
|
and address parameters, the size of the written data is given by 'sz'.
|
The pointer *data points to the data to be written. The 'sz' is coded
|
The pointer *data points to the data to be written. The 'sz' is coded
|
as follows:
|
as follows:
|
|
|
sz access type
|
sz access type
|
0 byte
|
0 byte
|
1 halfword
|
1 halfword
|
2 word
|
2 word
|
3 double-word
|
3 double-word
|
|
|
If a double word is written, the most significant word is in data[0] and
|
If a double word is written, the most significant word is in data[0] and
|
the least significant in data[1].
|
the least significant in data[1].
|
|
|
sis_memory_write() is used by the simulator during loading of programs.
|
sis_memory_write() is used by the simulator during loading of programs.
|
The function should copy 'length' bytes from *data to the simulated
|
The function should copy 'length' bytes from *data to the simulated
|
memory starting at 'addr'. sis_memory_write() should return 1 on
|
memory starting at 'addr'. sis_memory_write() should return 1 on
|
success and 0 on failure. Failure should only be indicated if access
|
success and 0 on failure. Failure should only be indicated if access
|
to unimplemented memory is attempted. See erc32.c for more details
|
to unimplemented memory is attempted. See erc32.c for more details
|
on how to define the memory emulation functions.
|
on how to define the memory emulation functions.
|
|
|
The 'init_sim' is called once when the simulator is started. This function
|
The 'init_sim' is called once when the simulator is started. This function
|
should be used to perform initialisations of user defined memory or
|
should be used to perform initialisations of user defined memory or
|
peripherals that only have to be done once, such as opening files etc.
|
peripherals that only have to be done once, such as opening files etc.
|
|
|
The 'reset' is called every time the simulator is reset, i.e. when a
|
The 'reset' is called every time the simulator is reset, i.e. when a
|
'run' command is given. This function should be used to simulate a power
|
'run' command is given. This function should be used to simulate a power
|
on reset of memory and peripherals.
|
on reset of memory and peripherals.
|
|
|
error_mode() is called by the simulator when the IU goes into error mode,
|
error_mode() is called by the simulator when the IU goes into error mode,
|
typically if a trap is caused when traps are disabled. The memory module
|
typically if a trap is caused when traps are disabled. The memory module
|
can then take actions, such as issue a reset.
|
can then take actions, such as issue a reset.
|
|
|
sys_reset() can be called by the memory module to reset the simulator. A
|
sys_reset() can be called by the memory module to reset the simulator. A
|
reset will empty the event queue and perform a power-on reset.
|
reset will empty the event queue and perform a power-on reset.
|
|
|
4. Events and interrupts
|
4. Events and interrupts
|
|
|
The simulator supports an event queue and the generation of processor
|
The simulator supports an event queue and the generation of processor
|
interrupts. The following functions are available to the user-defined
|
interrupts. The following functions are available to the user-defined
|
memory module:
|
memory module:
|
|
|
event(cfunc,arg,delta)
|
event(cfunc,arg,delta)
|
void (*cfunc)();
|
void (*cfunc)();
|
int arg;
|
int arg;
|
unsigned int delta;
|
unsigned int delta;
|
|
|
set_int(level,callback,arg)
|
set_int(level,callback,arg)
|
int level;
|
int level;
|
void (*callback)();
|
void (*callback)();
|
int arg;
|
int arg;
|
|
|
clear_int(level)
|
clear_int(level)
|
int level;
|
int level;
|
|
|
sim_stop()
|
sim_stop()
|
|
|
The 'event' functions will schedule the execution of the function 'cfunc'
|
The 'event' functions will schedule the execution of the function 'cfunc'
|
at time 'now + delta' clock cycles. The parameter 'arg' is passed as a
|
at time 'now + delta' clock cycles. The parameter 'arg' is passed as a
|
parameter to 'cfunc'.
|
parameter to 'cfunc'.
|
|
|
The 'set_int' function set the processor interrupt 'level'. When the interrupt
|
The 'set_int' function set the processor interrupt 'level'. When the interrupt
|
is taken, the function 'callback' is called with the argument 'arg'. This
|
is taken, the function 'callback' is called with the argument 'arg'. This
|
will also clear the interrupt. An interrupt can be cleared before it is
|
will also clear the interrupt. An interrupt can be cleared before it is
|
taken by calling 'clear_int' with the appropriate interrupt level.
|
taken by calling 'clear_int' with the appropriate interrupt level.
|
|
|
The sim_stop function is called each time the simulator stops execution.
|
The sim_stop function is called each time the simulator stops execution.
|
It can be used to flush buffered devices to get a clean state during
|
It can be used to flush buffered devices to get a clean state during
|
single stepping etc.
|
single stepping etc.
|
|
|
See 'erc32.c' for examples on how to use events and interrupts.
|
See 'erc32.c' for examples on how to use events and interrupts.
|
|
|
5. Memory module
|
5. Memory module
|
|
|
The supplied memory module (erc32.c) emulates the functions of memory and
|
The supplied memory module (erc32.c) emulates the functions of memory and
|
the MEC asic developed for the 90C601/2. It includes the following functions:
|
the MEC asic developed for the 90C601/2. It includes the following functions:
|
|
|
* UART A & B
|
* UART A & B
|
* Real-time clock
|
* Real-time clock
|
* General purpose timer
|
* General purpose timer
|
* Interrupt controller
|
* Interrupt controller
|
* Breakpoint register
|
* Breakpoint register
|
* Watchpoint register
|
* Watchpoint register
|
* 512 Kbyte ROM
|
* 512 Kbyte ROM
|
* 4 Mbyte RAM
|
* 4 Mbyte RAM
|
|
|
See README.erc32 on how the MEC functions are emulated. For a detailed MEC
|
See README.erc32 on how the MEC functions are emulated. For a detailed MEC
|
specification, look at the ERC32 home page at URL:
|
specification, look at the ERC32 home page at URL:
|
|
|
http://www.estec.esa.nl/wsmwww/erc32
|
http://www.estec.esa.nl/wsmwww/erc32
|
|
|
6. Compile and linking programs
|
6. Compile and linking programs
|
|
|
The directory 'examples' contain some code fragments for SIS.
|
The directory 'examples' contain some code fragments for SIS.
|
The script gccx indicates how the native sunos gcc and linker can be used
|
The script gccx indicates how the native sunos gcc and linker can be used
|
to produce executables for the simulator. To compile and link the provided
|
to produce executables for the simulator. To compile and link the provided
|
'hello.c', type 'gccx hello.c'. This will build the executable 'hello'.
|
'hello.c', type 'gccx hello.c'. This will build the executable 'hello'.
|
Start the simulator by running 'startsim hello', and issue the command 'run.
|
Start the simulator by running 'startsim hello', and issue the command 'run.
|
After the program is terminated, the IU will be force to error mode through
|
After the program is terminated, the IU will be force to error mode through
|
a software trap and halt.
|
a software trap and halt.
|
|
|
The programs are linked with a start-up file, srt0.S. This file includes
|
The programs are linked with a start-up file, srt0.S. This file includes
|
the traptable and window underflow/overflow trap routines.
|
the traptable and window underflow/overflow trap routines.
|
|
|
7. IU and FPU instruction timing.
|
7. IU and FPU instruction timing.
|
|
|
The simulator provides cycle true simulation. The following table shows
|
The simulator provides cycle true simulation. The following table shows
|
the emulated instruction timing for 90C601E & 90C602E:
|
the emulated instruction timing for 90C601E & 90C602E:
|
|
|
Instructions Cycles
|
Instructions Cycles
|
|
|
jmpl, rett 2
|
jmpl, rett 2
|
load 2
|
load 2
|
store 3
|
store 3
|
load double 3
|
load double 3
|
store double 4
|
store double 4
|
other integer ops 1
|
other integer ops 1
|
fabs 2
|
fabs 2
|
fadds 4
|
fadds 4
|
faddd 4
|
faddd 4
|
fcmps 4
|
fcmps 4
|
fcmpd 4
|
fcmpd 4
|
fdivs 20
|
fdivs 20
|
fdivd 35
|
fdivd 35
|
fmovs 2
|
fmovs 2
|
fmuls 5
|
fmuls 5
|
fmuld 9
|
fmuld 9
|
fnegs 2
|
fnegs 2
|
fsqrts 37
|
fsqrts 37
|
fsqrtd 65
|
fsqrtd 65
|
fsubs 4
|
fsubs 4
|
fsubd 4
|
fsubd 4
|
fdtoi 7
|
fdtoi 7
|
fdots 3
|
fdots 3
|
fitos 6
|
fitos 6
|
fitod 6
|
fitod 6
|
fstoi 6
|
fstoi 6
|
fstod 2
|
fstod 2
|
|
|
The parallel operation between the IU and FPU is modelled. This means
|
The parallel operation between the IU and FPU is modelled. This means
|
that a FPU instruction will execute in parallel with other instructions as
|
that a FPU instruction will execute in parallel with other instructions as
|
long as no data or resource dependency is detected. See the 90C602E data
|
long as no data or resource dependency is detected. See the 90C602E data
|
sheet for the various types of dependencies. Tracing using the 'trace'
|
sheet for the various types of dependencies. Tracing using the 'trace'
|
command will display the current simulator time in the left column. This
|
command will display the current simulator time in the left column. This
|
time indicates when the instruction is fetched. If a dependency is detetected,
|
time indicates when the instruction is fetched. If a dependency is detetected,
|
the following fetch will be delayed until the conflict is resolved.
|
the following fetch will be delayed until the conflict is resolved.
|
|
|
The load dependency in the 90C601E is also modelled - if the destination
|
The load dependency in the 90C601E is also modelled - if the destination
|
register of a load instruction is used by the following instruction, an
|
register of a load instruction is used by the following instruction, an
|
idle cycle is inserted.
|
idle cycle is inserted.
|
|
|
8. FPU implementation
|
8. FPU implementation
|
|
|
The simulator maps floating-point operations on the hosts floating point
|
The simulator maps floating-point operations on the hosts floating point
|
capabilities. This means that accuracy and generation of IEEE exceptions is
|
capabilities. This means that accuracy and generation of IEEE exceptions is
|
host dependent.
|
host dependent.
|
|
|