OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /w11
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/trunk/doc/w11a_os_guide.txt
0,0 → 1,158
# $ $Id: w11a_os_guide.txt 316 2010-07-16 19:07:47Z mueller $
 
1. I/O emulation setup ----------------------------------------------------
 
All UNIBUS peripherals which exchange data (currently DL11, LP11, PC11, RK11)
are currently emulated via a backend process. In the current version the
communication between FPGA board and backend is via the serial port, either
directly or via a USB-RS232 adapter. A direct connection is limited to 115k
Baud on most PCs, while a connection via a USB-RS232 adapter was tested up
to 460k Baud.
 
Notes: - A USB-RS232 cable with a Prolific Technology PL2303 chip simply
never gave reliable connections for higher Baud rates.
- A USB-RS232 cable with a FTDI FT232R chip, like the cable offered
by FTDI as US232R-100 worked fine.
- For FTDI USB-RS232 cables it is essential to set the latency
timer to 1 ms (from the power in default of 16 ms), e.g. with
sudo $RETROBASE/tools/bin/set_ftdi_lat USB0 1
- the following assumes that a USB-RS232 cable with FTDI chip is used
 
A 460k Baud connection gives in practice a disk throughput of about 20 kB/s.
This allows to test the system but is a bit slow to real usage. In an OS
with good disk caching like 2.11BSD the impact of such a 'slow disk' is
actually smaller than the bare numbers suggest.
 
2. FPGA Board setup -------------------------------------------------------
 
- connect the USB-RS232 cable to the RS232 port of the s3board or nexys2
- set the latency timer of the USB-RS232, e.g. with
sudo $RETROBASE/tools/bin/set_ftdi_lat USB0 1
- ensure that all 8 switches are in '0' position
- load the w11a design into the FPGA, e.g. via impact
 
3. Unix V5 system ---------------------------------------------------------
 
- A disk set is available from
http://www-linux.gsi.de/~mueller/retro/oc_w11/data/unix_v5_rkset.tgz
Download, unpack and copy the disk images (*.dsk) to
$RETROBASE/rtl/sys_gen/w11a/tb
 
- Setup USB-RS232 cable, start xterm in vt100 mode and the server backend
 
cd $RETROBASE/rtl/sys_gen/w11a/tb
sudo $RETROBASE/tools/bin/set_ftdi_lat USB0 1
telnet_starter -d DL0 &
dorri -u0,460 @uv5_boot.pcmd
 
