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

Subversion Repositories w11

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /w11/tags/w11a_V0.61/tools/tcl/rbmoni
    from Rev 25 to Rev 26
    Reverse comparison

Rev 25 → Rev 26

/test_rbtest.tcl
0,0 → 1,306
# $Id: test_rbtest.tcl 516 2013-05-05 21:24:52Z mueller $
#
# Copyright 2011-2013 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.
#
# Revision History:
# Date Rev Version Comment
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First Draft
#
 
package provide rbmoni 1.0
 
package require rutiltpp
package require rutil
package require rlink
package require rbtest
 
namespace eval rbmoni {
#
# Basic tests with rbtester registers
#
proc test_rbtest {{print 0}} {
set esdval 0x00
set esdmsk [regbld rlink::STAT {stat -1}]
#
set errcnt 0
rlc errcnt -clear
#
rlc log "rbmoni::test_rbtest - init"
rbmoni::init
rbtest::init
#
set atecntl [rlc amap te.cntl]
set atedata [rlc amap te.data]
set atefifo [rlc amap te.fifo]
#
#-------------------------------------------------------------------------
rlc log " test 1: exercise monitor data access via data/addr regs"
 
set vtecntl [regbld rbtest::CNTL {stat -1}]
set vtedata 0x1234
 
# setup te.cntl and te.data
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.data $vtedata
 
# read te.cntl and te.data with rbmoni on; check that 2 lines aquired
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl [regbld rbmoni::CNTL go] \
-rreg te.cntl -edata $vtecntl \
-rreg te.data -edata $vtedata \
-wreg rm.cntl 0x0 \
-rreg rm.addr -edata [regbld rbmoni::ADDR {laddr 2}]
 
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack] $atedata $vtedata 0]
 
