diff --git a/rtl/ibus/ibd_kw11l.vhd b/rtl/ibus/ibd_kw11l.vhd index 59f86e25..e98407f7 100644 --- a/rtl/ibus/ibd_kw11l.vhd +++ b/rtl/ibus/ibd_kw11l.vhd @@ -1,6 +1,6 @@ --- $Id: ibd_kw11l.vhd 984 2018-01-02 20:56:27Z mueller $ +-- $Id: ibd_kw11l.vhd 1138 2019-04-26 08:14:56Z mueller $ -- --- Copyright 2008-2015 by Walter F.J. Mueller +-- Copyright 2008-2019 by Walter F.J. Mueller -- -- 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 @@ -18,7 +18,7 @@ -- Dependencies: - -- Test bench: - -- Target Devices: generic --- Tool versions: ise 8.2-14.7; viv 2014.4; ghdl 0.18-0.31 +-- Tool versions: ise 8.2-14.7; viv 2017.2; ghdl 0.18-0.35 -- -- Synthesized (xst): -- Date Rev ise Target flop lutl lutm slic t peri @@ -27,6 +27,8 @@ -- -- Revision History: -- Date Rev Version Comment +-- 2019-04-24 1138 1.2.1 add csr.ir; csr only loc writable; +-- csr.moni can be cleared, but not set by loc write -- 2015-05-09 676 1.2 add CPUSUSP, freeze timer when cpu suspended -- 2011-11-18 427 1.1.1 now numeric_std clean -- 2010-10-17 333 1.1 use ibus V2 interface @@ -65,8 +67,9 @@ architecture syn of ibd_kw11l is constant ibaddr_kw11l : slv16 := slv(to_unsigned(8#177546#,16)); - constant lks_ibf_ie : integer := 6; constant lks_ibf_moni : integer := 7; + constant lks_ibf_ie : integer := 6; + constant lks_ibf_ir : integer := 5; constant twidth : natural := 5; constant tdivide : natural := 20; @@ -130,16 +133,23 @@ begin -- ibus output driver if r.ibsel = '1' then - idout(lks_ibf_ie) := R_REGS.ie; - idout(lks_ibf_moni) := R_REGS.moni; + idout(lks_ibf_moni) := r.moni; + idout(lks_ibf_ie) := r.ie; + if IB_MREQ.racc = '1' then -- rri --------------------- + idout(lks_ibf_ir) := r.intreq; + end if; end if; -- ibus write transactions if r.ibsel='1' and ibw0='1' then - n.ie := IB_MREQ.din(lks_ibf_ie); - n.moni := IB_MREQ.din(lks_ibf_moni); - if IB_MREQ.din(lks_ibf_ie)='0' or IB_MREQ.din(lks_ibf_moni)='0' then - n.intreq := '0'; + if IB_MREQ.racc = '0' then -- cpu --------------------- + n.ie := IB_MREQ.din(lks_ibf_ie); + if IB_MREQ.din(lks_ibf_moni) = '0' then -- write 0 to moni + n.moni := '0'; -- clears moni + end if; + if IB_MREQ.din(lks_ibf_ie) = '0' then -- ie set 0 + n.intreq := '0'; -- cancel interrupt + end if; end if; end if; diff --git a/rtl/ibus/ibdr_dl11.vhd b/rtl/ibus/ibdr_dl11.vhd index dc30ce67..9d6c008e 100644 --- a/rtl/ibus/ibdr_dl11.vhd +++ b/rtl/ibus/ibdr_dl11.vhd @@ -1,4 +1,4 @@ --- $Id: ibdr_dl11.vhd 1131 2019-04-14 13:24:25Z mueller $ +-- $Id: ibdr_dl11.vhd 1138 2019-04-26 08:14:56Z mueller $ -- -- Copyright 2008-2019 by Walter F.J. Mueller -- @@ -28,6 +28,7 @@ -- -- Revision History: -- Date Rev Version Comment +-- 2019-04-24 1138 1.3.2 add rcsr.ir and xcsr.ir (intreq monitors) -- 2019-04-14 1131 1.3.1 RLIM_CEV now slv8 -- 2019-04-07 1127 1.3 for dl11_buf compat: xbuf.val in bit 15 and 8; -- use rbuf instead xbuf for rdry reporting; remove @@ -83,11 +84,13 @@ architecture syn of ibdr_dl11 is subtype rcsr_ibf_rrlim is integer range 14 downto 12; constant rcsr_ibf_rdone : integer := 7; constant rcsr_ibf_rie : integer := 6; + constant rcsr_ibf_rir : integer := 5; constant rbuf_ibf_rrdy : integer := 15; constant xcsr_ibf_xrdy : integer := 7; constant xcsr_ibf_xie : integer := 6; + constant xcsr_ibf_xir : integer := 5; constant xbuf_ibf_xval : integer := 15; constant xbuf_ibf_xval8 : integer := 8; @@ -204,6 +207,7 @@ begin else -- rri --------------------- idout(rcsr_ibf_rrlim) := r.rrlim; + idout(rcsr_ibf_rir) := r.rintreq; if ibw1 = '1' then n.rrlim := IB_MREQ.din(rcsr_ibf_rrlim); end if; @@ -244,6 +248,9 @@ begin n.xintreq := '0'; end if; end if; + + else -- rri --------------------- + idout(xcsr_ibf_xir) := r.xintreq; end if; when ibaddr_xbuf => -- XBUF -- transmit data buffer ------ diff --git a/rtl/ibus/ibdr_lp11.vhd b/rtl/ibus/ibdr_lp11.vhd index 746c5a6a..fb93e664 100644 --- a/rtl/ibus/ibdr_lp11.vhd +++ b/rtl/ibus/ibdr_lp11.vhd @@ -1,4 +1,4 @@ --- $Id: ibdr_lp11.vhd 1126 2019-04-06 17:37:40Z mueller $ +-- $Id: ibdr_lp11.vhd 1138 2019-04-26 08:14:56Z mueller $ -- -- Copyright 2009-2019 by Walter F.J. Mueller -- @@ -27,6 +27,7 @@ -- -- Revision History: -- Date Rev Version Comment +-- 2019-04-24 1138 1.3.3 add csr.ir (intreq monitor) -- 2019-03-10 1121 1.3.2 ignore buf write if csr.err=1 for lp11_buf compat -- 2019-03-03 1118 1.3.1 VAL in bit 15 and 8 for lp11_buf compat -- 2013-05-04 515 1.3 BUGFIX: r.err was cleared in racc read ! @@ -76,6 +77,7 @@ architecture syn of ibdr_lp11 is constant csr_ibf_err : integer := 15; constant csr_ibf_done : integer := 7; constant csr_ibf_ie : integer := 6; + constant csr_ibf_ir : integer := 5; constant buf_ibf_val : integer := 15; constant buf_ibf_val8: integer := 8; @@ -152,6 +154,7 @@ begin idout(csr_ibf_err) := r.err; idout(csr_ibf_done) := r.done; idout(csr_ibf_ie) := r.ie; + if IB_MREQ.racc = '0' then -- cpu --------------------- if ibw0 = '1' then n.ie := IB_MREQ.din(csr_ibf_ie); @@ -163,7 +166,9 @@ begin n.intreq := '0'; end if; end if; + else -- rri --------------------- + idout(csr_ibf_ir) := r.intreq; if ibw1 = '1' then n.err := IB_MREQ.din(csr_ibf_err); if IB_MREQ.din(csr_ibf_err) = '1' then @@ -174,6 +179,7 @@ begin end if; when ibaddr_buf => -- BUF -- data buffer ---------------- + if IB_MREQ.racc = '0' then -- cpu --------------------- if ibw0 = '1' then if r.done = '1' then -- ignore buf write when done=0 @@ -190,6 +196,7 @@ begin end if; -- r.err = '0' end if; -- r.done = '1' end if; -- ibw0 = '1' + else -- rri --------------------- idout(r.buf'range) := r.buf; idout(buf_ibf_val) := not r.done; diff --git a/rtl/ibus/ibdr_lp11_buf.vhd b/rtl/ibus/ibdr_lp11_buf.vhd index 104ff391..d44cc28f 100644 --- a/rtl/ibus/ibdr_lp11_buf.vhd +++ b/rtl/ibus/ibdr_lp11_buf.vhd @@ -1,4 +1,4 @@ --- $Id: ibdr_lp11_buf.vhd 1134 2019-04-21 17:18:03Z mueller $ +-- $Id: ibdr_lp11_buf.vhd 1138 2019-04-26 08:14:56Z mueller $ -- -- Copyright 2019- by Walter F.J. Mueller -- @@ -23,6 +23,7 @@ -- -- Revision History: -- Date Rev Version Comment +-- 2019-04-24 1138 1.0.3 add csr.ir (intreq monitor) -- 2019-04-20 1134 1.0.2 remove fifo clear on BRESET -- 2019-04-14 1131 1.0.1 RLIM_CEV now slv8 -- 2019-03-17 1123 1.0 Initial version @@ -73,6 +74,7 @@ architecture syn of ibdr_lp11_buf is subtype csr_ibf_type is integer range 10 downto 8; constant csr_ibf_done : integer := 7; constant csr_ibf_ie : integer := 6; + constant csr_ibf_ir : integer := 5; constant buf_ibf_val : integer := 15; subtype buf_ibf_size is integer range AWIDTH-1+8 downto 8; subtype buf_ibf_data is integer range 6 downto 0; @@ -203,6 +205,7 @@ begin idout(csr_ibf_err) := r.err; idout(csr_ibf_done) := r.done; idout(csr_ibf_ie) := r.ie; + if IB_MREQ.racc = '0' then -- cpu if ibw0 = '1' then n.ie := IB_MREQ.din(csr_ibf_ie); @@ -214,9 +217,11 @@ begin n.intreq := '0'; end if; end if; + else -- rri idout(csr_ibf_rlim) := r.rlim; idout(csr_ibf_type) := slv(to_unsigned(AWIDTH,3)); + idout(csr_ibf_ir) := r.intreq; if ibw1 = '1' then n.err := IB_MREQ.din(csr_ibf_err); n.rlim := IB_MREQ.din(csr_ibf_rlim); @@ -228,6 +233,7 @@ begin end if; when ibaddr_buf => -- BUF -- data buffer ---------------- + if IB_MREQ.racc = '0' then -- cpu if ibw0 = '1' then irlimsta := '1'; -- in all cases start timer @@ -245,6 +251,7 @@ begin end if; -- r.err = '0' end if; -- r.done = '1' end if; -- ibw0 = '1' + else -- rri idout(buf_ibf_val) := not PBUF_EMPTY; idout(buf_ibf_size) := PBUF_SIZE; diff --git a/tools/bin/asm-11 b/tools/bin/asm-11 index f415e8f9..64307937 100755 --- a/tools/bin/asm-11 +++ b/tools/bin/asm-11 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# $Id: asm-11 1133 2019-04-19 18:43:00Z mueller $ +# $Id: asm-11 1138 2019-04-26 08:14:56Z mueller $ # # Copyright 2013-2019 by Walter F.J. Mueller # @@ -14,6 +14,7 @@ # # Revision History: # Date Rev Version Comment +# 2019-04-25 1138 1.0.7 print lines with errors to stderr unless -lst seen # 2019-04-19 1133 1.0.6 .end directive autocreates '...end' label # 2018-11-03 1065 1.0.5 add and use bailout # 2015-11-01 712 1.0.4 BUGFIX: fix '.' handling in instructions @@ -340,11 +341,11 @@ write_lsm($lsm_fname) if $lsm_do; # and exit if ($errcnt_tot > 0) { - print "asm-11-E: compilation errors:"; + print STDERR "asm-11-E: compilation errors:"; foreach my $err (sort keys %errcnt) { - printf " %s: %d", $err, $errcnt{$err}; + printf STDERR " %s: %d", $err, $errcnt{$err}; } - print "\n"; + print STDERR "\n"; exit 1; } exit 0; @@ -1619,7 +1620,7 @@ sub to_rad50 { sub pass2 { - my $fh; + my $fh = *STDERR; # for error line only print if ($lst_do) { if ($lst_fname eq "-") { $fh = *STDOUT; @@ -1650,8 +1651,12 @@ sub pass2 { # generate output data pass2_out($rl); - # listing requested - pass2_lst_line($rl, $fh) if $lst_do; + # listing if requested or error detected in this line + if ($lst_do) { + pass2_lst_line($rl, $fh); + } else { + pass2_lst_line($rl, $fh) if $$rl{err} ne ''; + } # pass 2 dump requested dump_rl($rl) if $opts{tpass2}; @@ -1879,7 +1884,19 @@ sub pass2_lst_line { $str .= ' ' x 21; } - $str .= ' ' . $$rl{line} . "\n"; + my $line = $$rl{line}; + # if only error reporting is done strip the comments. Use that the last + # token is always type EOL and holds the comment in {val}. Therefore + # @{$$rl{tl}}[-1]->{val} is either undefined, or the comment string + if (not $lst_do) { # only error reporting ? + my $comm = @{$$rl{tl}}[-1]->{val}; # get comment (see above) + if (defined $comm) { # if comment seem + $line = substr($line,0,length($line)-length($comm)); # drop comment + $line =~ s/\s*$//; # drop traing blanks + } + } + $str .= ' ' . $line; + $str .= "\n"; print $fh $str; if (1) { while (scalar(@ow)) { diff --git a/tools/tbench/lp11/test_lp11_all.tcl b/tools/tbench/lp11/test_lp11_all.tcl index ddb4fe9d..ada52948 100644 --- a/tools/tbench/lp11/test_lp11_all.tcl +++ b/tools/tbench/lp11/test_lp11_all.tcl @@ -1,4 +1,4 @@ -# $Id: test_lp11_all.tcl 1134 2019-04-21 17:18:03Z mueller $ +# $Id: test_lp11_all.tcl 1138 2019-04-26 08:14:56Z mueller $ # # Copyright 2019- by Walter F.J. Mueller # License disclaimer see License.txt in $RETROBASE directory @@ -35,7 +35,7 @@ rlc log " A1.1: csr err, done --------------------------------" # loc ERR=0 --> test ERR=1,DONE=1,IE=0 (ERR not loc writable) # rem ERR=0 --> test ERR=0,DONE=1,IE=0 # breset --> test ERR=0 (not set by breset) -set rcsrmask [regbld ibd_lp11::RCSR err done ie] +set rcsrmask [regbld ibd_lp11::RCSR err done ie ir] $cpu cp \ -breset \ @@ -56,17 +56,17 @@ $cpu cp \ # remember 'type' retrieved from csr for later tests set type [regget ibd_lp11::RCSR(type) $lprcsr] -rlc log " A1.2: csr ie ---------------------------------------" -# loc IE=1 --> seen on loc and rem +rlc log " A1.2: csr ie,ir ------------------------------------" +# loc IE=1 --> seen on loc and rem (check also ir=1) # rem IE=0 --> stays, IE not rem writable # loc IE=0 --> seen on loc and rem $cpu cp \ -wma lpa.csr [regbld ibd_lp11::CSR ie] \ - -rma lpa.csr -edata [regbld ibd_lp11::CSR ie done] \ - -ribr lpa.csr -edata [regbld ibd_lp11::RCSR ie done] $rcsrmask\ + -rma lpa.csr -edata [regbld ibd_lp11::CSR done ie] \ + -ribr lpa.csr -edata [regbld ibd_lp11::RCSR done ie ir] $rcsrmask\ -wibr lpa.csr 0x0 \ - -rma lpa.csr -edata [regbld ibd_lp11::CSR ie done] \ - -ribr lpa.csr -edata [regbld ibd_lp11::RCSR ie done] $rcsrmask\ + -rma lpa.csr -edata [regbld ibd_lp11::CSR done ie] \ + -ribr lpa.csr -edata [regbld ibd_lp11::RCSR done ie ir] $rcsrmask\ -wma lpa.csr 0x0 \ -rma lpa.csr -edata [regbld ibd_lp11::CSR done] \ -ribr lpa.csr -edata [regbld ibd_lp11::RCSR done] $rcsrmask @@ -76,7 +76,7 @@ if {$type > 0} { # if buffered test rlim # rem write rlim --> seen rem, not loc # loc write rlim --> stays, rlim not loc writable # breset --> rlim not cleared - set rcsrmaskbuf [regbld ibd_lp11::RCSR err {rlim -1} done ie] + set rcsrmaskbuf [regbld ibd_lp11::RCSR err {rlim -1} done ie ir] $cpu cp \ -wibr lpa.csr [regbld ibd_lp11::RCSR {rlim 1}] \ -ribr lpa.csr -edata [regbld ibd_lp11::RCSR {rlim 1} done] $rcsrmaskbuf \ diff --git a/tools/tcl/ibd_dl11/util.tcl b/tools/tcl/ibd_dl11/util.tcl index f248b3d5..5eba46d2 100644 --- a/tools/tcl/ibd_dl11/util.tcl +++ b/tools/tcl/ibd_dl11/util.tcl @@ -1,4 +1,4 @@ -# $Id: util.tcl 1134 2019-04-21 17:18:03Z mueller $ +# $Id: util.tcl 1138 2019-04-26 08:14:56Z mueller $ # # Copyright 2015-2019 by Walter F.J. Mueller # @@ -13,7 +13,7 @@ # # Revision History: # Date Rev Version Comment -# 2019-04-21 1134 1.1 updates for buffered dl11 +# 2019-04-24 1138 1.1 updates for buffered dl11 # 2015-12-26 719 1.0 Initial version # @@ -29,11 +29,11 @@ namespace eval ibd_dl11 { # regdsc RCSR {done 7} {ie 6} - regdsc RRCSR {rlim 14 3} {type 10 3} {done 7} {ie 6} {fclr 5} + regdsc RRCSR {rlim 14 3} {type 10 3} {done 7} {ie 6} {ir 5} {rlb 4} {fclr 1} regdsc RRBUF {rrdy 15} {rsize 14 7 "d"} {tsize 6 7 "d"} regdsc XCSR {done 7} {ie 6} - regdsc RXCSR {rlim 14 3} {done 7} {ie 6} + regdsc RXCSR {rlim 14 3} {done 7} {ie 6} {ir 5} {rlb 4} regdsc RXBUF {val 15} {size 14 7 "d"} {data 7 8 "o"} rw11util::regmap_add ibd_dl11 tt?.rcsr {l? RCSR r? RRCSR} diff --git a/tools/tcl/ibd_lp11/util.tcl b/tools/tcl/ibd_lp11/util.tcl index f80428e0..da4fac74 100644 --- a/tools/tcl/ibd_lp11/util.tcl +++ b/tools/tcl/ibd_lp11/util.tcl @@ -1,4 +1,4 @@ -# $Id: util.tcl 1123 2019-03-17 17:55:12Z mueller $ +# $Id: util.tcl 1138 2019-04-26 08:14:56Z mueller $ # # Copyright 2015-2019 by Walter F.J. Mueller # @@ -30,7 +30,7 @@ namespace eval ibd_lp11 { # regdsc CSR {err 15} {done 7} {ie 6} - regdsc RCSR {err 15} {rlim 14 3} {type 10 3} {done 7} {ie 6} + regdsc RCSR {err 15} {rlim 14 3} {type 10 3} {done 7} {ie 6} {ir 5} regdsc RBUF {val 15} {size 14 7 "d"} {data 6 7 "o"} rw11util::regmap_add ibd_lp11 lp?.csr {l? CSR r? RCSR}