mirror of
https://github.com/wfjm/w11.git
synced 2026-01-18 17:37:09 +00:00
additional documentation
This commit is contained in:
parent
25a1e39dbb
commit
ef814e2e8b
92
doc/w11a_known_issues.txt
Normal file
92
doc/w11a_known_issues.txt
Normal file
@ -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.
|
||||
|
||||
158
doc/w11a_os_guide.txt
Normal file
158
doc/w11a_os_guide.txt
Normal file
@ -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.
|
||||
939
doc/w11a_seq_flow.DOT
Normal file
939
doc/w11a_seq_flow.DOT
Normal file
@ -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
|
||||
}
|
||||
24
doc/w11a_seq_flow.txt
Normal file
24
doc/w11a_seq_flow.txt
Normal file
@ -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
|
||||
153
doc/w11a_tb_guide.txt
Normal file
153
doc/w11a_tb_guide.txt
Normal file
@ -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
|
||||
@ -1,207 +0,0 @@
|
||||
-- $Id: rritblib.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: rritblib
|
||||
-- Description: Remote Register Interface test environment components
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 11.4; ghdl 0.18-0.29
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-26 309 2.5.1 add rritb_sres_or_mon
|
||||
-- 2010-06-06 302 2.5 use sop/eop framing instead of soc+chaining
|
||||
-- 2010-06-05 301 2.1.2 renamed _rpmon -> _rbmon
|
||||
-- 2010-05-02 287 2.1.1 rename CE_XSEC->CE_INT,RP_STAT->RB_STAT
|
||||
-- drop RP_IINT signal from interfaces
|
||||
-- add sbcntl_sbf_(cp|rp)mon defs
|
||||
-- 2010-04-24 282 2.1 add rritb_core
|
||||
-- 2008-08-24 162 2.0 all with new rb_mreq/rb_sres interface
|
||||
-- 2008-03-24 129 1.1.5 CLK_CYCLE now 31 bits
|
||||
-- 2007-12-23 105 1.1.4 add AP_LAM for rritb_rpmon(_sb)
|
||||
-- 2007-11-24 98 1.1.3 add RP_IINT for rritb_rpmon(_sb)
|
||||
-- 2007-09-01 78 1.1.2 add rricp_rp
|
||||
-- 2007-08-25 75 1.1.1 add rritb_cpmon_sb, rritb_rpmon_sb
|
||||
-- 2007-08-16 74 1.1 remove rritb_tt* component; some interface changes
|
||||
-- 2007-08-03 71 1.0.2 use rrirp_acif; change generics for rritb_[cr]pmon
|
||||
-- 2007-07-22 68 1.0.1 add rritb_cpmon rritb_rpmon monitors
|
||||
-- 2007-07-15 66 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.rrilib.all;
|
||||
|
||||
package rritblib is
|
||||
|
||||
-- simbus sb_cntl field usage for rri
|
||||
constant sbcntl_sbf_cpmon : integer := 15;
|
||||
constant sbcntl_sbf_rbmon : integer := 14;
|
||||
|
||||
-- GenericSimplePreProcessor Mask w11
|
||||
type rritba_cntl_type is record -- tba control
|
||||
cmd : slv3; -- command code
|
||||
ena : slbit; -- command enable
|
||||
addr : slv8; -- address
|
||||
cnt : slv8; -- block size
|
||||
eop : slbit; -- end packet after current command
|
||||
end record rritba_cntl_type;
|
||||
|
||||
constant rritba_cntl_init : rritba_cntl_type := (
|
||||
(others=>'0'), -- cmd
|
||||
'0', -- ena
|
||||
(others=>'0'), -- addr
|
||||
(others=>'0'), -- cnt
|
||||
'0'); -- eop
|
||||
|
||||
type rritba_stat_type is record -- tba status
|
||||
busy : slbit; -- command busy
|
||||
ack : slbit; -- command acknowledge
|
||||
err : slbit; -- command error flag
|
||||
stat : slv8; -- status flags
|
||||
braddr : slv8; -- block read address (for wblk)
|
||||
bre : slbit; -- block read enable (for wblk)
|
||||
bwaddr : slv8; -- block write address (for rblk)
|
||||
bwe : slbit; -- block write enable (for rblk)
|
||||
attnpend : slbit; -- attn pending
|
||||
attnint : slbit; -- attn interrupt
|
||||
end record rritba_stat_type;
|
||||
|
||||
constant rritba_stat_init : rritba_stat_type := (
|
||||
'0','0','0', -- busy, ack, err
|
||||
(others=>'0'), -- stat
|
||||
(others=>'0'), -- braddr
|
||||
'0', -- bre
|
||||
(others=>'0'), -- bwaddr
|
||||
'0', -- bwe
|
||||
'0','0'); -- attnpend, attnint
|
||||
|
||||
component rritba is -- rritba, test bench adapter
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
CNTL : in rritba_cntl_type; -- control port
|
||||
DI : in slv16; -- input data
|
||||
STAT : out rritba_stat_type; -- status port
|
||||
DO : out slv16; -- output data
|
||||
CP_DI : out slv9; -- comm port: data in
|
||||
CP_ENA : out slbit; -- comm port: data enable
|
||||
CP_BUSY : in slbit; -- comm port: data busy
|
||||
CP_DO : in slv9; -- comm port: data out
|
||||
CP_VAL : in slbit; -- comm port: data valid
|
||||
CP_HOLD : out slbit -- comm port: data hold
|
||||
);
|
||||
end component;
|
||||
-- GenericSimplePreProcessor End w11
|
||||
|
||||
component rritb_cpmon is -- rritb, rri comm port monitor
|
||||
generic (
|
||||
DWIDTH : positive := 9); -- data port width (8 or 9)
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CLK_CYCLE : in slv31 := (others=>'0'); -- clock cycle number
|
||||
ENA : in slbit := '1'; -- enable monitor output
|
||||
CP_DI : in slv(DWIDTH-1 downto 0); -- comm port: data in
|
||||
CP_ENA : in slbit; -- comm port: data enable
|
||||
CP_BUSY : in slbit; -- comm port: data busy
|
||||
CP_DO : in slv(DWIDTH-1 downto 0); -- comm port: data out
|
||||
CP_VAL : in slbit; -- comm port: data valid
|
||||
CP_HOLD : in slbit -- comm port: data hold
|
||||
);
|
||||
end component;
|
||||
|
||||
component rritb_cpmon_sb is -- simbus wrap for rri comm port monitor
|
||||
generic (
|
||||
DWIDTH : positive := 9; -- data port width (8 or 9)
|
||||
ENAPIN : integer := sbcntl_sbf_cpmon); -- SB_CNTL signal to use for enable
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CP_DI : in slv(DWIDTH-1 downto 0); -- comm port: data in
|
||||
CP_ENA : in slbit; -- comm port: data enable
|
||||
CP_BUSY : in slbit; -- comm port: data busy
|
||||
CP_DO : in slv(DWIDTH-1 downto 0); -- comm port: data out
|
||||
CP_VAL : in slbit; -- comm port: data valid
|
||||
CP_HOLD : in slbit -- comm port: data hold
|
||||
);
|
||||
end component;
|
||||
|
||||
component rritb_rbmon is -- rritb, rri rbus monitor
|
||||
generic (
|
||||
DBASE : positive := 2); -- base for writing data values
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CLK_CYCLE : in slv31 := (others=>'0'); -- clock cycle number
|
||||
ENA : in slbit := '1'; -- enable monitor output
|
||||
RB_MREQ : in rb_mreq_type; -- rbus: request
|
||||
RB_SRES : in rb_sres_type; -- rbus: response
|
||||
RB_LAM : in slv16 := (others=>'0'); -- rbus: look at me
|
||||
RB_STAT : in slv3 -- rbus: status flags
|
||||
);
|
||||
end component;
|
||||
|
||||
component rritb_rbmon_sb is -- simbus wrap for rri rbus monitor
|
||||
generic (
|
||||
DBASE : positive := 2; -- base for writing data values
|
||||
ENAPIN : integer := sbcntl_sbf_rbmon); -- SB_CNTL signal to use for enable
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RB_MREQ : in rb_mreq_type; -- rbus: request
|
||||
RB_SRES : in rb_sres_type; -- rbus: response
|
||||
RB_LAM : in slv16 := (others=>'0'); -- rbus: look at me
|
||||
RB_STAT : in slv3 -- rbus: status flags
|
||||
);
|
||||
end component;
|
||||
|
||||
component rritb_sres_or_mon is -- rribus result or monitor
|
||||
port (
|
||||
RB_SRES_1 : in rb_sres_type; -- rb_sres input 1
|
||||
RB_SRES_2 : in rb_sres_type; -- rb_sres input 2
|
||||
RB_SRES_3 : in rb_sres_type := rb_sres_init; -- rb_sres input 3
|
||||
RB_SRES_4 : in rb_sres_type := rb_sres_init -- rb_sres input 4
|
||||
);
|
||||
end component;
|
||||
|
||||
component rritb_core is -- core of rri/cext based test bench
|
||||
generic (
|
||||
CLK_PERIOD : time := 20 ns; -- clock period
|
||||
CLK_OFFSET : time := 200 ns; -- clock offset (time to start clock)
|
||||
SETUP_TIME : time := 5 ns; -- setup time
|
||||
C2OUT_TIME : time := 10 ns); -- clock to output time
|
||||
port (
|
||||
CLK : out slbit; -- main clock
|
||||
RX_DATA : out slv8; -- read data (data ext->tb)
|
||||
RX_VAL : out slbit; -- read data valid (data ext->tb)
|
||||
RX_HOLD : in slbit; -- read data hold (data ext->tb)
|
||||
TX_DATA : in slv8; -- write data (data tb->ext)
|
||||
TX_ENA : in slbit -- write data enable (data tb->ext)
|
||||
);
|
||||
end component;
|
||||
|
||||
component rricp_rp is -- rri comm->reg port aif forwarder
|
||||
-- implements rricp_aif, uses rrirp_aif
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_INT : in slbit := '0'; -- rri ito time unit clock enable
|
||||
RESET : in slbit :='0'; -- reset
|
||||
CP_DI : in slv9; -- comm port: data in
|
||||
CP_ENA : in slbit; -- comm port: data enable
|
||||
CP_BUSY : out slbit; -- comm port: data busy
|
||||
CP_DO : out slv9; -- comm port: data out
|
||||
CP_VAL : out slbit; -- comm port: data valid
|
||||
CP_HOLD : in slbit := '0' -- comm port: data hold
|
||||
);
|
||||
end component;
|
||||
|
||||
end rritblib;
|
||||
Loading…
x
Reference in New Issue
Block a user