#
#-------------------------------------------------------------------------
rlc log " test 1a: read all in one rblk"
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr 0x0000 \
-rblk rm.data 8 -edata $edat $emsk \
-rreg rm.addr -edata 0x8
#
#-------------------------------------------------------------------------
rlc log " test 1b: random address with rreg"
foreach addr {0x1 0x3 0x5 0x7 0x6 0x4 0x2 0x0} {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr $addr \
-rreg rm.data -edata [lindex $edat $addr] [lindex $emsk $addr] \
-rreg rm.addr -edata [expr {$addr + 1}]
}
#
#-------------------------------------------------------------------------
rlc log " test 1c: random address with rblk length 2"
foreach addr {0x1 0x3 0x5 0x6 0x4 0x2 0x0} {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr $addr \
-rblk rm.data 2 -edata [lrange $edat $addr [expr {$addr + 1}] ] \
[lrange $emsk $addr [expr {$addr + 1}] ] \
-rreg rm.addr -edata [expr {$addr + 2}]
}
#
#-------------------------------------------------------------------------
rlc log " test 2a: test rreg,wreg capture (ncyc=0); ack, we flags"
set vtedata 0x4321
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atedata $vtedata 0] \
[list [regbld rbmoni::FLAGS ack ] $atedata $vtedata 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.data $vtedata \
-rreg te.data -edata $vtedata
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2b: test rreg,wreg capture (ncyc=1,4); busy flag and nbusy"
set nbusy_1 [regbld rbtest::CNTL {nbusy 1}]
set nbusy_4 [regbld rbtest::CNTL {nbusy 4}]
set vtedata 0xbeaf
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $nbusy_1 0] \
[list [regbld rbmoni::FLAGS ack busy we] $atedata $vtedata 1] \
[list [regbld rbmoni::FLAGS ack we] $atecntl $nbusy_4 0] \
[list [regbld rbmoni::FLAGS ack busy ] $atedata $vtedata 4] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $nbusy_1 \
-wreg te.data $vtedata \
-wreg te.cntl $nbusy_4 \
-rreg te.data -edata $vtedata \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2c: test rreg,wreg capture (timeout); busy,tout flag"
set vtecntl [regbld rbtest::CNTL {nbusy -1}]
set vtedata 0xdead
set nmax [rbtest::nbusymax]
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack busy tout we] $atedata $vtedata $nmax] \
[list [regbld rbmoni::FLAGS ack busy tout ] $atedata 0x5555 $nmax] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.data $vtedata -estat [regbld rlink::STAT rbnak] \
-rreg te.data -edata 0x5555 -estat [regbld rlink::STAT rbnak] \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2d: test rreg,wreg capture (prompt nak); nak flag"
set vtecntl [regbld rbtest::CNTL nofifo]
set vtefifo 0xdead
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS nak we] $atefifo $vtefifo 0] \
[list [regbld rbmoni::FLAGS nak ] $atefifo {} 0] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.fifo $vtefifo -estat [regbld rlink::STAT rbnak] \
-rreg te.fifo -estat [regbld rlink::STAT rbnak] \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2e: test rreg,wreg capture (delayed nak); nak flag"
set vtecntl [regbld rbtest::CNTL nofifo {nbusy 7}]
set vtefifo 0xdead
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack busy nak we] $atefifo $vtefifo 7] \
[list [regbld rbmoni::FLAGS ack busy nak ] $atefifo {} 7] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.fifo $vtefifo -estat [regbld rlink::STAT rbnak] \
-rreg te.fifo -estat [regbld rlink::STAT rbnak] \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2f: test rreg,wreg capture (prompt rbus err); err flag"
set vtefifo 0x1357
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atefifo $vtefifo 0] \
[list [regbld rbmoni::FLAGS ack ] $atefifo $vtefifo 0] \
[list [regbld rbmoni::FLAGS ack err ] $atefifo {} 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.fifo $vtefifo \
-rreg te.fifo -edata $vtefifo \
-rreg te.fifo -estat [regbld rlink::STAT rberr]
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 2g: test rreg,wreg capture (delayed rbus err); err flag"
set vtecntl [regbld rbtest::CNTL {nbusy 5}]
set vtefifo 0x1357
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack busy we] $atefifo $vtefifo 5] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo $vtefifo 5] \
[list [regbld rbmoni::FLAGS ack busy err ] $atefifo {} 5] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.fifo $vtefifo \
-rreg te.fifo -edata $vtefifo \
-rreg te.fifo -estat [regbld rlink::STAT rberr] \
-wreg te.cntl 0x0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 3: test init capture; init flag"
set vtecntl [regbld rbtest::CNTL {nofifo}]
set vteinit [regbld rbtest::INIT {cntl}]
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we ] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack ] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-init te.cntl $vteinit \
-rreg te.cntl -edata 0
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
#
#-------------------------------------------------------------------------
rlc log " test 4: test rblk,wblk capture (ncyc=2 on read)"
set vteinit [regbld rbtest::INIT cntl fifo]
set nbusy_2 [regbld rbtest::CNTL {nbusy 2}]
set vtefifo {0xdead 0xbeaf 0x4711}
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0xdead 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0xbeaf 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x4711 0] \
[list [regbld rbmoni::FLAGS ack we] $atecntl $nbusy_2 0] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0xdead 2] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0xbeaf 2] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0x4711 2] \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-init te.cntl $vteinit \
-wblk te.fifo $vtefifo \
-wreg te.cntl $nbusy_2 \
-rblk te.fifo [llength $vtefifo] -edata $vtefifo \
-init te.cntl $vteinit
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log "rbmoni::test_rbtest - cleanup:"
rbtest::init
rbmoni::init
#
incr errcnt [rlc errcnt -clear]
return $errcnt
}
}
/util.tcl
0,0 → 1,205
# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
#
# Copyright 2011-2013 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.
#
# Revision History:
# Date Rev Version Comment
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First draft
#
 
package provide rbmoni 1.0
 
package require rutil
package require rlink
 