- the boot dialog in the console xterm window will look like
(required input is in {..}, with {<CR>} denoting a carriage return:
 
@{unix}
login: {root}
 
Now you are at the shell prompt and can excercise the system, e.g.
 
# {ls -al}
total 62
drwxr-xr-x 9 bin 160 Jan 29 16:14 .
drwxr-xr-x 9 bin 160 Jan 29 16:14 ..
drwxr-xr-x 2 bin 944 Nov 26 18:13 bin
drwxr-xr-x 2 bin 80 Nov 26 18:13 dev
drwxr-xr-x 2 bin 240 Mar 21 12:07 etc
drwxr-xr-x 2 bin 224 Nov 26 18:13 lib
drwxr-xr-x 2 bin 32 Nov 26 18:13 mnt
drwxrwxrwx 2 bin 32 Nov 26 18:13 tmp
-rwxrwxrwx 1 bin 25802 Mar 21 12:07 unix
drwxr-xr-x 14 bin 224 Nov 26 18:13 usr
 
There is no 'halt' or 'shutdown' command, just ^D out of the server
session. The disks aren't cached, so no need to sync either.
 
4. 2.11BSD system ---------------------------------------------------------
- A disk set is available from
http://www-linux.gsi.de/~mueller/retro/oc_w11/data/211bsd_rkset.tgz
Download, unpack and copy the disk images (*.dsk) to
$RETROBASE/rtl/sys_gen/w11a/tb
 
- Setup USB-RS232 cable, start two xterm in vt100 mode and the server backend
 
cd $RETROBASE/rtl/sys_gen/w11a/tb
sudo $RETROBASE/tools/bin/set_ftdi_lat USB0 1
telnet_starter -d DL0 &
telnet_starter -d DL1 &
dorri -u0,460 @211bsd_rk_boot.pcmd
 
- the boot dialog in the console xterm window will look like
(required input is in {..}, with {<CR>} denoting a carriage return:
 
70Boot from rk(0,0,0) at 0177404
: {<CR>}
: rk(0,0,0)unix
Boot: bootdev=03000 bootcsr=0177404
2.11 BSD UNIX #26: Thu Jan 1 19:49:13 PST 2009
root@curly.2bsd.com:/usr/src/sys/RETRONFPRK
phys mem = 3932160
avail mem = 3577856
user mem = 307200
January 4 16:45:33 init: configure system
dz ? csr 160100 vector 310 skipped: No CSR.
lp 0 csr 177514 vector 200 attached
rk ? csr 177400 vector 220 didn't interrupt.
rl ? csr 174400 vector 160 skipped: No CSR.
tm ? csr 172520 vector 224 skipped: No CSR.
xp ? csr 176700 vector 254 skipped: No CSR.
cn 1 csr 176500 vector 300 attached
erase, kill ^U, intr ^C
 
In first '#' prompt the system is in single-user mode. Just enter a ^D
to continue the system startup to multi-user mode:
 
#^D
checking quotas: done.
Assuming non-networking system ...
checking for core dump...
preserving editor files
clearing /tmp
standard daemons: update cron accounting.
starting lpd
starting local daemons:Sun Jan 4 16:46:37 PST 2009
January 4 16:46:37 init: kernel security level changed from 0 to 1
January 4 16:46:40 getty: /dev/tty01: Device not configured
January 4 16:46:40 getty: /dev/tty00: Device not configured
2.11 BSD UNIX (curly.2bsd.com) (console)
login: {root}
erase, kill ^U, intr ^C
 
Now the system is in multi-user mode, daemons runnng. You can explore
the system, e.g. with a 'pstat -T' or a 'mount' command. At end is
important to shutdown properly with a 'halt':
 
# {pstat -T}
7/186 files
39/208 inodes
11/150 processes
6/ 46 texts active, 28 used
2/135 swapmap entries, 366 kB used, 2069 kB free, 2063 kB max
33/150 coremap entries, 2960 kB free, 2867 kB max
1/ 10 ub_map entries, 10 free, 10 max
# {mount}
/dev/rk0h on /
/dev/rk2h on /tmp
/dev/rk3h on /bin
/dev/rk4h on /usr
# {halt}
syncing disks... done
halting
 
Now the server process can be stopped with two ^D.
/trunk/doc/w11a_seq_flow.txt
0,0 → 1,24
$ $Id: w11a_seq_flow.txt 315 2010-07-11 22:18:39Z mueller $
 
The states are
1. grouped by 'flows', related states are in a dashed box
2. grouped in classes by color
- blue: idle/fetch/decode states
- cyan: console handling states
- light orange: source address mode flow
- dark orange: destination address mode flows
- green: states for main opcode handling
- red: states for error handling
 
The grey 'fork_...' hexagons represent three transition groups which are
common to the control flow of several states. There is no corresponding
state, these symbols just help to reduce the number of transition lines
on the flow chart.
 
The transitions are color coded too:
- green: normal 'forward' transition in a flow
- blue: i/o wait loop
- red: error/trap handling
- magenta: fatal errors to cpufail state
- thick black: link to a fork_ symbol
- black: all other transitions
/trunk/doc/w11a_tb_guide.txt
0,0 → 1,153
# $ $Id: w11a_tb_guide.txt 316 2010-07-16 19:07:47Z mueller $
 
== Guide to running w11a test benches ==
 
1. Unit tests benches -----------------------------------------------------
 
All unit test benches have the same simple structure:
 
- a stimulus process reads test patterns as well as the expected
responses from a stimulus file
 
- the responses are checked in very simple cases by the stimulus process,
in general by a monitoring process
 
- the test bench produces a comprehensive log file. For each checked
response the line contains the word "CHECK" and either an "OK" or a
"FAIL", in the later case in general with an indication of whats wrong.
Other unexpected behaviour, like timeouts, will also result in a line
containing the word "FAIL".
 
- at the end a line with the word "DONE" is printed.
 
- the test bench is run like
 
tbw <testbenchname> [stimfile] | tee <logfile> | egrep "(FAIL|DONE)"
 
where
- 'tbw' is a small perl script setting up a symbolic link to the
stimulus file, the default extracted from the file tbw.dat, if
an optional file name is give this one will be used instead.
- 'tee' ensured that the full log is saved
- 'egrep' filters FAIL and DONE lines, a successful run will
produce a single DONE line
 
- Most tests can be run against
- the functional model
- gate level models at three stages
- the post-xst model (produced by netgen from ngc xst output)
- the post-map model (produced by netgen from ncd ngdbuild output)
- the post-par model (produced by netgen from ncd par output)
This is simply done using
make <testbench>_ssim for post-xst
make <testbench>_fsim for post-map
make <testbench>_tsim for post-par
all the rest is handled by the build environment.
An example of a post-synthesis model is given for the w11a core test.
 
2. Available unit tests benches -------------------------------------------
 
In the following the available tests are listed with
- the 'make' command to build them
- the pipe setup to run them
- the expected output (the run time measured on a 3 GHz system)
 
- serport receiver test
cd $RETROBASE/rtl/vlib/serport/tb
make tb_serport_uart_rx
time tbw tb_serport_uart_rx |\
tee tb_serport_uart_rx_dsim.log | egrep "(FAIL|DONE)"
-> 1269955 ns 63488: DONE
 
- serport receiver/transmitter test
make tb_serport_uart_rxtx
time tbw tb_serport_uart_rxtx |\
tee tb_serport_uart_rxtx_dsim.log | egrep "(FAIL|DONE)"
-> 52335 ns 2607: DONE
 
- serport autobauder test
make tb_serport_autobaud
time tbw tb_serport_autobaud |\
tee tb_serport_autobaud_dsim.log | egrep "(FAIL|DONE)"
-> 367475 ns 18364: DONE
 
- rri core test
 
cd $RETROBASE/rtl/vlib/rri/tb
make tb_rri_core
time tbw tb_rri_core |\
tee tb_rri_core_dsim.log | egrep "(FAIL|DONE)"
-> 61855 ns 3083: DONE
-> real 0m0.163s user 0m0.128s sys 0m0.020s
 
- rri core test via serial port interface
 
make tb_rri_serport
time tbw tb_rri_serport |\
tee tb_rri_serport_dsim.log | egrep "(FAIL|DONE)"
-> 273355 ns 13658: DONE
-> real 0m0.939s user 0m0.924s sys 0m0.008s
 
- w11a core test (using behavioural model)
 
cd $RETROBASE/rtl/w11a/tb
make tb_pdp11_core
time tbw tb_pdp11_core |\
tee tb_pdp11_core_dsim.log | egrep "(FAIL|DONE)"
-> 1220255 ns 61003: DONE
-> real 0m14.964s user 0m14.977s sys 0m0.108s
 
- w11a core test (using post-synthesis model)
 
make ghdl_tmp_clean tb_pdp11_core_ssim
time tbw tb_pdp11_core_ssim |\
tee tb_pdp11_core_ssim.log | egrep "(FAIL|DONE)"
-> 1220255 ns 61003: DONE
-> real 1m8.230s user 1m8.144s sys 0m0.124s
 
3. System tests benches ---------------------------------------------------
 
The system tests allow to verify to verify the full 11/70 SoC design.
In this case vhdl test bench code contains
- (simple) models of the memories used on the FPGA boards
- drivers for the rri connection (currently just serialport)
- code to interface the rri data stream to a UNIX 'named pipe',
implemented with a C routine which is called via VHPI from VHDL.
This way the whole ghdl simulation can be controlled via a di-directional
byte stream.
 
The rri backend process, currently a perl script named pi_rri, can connect
either via a named pipe to a ghdl simulation, or via a serial port to a
FPGA board. This way the same tests can be executed in simulation and
on real hardware.
 
4. Available system tests benches -----------------------------------------
 
The stimulus file used in the w11a core test can be executed in the
full system context (both s3board and nexys2 versions) with the
following commands. Note that the cycle number printed in the DONE
line can now vary slightly because the response time of the rri
backend process and thus scheduling of backend vs. ghdl process
can affect the result.
 
- sys_w11a_s3 system test
 
cd $RETROBASE/rtl/sys_gen/w11a/s3board/tb
make tb_w11a_s3
time pi_rri --fifo --timeout=40. --cmax=3 \
--run="tbw tb_w11a_s3" -- \
@../../../../w11a/tb/tb_pdp11_core_stim.dat |\
tee tb_w11a_s3_stim2_dsim.log | egrep "(-[EW]:|FAIL|PEND|DONE)"
-> 7766215 ns 388301: DONE
-> real 0m51.300s user 0m51.711s sys 0m0.772s
 
- sys_w11a_n2 system test
 
cd $RETROBASE/rtl/sys_gen/w11a/nexys2/tb
make tb_w11a_n2
time pi_rri --fifo --timeout=40. --cmax=3 \
--run="tbw tb_w11a_n2" -- \
@../../../../w11a/tb/tb_pdp11_core_stim.dat |\
tee tb_w11a_n2_stim2_dsim.log | egrep "(-[EW]:|FAIL|PEND|DONE)"
-> 7766855 ns 388333: DONE
-> real 0m51.243s user 0m51.647s sys 0m0.776s
/trunk/doc/w11a_seq_flow.DOT
0,0 → 1,939
// $Id: w11a_seq_flow.DOT 315 2010-07-11 22:18:39Z mueller $
//
// The create pdf use
//
// cpp w11a_seq_flow.DOT w11a_seq_flow.dot
// dot -Tps2 w11a_seq_flow.dot > w11a_seq_flow.ps
// ps2pdf w11a_seq_flow.ps
//
 
#define FORKSTATE
#define CLUSTER
 
#define COLssys cyan
#define COLscons cyan4
#define COLssrc gold
#define COLsdst goldenrod
#define COLsoper greenyellow
#define COLsint limegreen
#define COLserr tomato
 
#define COLtflow forestgreen
 
#define COLterr red
#define COLtfat deeppink4
#define COLtwait blue
 
#define FSZnode 12
#define FSZbnode 24
#define FSZgraph 18
#define FSZlabel 64
 
digraph G {
 
node [fontname="helvetica"];
 
fontsize=FSZlabel;
fontcolor=blue;
labelloc="t";
label="W11A Sequencer (Rev 230)";
 
// aspect="0.7,500";
// ratio="0.7";
 
// pad="10,10";
aspect="1.4,500";
ratio="1.4";
rankdir="LR";
 
 
// for ps flow
// size="8,12";
// pad="3,3"; // needed, otherwise some stuff cut off
 
 
#ifdef CLUSTER
ranksep=0.2; // default is 0.5 in
nodesep=0.1; // default is 0.25 in
#else
ranksep=0.2; // default is 0.5 in
nodesep=0.1; // default is 0.25 in
#endif
 
// to use when CLUSTER on
 
node [fontsize=FSZnode];
node [style=filled];
 
#define do_memread_i(s,w) s -> w [color=COLtflow];
#define do_memread_d(s,w) s -> w [color=COLtflow];
#define do_memread_srcinc(s,w) s -> w [color=COLtflow];
#define do_memwrite(s,w) s -> w [color=COLtflow];
#define do_memcheck(s) s -> s [color=COLtwait, penwidth=2]; \
s -> vmerr [color=COLterr];\
s[color=blue];
 
#ifdef FORKSTATE
#define do_fork_dstr(s) s -> fork_dstr [fillcolor=gray20, penwidth=3];
fork_dstr [fontsize=FSZbnode, style=filled,
color=lightgrey, shape=doubleoctagon];
fork_dstr -> dstr_def;
fork_dstr -> dstr_inc;
fork_dstr -> dstr_dec;
fork_dstr -> dstr_ind;
 
#define do_fork_opg(s) s -> fork_opg [fillcolor=gray20, penwidth=3];
fork_opg [fontsize=FSZbnode, style=filled,
color=lightgrey, shape=doubleoctagon];
fork_opg -> opg_gen;
fork_opg -> dstw_def;
fork_opg -> dstw_inc;
fork_opg -> dstw_dec;
fork_opg -> dstw_ind;
fork_opg -> opg_mul;
fork_opg -> opg_div;
fork_opg -> opg_ash;
fork_opg -> opg_ashc;
fork_opg -> cpufail [color=COLtfat];
 
#define do_fork_opa(s) s -> fork_opa [fillcolor=gray20, penwidth=3];
fork_opa [fontsize=FSZbnode, style=filled,
color=lightgrey, shape=doubleoctagon];
fork_opa -> opa_jmp;
fork_opa -> opa_jsr;
fork_opa -> opa_mtp_mem;
fork_opa -> opa_mfp_reg;
fork_opa -> opa_mfp_mem;
fork_opa -> cpufail [color=COLtfat];
 
#else
 
#define do_fork_dstr(s) \
s -> dstr_def;\
s -> dstr_inc;\
s -> dstr_dec;\
s -> dstr_ind;
 
#define do_fork_opg(s) \
s -> opg_gen;\
s -> dstw_def;\
s -> dstw_inc;\
s -> dstw_dec;\
s -> dstw_ind;\
s -> opg_mul;\
s -> opg_div;\
s -> opg_ash;\
s -> opg_ashc;\
s -> cpufail [color=COLtfat];
 
#define do_fork_opa(s) \
s -> opa_jmp;\
s -> opa_jsr;\
s -> opa_mtp_mem;\
s -> opa_mfp_reg;\
s -> opa_mfp_mem;\
s -> cpufail [color=COLtfat];
 
#endif
 
#define do_fork_next(s) \
s -> idle;\
s -> trap_disp;\
s -> ifetch [color=COLtflow];
 
#define do_fork_next_pref(s) \
s -> idle;\
s -> trap_disp;\
s -> ifetch_w [color=COLtflow];
 
#define do_start_int(s) s-> int_getpc [color=COLtflow];
 
// state list --------------------------
 
idle [fillcolor=COLssys, fontsize=FSZbnode];
cp_regread [fillcolor=COLscons];
cp_rps [fillcolor=COLscons];
cp_memr_w [fillcolor=COLscons];
cp_memw_w [fillcolor=COLscons];
ifetch [fillcolor=COLssys, fontsize=FSZbnode];
ifetch_w [fillcolor=COLssys, fontsize=FSZbnode];
idecode [fillcolor=COLssys, fontsize=FSZbnode];
 
srcr_def [fillcolor=COLssrc];
srcr_def_w [fillcolor=COLssrc];
srcr_inc [fillcolor=COLssrc];
srcr_inc_w [fillcolor=COLssrc];
srcr_dec [fillcolor=COLssrc];
srcr_dec1 [fillcolor=COLssrc];
srcr_ind [fillcolor=COLssrc];
srcr_ind1_w [fillcolor=COLssrc];
srcr_ind2 [fillcolor=COLssrc];
srcr_ind2_w [fillcolor=COLssrc];
 
dstr_def [fillcolor=COLsdst];
dstr_def_w [fillcolor=COLsdst];
dstr_inc [fillcolor=COLsdst];
dstr_inc_w [fillcolor=COLsdst];
dstr_dec [fillcolor=COLsdst];
dstr_dec1 [fillcolor=COLsdst];
dstr_ind [fillcolor=COLsdst];
dstr_ind1_w [fillcolor=COLsdst];
dstr_ind2 [fillcolor=COLsdst];
dstr_ind2_w [fillcolor=COLsdst];
 
dstw_def [fillcolor=COLsdst];
dstw_def_w [fillcolor=COLsdst];
dstw_inc [fillcolor=COLsdst];
dstw_inc_w [fillcolor=COLsdst];
dstw_incdef_w [fillcolor=COLsdst];
dstw_dec [fillcolor=COLsdst];
dstw_dec1 [fillcolor=COLsdst];
dstw_ind [fillcolor=COLsdst];
dstw_ind_w [fillcolor=COLsdst];
dstw_def246 [fillcolor=COLsdst];
 
dsta_inc [fillcolor=COLsdst];
dsta_incdef_w [fillcolor=COLsdst];
dsta_dec [fillcolor=COLsdst];
dsta_dec1 [fillcolor=COLsdst];
dsta_ind [fillcolor=COLsdst];
dsta_ind_w [fillcolor=COLsdst];
 
op_halt [fillcolor=COLsoper];
op_wait [fillcolor=COLsoper];
op_trap [fillcolor=COLsoper];
op_reset [fillcolor=COLsoper];
op_rts [fillcolor=COLsoper];
op_rtpop [fillcolor=COLsoper];
op_rtpop_w [fillcolor=COLsoper];
op_spl [fillcolor=COLsoper];
op_mcc [fillcolor=COLsoper];
op_br [fillcolor=COLsoper];
op_mark [fillcolor=COLsoper];
op_mark1 [fillcolor=COLsoper];
op_mark_pop [fillcolor=COLsoper];
op_mark_pop_w [fillcolor=COLsoper];
op_sob [fillcolor=COLsoper];
op_sob1 [fillcolor=COLsoper];
 
opg_gen [fillcolor=COLsoper, fontsize=FSZbnode];
opg_gen_rmw_w [fillcolor=COLsoper];
opg_mul [fillcolor=COLsoper];
opg_mul1 [fillcolor=COLsoper];
opg_div [fillcolor=COLsoper];
opg_div_cn [fillcolor=COLsoper];
opg_div_cr [fillcolor=COLsoper];
opg_div_sq [fillcolor=COLsoper];
opg_div_sr [fillcolor=COLsoper];
opg_div_zero [fillcolor=COLsoper];
opg_ash [fillcolor=COLsoper];
opg_ash_cn [fillcolor=COLsoper];
opg_ashc [fillcolor=COLsoper];
opg_ashc_cn [fillcolor=COLsoper];
opg_ashc_wl [fillcolor=COLsoper];
 
opa_jsr [fillcolor=COLsoper];
opa_jsr1 [fillcolor=COLsoper];
opa_jsr_push [fillcolor=COLsoper];
opa_jsr_push_w [fillcolor=COLsoper];
opa_jsr2 [fillcolor=COLsoper];
opa_jmp [fillcolor=COLsoper];
opa_mtp [fillcolor=COLsoper];
opa_mtp_pop_w [fillcolor=COLsoper];
opa_mtp_reg [fillcolor=COLsoper];
opa_mtp_mem [fillcolor=COLsoper];
opa_mtp_mem_w [fillcolor=COLsoper];
opa_mfp_reg [fillcolor=COLsoper];
opa_mfp_mem [fillcolor=COLsoper];
opa_mfp_mem_w [fillcolor=COLsoper];
opa_mfp_dec [fillcolor=COLsoper];
opa_mfp_push [fillcolor=COLsoper];
opa_mfp_push_w [fillcolor=COLsoper];
trap_4 [fillcolor=COLserr];
trap_10 [fillcolor=COLserr];
trap_disp [fillcolor=COLsint];
 
int_ext [fillcolor=COLsint];
int_getpc [fillcolor=COLsint];
int_getpc_w [fillcolor=COLsint];
int_getps [fillcolor=COLsint];
int_getps_w [fillcolor=COLsint];
int_getsp [fillcolor=COLsint];
int_decsp [fillcolor=COLsint];
int_pushps [fillcolor=COLsint];
int_pushps_w [fillcolor=COLsint];
int_pushpc [fillcolor=COLsint];
int_pushpc_w [fillcolor=COLsint];
 
rti_getpc [fillcolor=COLsoper];
rti_getpc_w [fillcolor=COLsoper];
rti_getps [fillcolor=COLsoper];
rti_getps_w [fillcolor=COLsoper];
rti_newpc [fillcolor=COLsoper];
vmerr [fillcolor=COLserr];
cpufail [fillcolor=COLserr];
 
// transition list ---------------------
// idle
idle -> idle;
idle -> cp_regread;
idle -> cp_memr_w;
idle -> cp_memw_w;
idle -> cp_rps;
idle -> int_ext;
idle -> ifetch;
idle -> op_wait;
 
// cp_regread
cp_regread -> idle;
 
// cp_rps
cp_rps -> idle;
 
// cp_memr_w
cp_memr_w -> cp_memr_w[color=COLtwait, penwidth=2];
cp_memr_w -> idle;
 
// cp_memw_w
cp_memw_w -> cp_memw_w[color=COLtwait, penwidth=2];
cp_memw_w -> idle;
 
// ifetch
do_memread_i(ifetch, ifetch_w)
 
// ifetch_w
do_memcheck(ifetch_w)
ifetch_w -> idecode;
 
// idecode
idecode -> op_halt;
idecode -> op_wait;
idecode -> rti_getpc;
idecode -> op_trap;
idecode -> op_reset;
idecode -> op_rts;
idecode -> op_spl;
idecode -> op_mcc;
idecode -> op_br;
idecode -> op_mark;
idecode -> op_sob;
idecode -> opa_mtp;
idecode -> cpufail [color=COLtfat];
idecode -> srcr_def;
idecode -> srcr_inc;
idecode -> srcr_dec;
idecode -> srcr_ind;
do_fork_dstr(idecode)
do_fork_opa(idecode)
idecode -> dsta_inc;
idecode -> dsta_dec;
idecode -> dsta_ind;
do_fork_opg(idecode)
idecode -> trap_10 [color=COLterr];
 
// srcr_def
do_memread_d(srcr_def, srcr_def_w)
 
// srcr_def_w
do_memcheck(srcr_def_w)
do_fork_dstr(srcr_def_w)
do_fork_opg(srcr_def_w)
 
// srcr_inc
do_memread_d(srcr_inc, srcr_inc_w)
 
// srcr_inc_w
do_memcheck(srcr_inc_w)
do_fork_dstr(srcr_inc_w)
do_fork_opg(srcr_inc_w)
 
// srcr_dec
srcr_dec -> srcr_dec1 [color=COLtflow];
 
// srcr_dec1
do_memread_d(srcr_dec1, srcr_ind1_w)
 
// srcr_ind
do_memread_i(srcr_ind, srcr_ind1_w)
 
// srcr_ind1_w
do_memcheck(srcr_ind1_w)
srcr_ind1_w -> srcr_ind2 [color=COLtflow];
 
// srcr_ind2
do_memread_d(srcr_ind2, srcr_ind2_w)
 
// srcr_ind2_w
do_memcheck(srcr_ind2_w)
do_fork_dstr(srcr_ind2_w)
do_fork_opg(srcr_ind2_w)
 
// dstr_def
do_memread_d(dstr_def, dstr_def_w)
 
// dstr_def_w
do_memcheck(dstr_def_w)
do_fork_opg(dstr_def_w)
 
// dstr_inc
do_memread_d(dstr_inc, dstr_inc_w)
 
// dstr_inc_w
do_memcheck(dstr_inc_w)
dstr_inc_w -> dstr_def [color=COLtflow];
do_fork_opg(dstr_inc_w)
 
// dstr_dec
dstr_dec -> dstr_dec1 [color=COLtflow];
 
// dstr_dec1
do_memread_d(dstr_dec1,dstr_inc_w)
 
// dstr_ind
do_memread_i(dstr_ind, dstr_ind1_w)
 
// dstr_ind1_w
do_memcheck(dstr_ind1_w)
dstr_ind1_w -> dstr_ind2 [color=COLtflow];
 
// dstr_ind2
do_memread_d(dstr_ind2, dstr_ind2_w)
 
// dstr_ind2_w
do_memcheck(dstr_ind2_w)
dstr_ind2_w -> dstr_def [color=COLtflow];
do_fork_opg(dstr_ind2_w)
 
// dstw_def
do_memwrite(dstw_def, dstw_def_w)
 
// dstw_def_w
do_memcheck(dstw_def_w)
do_fork_next(dstw_def_w)
 
// dstw_inc
do_memwrite(dstw_inc, dstw_inc_w)
do_memread_d(dstw_inc, dstw_incdef_w)
 
// dstw_inc_w
do_memcheck(dstw_inc_w)
do_fork_next(dstw_inc_w)
 
// dstw_incdef_w
do_memcheck(dstw_incdef_w)
dstw_incdef_w -> dstw_def246 [color=COLtflow];
 
// dstw_dec
dstw_dec -> dstw_dec1 [color=COLtflow];
 
// dstw_dec1
do_memwrite(dstw_dec1, dstw_def_w)
do_memread_d(dstw_dec1, dstw_incdef_w)
 
// dstw_ind
do_memread_i(dstw_ind, dstw_ind_w)
 
// dstw_ind_w
do_memcheck(dstw_ind_w)
dstw_ind_w -> dstw_dec1 [color=COLtflow];
 
// dstw_def246
do_memwrite(dstw_def246, dstw_def_w)
 
// dsta_inc
do_fork_opa(dsta_inc)
do_memread_d(dsta_inc, dsta_incdef_w)
 
// dsta_incdef_w
do_memcheck(dsta_incdef_w)
do_fork_opa(dsta_incdef_w)
 
// dsta_dec
dsta_dec -> dsta_dec1 [color=COLtflow];
 
// dsta_dec1
do_fork_opa(dsta_dec1)
do_memread_d(dsta_dec1, dsta_incdef_w)
 
// dsta_ind
do_memread_i(dsta_ind, dsta_ind_w)
 
// dsta_ind_w
do_memcheck(dsta_ind_w)
dsta_ind_w -> dsta_dec1 [color=COLtflow];
 
// op_halt
op_halt -> idle [color=COLtflow];
op_halt -> trap_4 [color=COLterr];
 
// op_wait
op_wait -> idle;
op_wait -> op_wait [color=COLtflow];
 
// op_trap
do_start_int(op_trap)
 
// op_reset
op_reset -> idle [color=COLtflow];
 
// op_rts
op_rts -> op_rtpop [color=COLtflow];
 
// op_rtpop
do_memread_srcinc(op_rtpop, op_rtpop_w)
 
// op_rtpop_w
do_memcheck(op_rtpop_w)
do_fork_next(op_rtpop_w)
 
// op_spl
op_spl -> ifetch;
do_fork_next(op_spl)
 
// op_mcc
do_fork_next(op_mcc)
 
// op_br
do_fork_next(op_br)
//do_fork_next_pref(op_br)
op_br -> ifetch_w; // explicit to avoid doubling...
 
// op_mark
op_mark -> op_mark1 [color=COLtflow];
 
// op_mark1
op_mark1 -> op_mark_pop [color=COLtflow];
 
// op_mark_pop
do_memread_srcinc(op_mark_pop, op_mark_pop_w)
 
// op_mark_pop_w
do_memcheck(op_mark_pop_w)
do_fork_next(op_mark_pop_w)
 
// op_sob
op_sob -> op_sob1 [color=COLtflow];
do_fork_next(op_sob)
 
// op_sob1
do_fork_next(op_sob1)
 
// opg_gen
do_memwrite(opg_gen, opg_gen_rmw_w)
do_memcheck(opg_gen)
opg_gen -> idecode;
// opg_gen -> idle; (already in do_fork!!)
do_fork_next_pref(opg_gen)
 
// opg_gen_rmw_w
do_memcheck(opg_gen_rmw_w)
do_fork_next(opg_gen_rmw_w)
 
// opg_mul
opg_mul -> opg_mul1 [color=COLtflow];
 
// opg_mul1
do_fork_next(opg_mul1)
 
// opg_div
opg_div -> opg_div_cn;
 
// opg_div_cn
opg_div_cn -> opg_div_zero;
opg_div_cn -> opg_div_cr [color=COLtflow];
opg_div_cn -> opg_div_cn;
 
// opg_div_cr
opg_div_cr -> opg_div_sq [color=COLtflow];
 
// opg_div_sq
opg_div_sq -> opg_div_sr [color=COLtflow];
 
// opg_div_sr
do_fork_next(opg_div_sr)
 
// opg_div_zero
do_fork_next(opg_div_zero)
 
// opg_ash
opg_ash -> opg_ash_cn [color=COLtflow];
 
// opg_ash_cn
opg_ash_cn -> opg_ash_cn;
do_fork_next_pref(opg_ash_cn)
 
// opg_ashc
opg_ashc -> opg_ashc_cn [color=COLtflow];
 
// opg_ashc_cn
opg_ashc_cn -> opg_ashc_cn;
opg_ashc_cn -> opg_ashc_wl [color=COLtflow];
 
// opg_ashc_wl
do_fork_next(opg_ashc_wl)
 
// opa_jsr
opa_jsr -> trap_10 [color=COLterr];
opa_jsr -> opa_jsr1 [color=COLtflow];
 
// opa_jsr1
opa_jsr1 -> opa_jsr_push [color=COLtflow];
 
// opa_jsr_push
opa_jsr_push -> opa_jsr_push_w [color=COLtflow];
 
// opa_jsr_push_w
do_memcheck(opa_jsr_push_w)
opa_jsr_push_w -> opa_jsr2 [color=COLtflow];
 
// opa_jsr2
do_fork_next(opa_jsr2)
 
// opa_jmp
opa_jmp -> trap_10 [color=COLterr];
do_fork_next(opa_jmp)
 
// opa_mtp
do_memread_srcinc(opa_mtp, opa_mtp_pop_w)
 
// opa_mtp_pop_w
do_memcheck(opa_mtp_pop_w)
opa_mtp_pop_w -> opa_mtp_reg;
opa_mtp_pop_w -> opa_mtp_mem;
opa_mtp_pop_w -> dsta_inc;
opa_mtp_pop_w -> dsta_dec;
opa_mtp_pop_w -> dsta_ind;
opa_mtp_pop_w -> cpufail [color=COLtfat];
 
// opa_mtp_reg
do_fork_next(opa_mtp_reg)
 
// opa_mtp_mem
opa_mtp_mem -> opa_mtp_mem_w [color=COLtflow];
 
// opa_mtp_mem_w
do_memcheck(opa_mtp_mem_w)
do_fork_next(opa_mtp_mem_w)
 
// opa_mfp_reg
opa_mfp_reg -> opa_mfp_dec [color=COLtflow];
 
// opa_mfp_mem
opa_mfp_mem -> opa_mfp_mem_w [color=COLtflow];
 
// opa_mfp_mem_w
do_memcheck(opa_mfp_mem_w)
opa_mfp_mem_w -> opa_mfp_dec [color=COLtflow];
 
// opa_mfp_dec
opa_mfp_dec -> opa_mfp_push [color=COLtflow];
 
// opa_mfp_push
opa_mfp_push -> opa_mfp_push_w [color=COLtflow];
 
// opa_mfp_push_w
do_memcheck(opa_mfp_push_w)
do_fork_next(opa_mfp_push_w)
// trap_4
do_start_int(trap_4)
 
// trap_10
do_start_int(trap_10)
 
// trap_disp
do_start_int(trap_disp)
 
// int_ext
do_start_int(int_ext)
 
// int_getpc
do_memread_srcinc(int_getpc, int_getpc_w)
 
// int_getpc_w
do_memcheck(int_getpc_w)
int_getpc_w -> idle;
int_getpc_w -> int_getps [color=COLtflow];
 
// int_getps
do_memread_srcinc(int_getps, int_getps_w)
 
// int_getps_w
do_memcheck(int_getps_w)
int_getps_w -> idle;
int_getps_w -> int_getsp [color=COLtflow];
 
// int_getsp
int_getsp -> int_decsp [color=COLtflow];
 
// int_decsp
int_decsp -> int_pushps [color=COLtflow];
 
// int_pushps
int_pushps -> int_pushps_w [color=COLtflow];
 
// int_pushps_w
do_memcheck(int_pushps_w)
int_pushps_w -> int_pushpc [color=COLtflow];
 
// int_pushpc
int_pushpc -> int_pushpc_w [color=COLtflow];
 
// int_pushpc_w
do_memcheck(int_pushpc_w)
do_fork_next(int_pushpc_w)
 
// rti_getpc
do_memread_srcinc(rti_getpc, rti_getpc_w)
 
// rti_getpc_w
do_memcheck(rti_getpc_w)
rti_getpc_w -> rti_getps [color=COLtflow];
 
// rti_getps
do_memread_srcinc(rti_getps, rti_getps_w)
 
// rti_getps_w
do_memcheck(rti_getps_w)
rti_getps_w -> rti_newpc [color=COLtflow];
 
// rti_newpc
rti_newpc -> ifetch;
do_fork_next(rti_newpc)
// vmerr
vmerr -> cpufail [color=COLtfat];
vmerr -> trap_4 [color=COLtflow];
do_start_int(vmerr)
 
// cpufail
cpufail -> idle [color=COLtflow];
 
// subgraph definitions ----------------
#ifdef CLUSTER
 
subgraph cluster_srcr {
srcr_def;
srcr_def_w;
srcr_inc;
srcr_inc_w;
srcr_dec;
srcr_dec1;
srcr_ind;
srcr_ind1_w;
srcr_ind2;
srcr_ind2_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "SRCR flow";
style=dashed;
color=blue;
}
 
subgraph cluster_dstr {
dstr_def;
dstr_def_w;
dstr_inc;
dstr_inc_w;
dstr_dec;
dstr_dec1;
dstr_ind;
dstr_ind1_w;
dstr_ind2;
dstr_ind2_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "DSTR flow";
style=dashed;
color=blue;
}
 
subgraph cluster_dstw {
dstw_def;
dstw_def_w;
dstw_inc;
dstw_inc_w;
dstw_incdef_w;
dstw_dec;
dstw_dec1;
dstw_ind;
dstw_ind_w;
dstw_def246;
fontsize=FSZgraph;
fontcolor=blue;
label = "DSTW flow";
style=dashed;
color=blue;
}
 
subgraph cluster_dsta {
dsta_inc;
dsta_incdef_w;
dsta_dec;
dsta_dec1;
dsta_ind;
dsta_ind_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "DSTA flow";
style=dashed;
color=blue;
}
 
subgraph cluster_rts {
op_rts;
op_rtpop;
op_rtpop_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "RTS flow";
style=dashed;
color=blue;
}
 
subgraph cluster_mark {
op_mark;
op_mark1;
op_mark_pop;
op_mark_pop_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "MARK flow";
style=dashed;
color=blue;
}
 
//#ifdef never
subgraph cluster_sob {
op_sob;
op_sob1;
fontsize=FSZgraph;
fontcolor=blue;
label = "SOB flow";
style=dashed;
color=blue;
}
 
subgraph cluster_mul {
opg_mul;
opg_mul1;
fontsize=FSZgraph;
fontcolor=blue;
label = "MUL flow";
style=dashed;
color=blue;
}
//#endif
 
subgraph cluster_div {
opg_div;
opg_div_cn;
opg_div_cr;
opg_div_sq;
opg_div_sr;
opg_div_zero;
fontsize=FSZgraph;
fontcolor=blue;
label = "DIV flow";
style=dashed;
color=blue;
}
 
//#ifdef never
subgraph cluster_ash {
opg_ash;
opg_ash_cn;
fontsize=FSZgraph;
fontcolor=blue;
label = "ASH flow";
style=dashed;
color=blue;
}
//#endif
 
subgraph cluster_ashc{
opg_ashc;
opg_ashc_cn;
opg_ashc_wl;
fontsize=FSZgraph;
fontcolor=blue;
label = "ASHC flow";
style=dashed;
color=blue;
}
 
subgraph cluster_jsr {
opa_jsr;
opa_jsr1;
opa_jsr_push;
opa_jsr_push_w;
opa_jsr2;
fontsize=FSZgraph;
fontcolor=blue;
label = "JSR flow";
style=dashed;
color=blue;
}
 
subgraph cluster_mtp {
opa_mtp;
opa_mtp_pop_w;
opa_mtp_reg;
opa_mtp_mem;
opa_mtp_mem_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "MTP flow";
style=dashed;
color=blue;
}
 
subgraph cluster_mfp {
opa_mfp_reg;
opa_mfp_mem;
opa_mfp_mem_w;
opa_mfp_dec;
opa_mfp_push;
opa_mfp_push_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "MFP flow";
style=dashed;
color=blue;
}
 
subgraph cluster_int {
int_ext;
int_getpc;
int_getpc_w;
int_getps;
int_getps_w;
int_getsp;
int_decsp;
int_pushps;
int_pushps_w;
int_pushpc;
int_pushpc_w;
fontsize=FSZgraph;
fontcolor=blue;
label = "INT flow";
style=dashed;
color=blue;
}
 
subgraph cluster_rti {
rti_getpc;
rti_getpc_w;
rti_getps;
rti_getps_w;
rti_newpc;
fontsize=FSZgraph;
fontcolor=blue;
label = "RTI flow";
style=dashed;
color=blue;
}
#endif
}
/trunk/doc/w11a_known_issues.txt
0,0 → 1,92
# $ $Id: w11a_known_issues.txt 316 2010-07-16 19:07:47Z mueller $
 
1. Known differences between w11a and KB-11C (11/70)
 
- the SPL instruction in the 11/70 always fetched the next instruction
regardless of pending device or even console interrupts. This is known
as the 'spl bug', see
http://minnie.tuhs.org/pipermail/pups/2006-September/001082.html
http://minnie.tuhs.org/pipermail/pups/2006-October/001083.html
In the w11a the SPL has 11/70 semantics in kernel mode, thus next no
traps or interrupts, but in supervisor and user mode SPL really acts as
nop, so traps and interrupts are taken as for all other instructions.
--> The w11a isn't bug compatible with the 11/70.
 
- A 'red stack violation' looses PSW, a 0 is pushed in stack.
 
- The 'instrution complete flag' in SSR0 is not implemented, it is
permanently '0', SSR2 will not record vector addresses in case of a
vector fetch fault. Recovery of vector fetch faults is therefore not
possible, but only 11/45 and 11/70 supported this, no OS used that, and
it's even unclear whether it can be practically used.
 
- the 11/70 maps the 18 bit UNIBUS address space into the upper part of
the 22bit extended mode address space. With UNIBUS mapping enabled, this
allowed to access via 17000000:17757777 the memory exactly as a UNIBUS
device would see it. The w11a doesn't implement this remapping, an access
in the range 17000000:17757777 causes a NXM fault.
 
All four points relate to very 11/70 specific behaviour, not operating system
depends on them, therefore they are considered acceptable implementation
differences
 
2. Known limitations
 
- some programs use timing loops based on the execution speed of the
original processors. This can lead to spurious timeouts, especially
in old test programs.
--> a 'CPU throttle mechanism' will be added in a future version to
circumvent this for some old test codes.
 
- the emulated I/O can lead to apparently slow device reaction times,
especially when the server runs as normal user process. This can lead
to timeout, again mostly in test programs.
--> a 'watch dog' mechanism will be added in a future version which
suspends the CPU when the server doesn't respond fast enough.
 
3. Known bugs
 
- TCK-036 pri=L: RK11: hardware poll not working
The RK11/RK05 hardware poll logic is probably no reflecting the
behaviour of the real drive.
 
- TCK-035 pri=L: RK11: no proper NXM check in 18bit systems
No NXM error is generated when a RK11 read or write reaches the top
of memory in 18 bit addressing. Crash dump routines use this to detect
end-of-memory.
 
- TCK-032 pri=M: RK11: polling on DRY in RKDS doesn't work
DRY in RKDS goes 1->0 immediately with RDY in RKCS when a function is
started. In a real RK05 drive DRY went to 0 after a short delay. Some
basic hardware tests are sensitive to this.
 
- TCK-030 pri=L: CPU: SSR0 trap bit set when access aborted
The 'trap bit' (bit 12: 10000) is set even when the access is aborted.
 
- TCK-029 pri=L: CPU: AIB A bit set for all accesses
The MMU trap condition isn't properly decoded
- TCK-028 pri=H: CPU: interrupt and trap precedence
In case of multiple trap, fault, or interrupt conditions the precedence
isn't implemented correctly.
 
- TCK-026 pri=L: CPU: src+dst delta added in ssr1 when same register
The ssr1 content after a fault is logically correct in w11a, but
different from 11/70.
 
- TCK-025 pri=L: CPU: no mmu trap when bit9 clearing instruction traps
In the 11/70 the instruction which affects mmu trap can cause a trap
already, in w11a only the next instruction will trap.
 
- TCK-014 pri=M: RK11: write protect action too slow
Some simple RK11 drivers, especially in tests, don't poll for completion
of a write protect command. Due to the emulated I/O this can cause errors.
 
- TCK-007 pri=H: CPU: no trap-4 after emt on odd stack
- TCK-006 pri=H: CPU: no yel-stack trap after jsr pc,nnn(pc)
- TCK-004 pri=H: CPU: yel-stack by interrupt causes loop-up
- TCK-003 pri=H: CPU: yel-stack by iot pushes two stack frames
All four issues are caused by an incorrect implementation of the trap
logic, which leads to a different precendence when multiple trap, fault,
or interrupt occur.
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.