namespace eval rbmoni {
#
# setup register descriptions for rbd_rbmon
#
regdsc CNTL {go 0}
regdsc ALIM {hilim 15 8} {lolim 7 8}
regdsc ADDR {wrap 15} {addr 10 11 "-"} {laddr 10 9} {waddr 1 2}
#
regdsc DAT3 {flags 15 8 "-"} {ack 15} {busy 14} {err 13} {nak 12} {tout 11} \
{init 9} {we 8} {addr 7 8}
regdsc DAT0 {ndlymsb 15 4} {nbusy 11 12}
#
# 'pseudo register', describes 1st word in return list element of rbmoni::read
# must have same bit sequence as DAT3(flags)
regdsc FLAGS {ack 7} {busy 6} {err 5} {nak 4} {tout 3} {init 1} {we 0}
#
# setup: amap definitions for rbd_rbmon
#
proc setup {{base 0x00fc}} {
rlc amap -insert rm.cntl [expr {$base + 0x00}]
rlc amap -insert rm.alim [expr {$base + 0x01}]
rlc amap -insert rm.addr [expr {$base + 0x02}]
rlc amap -insert rm.data [expr {$base + 0x03}]
}
#
# init: reset rbd_rbmon (stop, reset alim)
#
proc init {} {
rlc exec \
-wreg rm.cntl 0x0000 \
-wreg rm.alim [regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}] \
-wreg rm.addr 0x0000
}
#
# start: start the rbmon
#
proc start {} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL go]
}
#
# stop: stop the rbmon
#
proc stop {} {
rlc exec -wreg rm.cntl 0x0000
}
#
# read: read nent last entries (by default all)
#
proc read {{nent -1}} {
set amax [regget rbmoni::ADDR(laddr) -1]
if {$nent == -1} { set nent $amax }
 
rlc exec -rreg rm.addr raddr
 
set laddr [regget rbmoni::ADDR(laddr) $raddr]
set nval $laddr
if {[regget rbmoni::ADDR(wrap) $raddr]} { set nval $amax }
 
if {$nent > $nval} {set nent $nval}
if {$nent == 0} { return {} }
 
set caddr [expr {( $laddr - $nent ) & $amax}]
rlc exec -wreg rm.addr [regbld rbmoni::ADDR [list laddr $caddr]]
 
set rval {}
 
while {$nent > 0} {
set nblk [expr {$nent << 2}]
if {$nblk > 256} {set nblk 256}
rlc exec -rblk rm.data $nblk rawdat
 
foreach {d0 d1 d2 d3} $rawdat {
set eflag [regget rbmoni::DAT3(flags) $d3]
set eaddr [regget rbmoni::DAT3(addr) $d3]
set edly [expr {( [regget rbmoni::DAT0(ndlymsb) $d0] << 16 ) | $d1 }]
set enbusy [regget rbmoni::DAT0(nbusy) $d0]
lappend rval [list $eflag $eaddr $d2 $edly $enbusy]
}
 
set nent [expr {$nent - ( $nblk >> 2 ) }]
}
 
rlc exec -wreg rm.addr $raddr
 
return $rval
}
#
# print: print rbmon data (optionally also read them)
#
proc print {{mondat -1}} {
 
if {[llength $mondat] == 1} {
set ele [lindex $mondat 0]
if {[llength $ele] == 1} {
set nent [lindex $ele 0]
set mondat [read $nent]
}
}
 
set rval {}
 
set eind [expr {1 - [llength $mondat] }]
append rval " ind addr data delay nbusy ac bs er na to in we"
 
foreach {ele} $mondat {
foreach {eflag eaddr edata edly enbusy} $ele { break }
set fack [regget rbmoni::FLAGS(ack) $eflag]
set fbsy [regget rbmoni::FLAGS(busy) $eflag]
set ferr [regget rbmoni::FLAGS(err) $eflag]
set fnak [regget rbmoni::FLAGS(nak) $eflag]
set fto [regget rbmoni::FLAGS(tout) $eflag]
set fini [regget rbmoni::FLAGS(init) $eflag]
set fwe [regget rbmoni::FLAGS(we) $eflag]
set ename ""
set comment ""
if {$ferr} {append comment " err=1!"}
if {$fini} {
append comment " init"
} else {
if {$fnak} {append comment " nak=1!"}
}
if {$fto} {append comment " tout=1!"}
if {[rlc amap -testaddr $eaddr]} {set ename [rlc amap -name $eaddr]}
append rval [format \
"\n%4d %-10s %4.4x %6d %4d %2.2x %d %d %d %d %d %d %d %s" \
$eind $ename $edata $edly $enbusy $eflag \
$fack $fbsy $ferr $fnak $fto $fini $fwe $comment]
incr eind
}
 
return $rval
}
 
#
# raw_edata: prepare edata lists for raw data reads in tests
# args is list of {eflag eaddr edata enbusy} sublists
 
proc raw_edata {edat emsk args} {
upvar $edat uedat
upvar $emsk uemsk
set uedat {}
set uemsk {}
 
set m0 [expr {0xffff & ~[regget rbmoni::DAT0(nbusy) -1] }]
set d1 0x0000
set m1 0xffff
set m3 0x0000
 
foreach line $args {
foreach {eflags eaddr edata enbusy} $line { break }
set d0 [regbld rbmoni::DAT0 [list nbusy $enbusy]]
if {$edata ne ""} {
set m2 0x0000
set d2 $edata
} else {
set m2 0xffff
set d2 0x0000
}
set d3 [regbld rbmoni::DAT3 [list flags $eflags] [list addr $eaddr]]
 
lappend uedat $d0 $d1 $d2 $d3
lappend uemsk $m0 $m1 $m2 $m3
}
 
return ""
}
 
#
# raw_check: check raw data against expect values prepared by raw_edata
#
proc raw_check {edat emsk} {
 
rlc exec -estatdef 0x0 [regbld rlink::STAT {stat -1}] \
-rreg rm.addr -edata [llength $edat] \
-wreg rm.addr 0 \
-rblk rm.data [llength $edat] -edata $edat $emsk \
-rreg rm.addr -edata [llength $edat]
return ""
}
}
/test_regs.tcl
0,0 → 1,89
# $Id: test_regs.tcl 375 2011-04-02 07:56:47Z mueller $
#
# Copyright 2011- 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.
#
# Revision History:
# Date Rev Version Comment
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First Draft
#
 
package provide rbmoni 1.0
 
package require rutiltpp
package require rutil
package require rlink
 
namespace eval rbmoni {
#
# Basic tests with rbtester registers
#
proc test_regs {} {
set esdval 0x00
set esdmsk [regbld rlink::STAT {stat -1}]
#
set errcnt 0
rlc errcnt -clear
#
rlc log "rbmoni::test_regs - start"
#
#-------------------------------------------------------------------------
rlc log " test 1: write/read cntl"
foreach val [list [regbld rbmoni::CNTL go] 0x0] {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl $val \
-rreg rm.cntl -edata $val
}
#
#-------------------------------------------------------------------------
rlc log " test 2: write/read alim"
foreach val [list [regbld rbmoni::ALIM {hilim 0x00} {lolim 0x00}] \
[regbld rbmoni::ALIM {hilim 0xff} {lolim 0xff}] \
[regbld rbmoni::ALIM {hilim 0x00} {lolim 0xff}] \
[regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}]
] {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.alim $val \
-rreg rm.alim -edata $val
}
#
#-------------------------------------------------------------------------
rlc log " test 3: write/read addr"
set amax [regget rbmoni::ADDR(laddr) -1]
foreach {laddr waddr} [list 0x0000 0 0x0000 3 $amax 0 $amax 3] {
set addr [regbld rbmoni::ADDR [list laddr $laddr] [list waddr $waddr]]
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr $addr \
-rreg rm.addr -edata $addr
}
#
#-------------------------------------------------------------------------
rlc log " test 4: verify that cntl.go 0->1 clear addr"
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl 0x0 \
-rreg rm.cntl -edata 0x0 \
-wreg rm.addr [regbld rbmoni::ADDR [list laddr $amax]] \
-rreg rm.addr -edata [regbld rbmoni::ADDR [list laddr $amax]] \
-wreg rm.cntl [regbld rbmoni::CNTL go] \
-rreg rm.cntl -edata [regbld rbmoni::CNTL go] \
-rreg rm.addr -edata 0x00 \
-wreg rm.cntl 0x0 \
-rreg rm.cntl -edata 0x0
#
#-------------------------------------------------------------------------
rlc log "rbmoni::test_regs - cleanup"
rbmoni::init
#
incr errcnt [rlc errcnt -clear]
return $errcnt
}
}
/.cvsignore
0,0 → 1,89
pkgIndex.tcl
/.
. Property changes : Added: svn:ignore ## -0,0 +1,34 ## +*.dep_ghdl +*.dep_isim +*.dep_xst +work-obj93.cf +*.vcd +*.ghw +*.sav +*.tmp +*.exe +ise +xflow.his +*.ngc +*.ncd +*.pcf +*.bit +*.msk +isim +isim.log +isim.wdb +fuse.log +*_[sft]sim.vhd +*_tsim.sdf +*_xst.log +*_tra.log +*_twr.log +*_map.log +*_par.log +*_tsi.log +*_pad.log +*_bgn.log +*_svn.log +*_sum.log +*_[dsft]sim.log +pkgIndex.tcl

powered by: WebSVN 2.1.0

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