# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
|
# $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>
|
# 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
|
# 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
|
# 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.
|
# 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
|
# This program is distributed in the hope that it will be useful, but
|
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
# for complete details.
|
# for complete details.
|
#
|
#
|
# Revision History:
|
# Revision History:
|
# Date Rev Version Comment
|
# Date Rev Version Comment
|
# 2011-03-27 374 1.0 Initial version
|
# 2011-03-27 374 1.0 Initial version
|
# 2011-03-13 369 0.1 Frist draft
|
# 2011-03-13 369 0.1 Frist draft
|
#
|
#
|
|
|
package provide rbtest 1.0
|
package provide rbtest 1.0
|
|
|
package require rutiltpp
|
package require rutiltpp
|
package require rutil
|
package require rutil
|
package require rlink
|
package require rlink
|
|
|
namespace eval rbtest {
|
namespace eval rbtest {
|
#
|
#
|
# setup register descriptions for rbd_tester
|
# setup register descriptions for rbd_tester
|
#
|
#
|
regdsc CNTL {nofifo 15} {stat 14 3} {nbusy 9 10}
|
regdsc CNTL {nofifo 15} {stat 14 3} {nbusy 9 10}
|
regdsc INIT {fifo 2} {data 1} {cntl 0}
|
regdsc INIT {fifo 2} {data 1} {cntl 0}
|
#
|
#
|
# setup: amap definitions for rbd_tester
|
# setup: amap definitions for rbd_tester
|
#
|
#
|
proc setup {{base 0x00f0}} {
|
proc setup {{base 0x00f0}} {
|
rlc amap -insert te.cntl [expr {$base + 0x00}]
|
rlc amap -insert te.cntl [expr {$base + 0x00}]
|
rlc amap -insert te.data [expr {$base + 0x01}]
|
rlc amap -insert te.data [expr {$base + 0x01}]
|
rlc amap -insert te.fifo [expr {$base + 0x02}]
|
rlc amap -insert te.fifo [expr {$base + 0x02}]
|
rlc amap -insert te.attn [expr {$base + 0x03}]
|
rlc amap -insert te.attn [expr {$base + 0x03}]
|
}
|
}
|
#
|
#
|
# init: reset rbd_tester (clear via init)
|
# init: reset rbd_tester (clear via init)
|
#
|
#
|
proc init {} {
|
proc init {} {
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
}
|
}
|
#
|
#
|
# nbusymax: returns maximal nbusy value not causing timeout
|
# nbusymax: returns maximal nbusy value not causing timeout
|
#
|
#
|
proc nbusymax {} {
|
proc nbusymax {} {
|
set esdmsk [regbld rlink::STAT {stat -1} attn]
|
set esdmsk [regbld rlink::STAT {stat -1} attn]
|
rlc exec -estatdef 0 $esdmsk \
|
rlc exec -estatdef 0 $esdmsk \
|
-rreg te.cntl sav_cntl \
|
-rreg te.cntl sav_cntl \
|
-wreg te.cntl [regbld rbtest::CNTL {nbusy -1}] \
|
-wreg te.cntl [regbld rbtest::CNTL {nbusy -1}] \
|
-rreg te.data -estat [regbld rlink::STAT rbnak] $esdmsk \
|
-rreg te.data -estat [regbld rlink::STAT rbnak] $esdmsk \
|
-rreg te.attn ncyc
|
-rreg te.attn ncyc
|
rlc exec -estatdef 0 $esdmsk \
|
rlc exec -estatdef 0 $esdmsk \
|
-wreg te.cntl $sav_cntl
|
-wreg te.cntl $sav_cntl
|
return [expr {$ncyc - 1}]
|
return [expr {$ncyc - 1}]
|
}
|
}
|
#
|
#
|
# probe: determine rbd_tester environment (max nbusy, stat and attn wiring)
|
# probe: determine rbd_tester environment (max nbusy, stat and attn wiring)
|
#
|
#
|
proc probe {} {
|
proc probe {} {
|
set esdval 0x00
|
set esdval 0x00
|
set esdmsk [regbld rlink::STAT {stat -1}]
|
set esdmsk [regbld rlink::STAT {stat -1}]
|
set esdmsknak [regbld rlink::STAT {stat -1} rbnak]
|
set esdmsknak [regbld rlink::STAT {stat -1} rbnak]
|
set esdmskatt [regbld rlink::STAT {stat -1} attn]
|
set esdmskatt [regbld rlink::STAT {stat -1} attn]
|
set rbusy {}
|
set rbusy {}
|
set rstat {}
|
set rstat {}
|
set rattn {}
|
set rattn {}
|
#
|
#
|
# probe max nbusy for write and read
|
# probe max nbusy for write and read
|
#
|
#
|
set wrerr {}
|
set wrerr {}
|
set rderr {}
|
set rderr {}
|
for {set i 3} { $i < 8 } {incr i} {
|
for {set i 3} { $i < 8 } {incr i} {
|
set nbusy0 [expr {( 1 << $i )}]
|
set nbusy0 [expr {( 1 << $i )}]
|
for {set j -1} { $j <= 1 } {incr j} {
|
for {set j -1} { $j <= 1 } {incr j} {
|
set nbusy [expr {$nbusy0 + $j}]
|
set nbusy [expr {$nbusy0 + $j}]
|
set valc [regbld rbtest::CNTL [list nbusy $nbusy]]
|
set valc [regbld rbtest::CNTL [list nbusy $nbusy]]
|
rlc exec \
|
rlc exec \
|
-wreg te.cntl $valc -estat $esdval $esdmsk\
|
-wreg te.cntl $valc -estat $esdval $esdmsk\
|
-wreg te.data 0x0000 statwr -estat $esdval $esdmsknak \
|
-wreg te.data 0x0000 statwr -estat $esdval $esdmsknak \
|
-rreg te.data dummy statrd -estat $esdval $esdmsknak
|
-rreg te.data dummy statrd -estat $esdval $esdmsknak
|
if {[llength $wrerr] == 0 && [regget rlink::STAT(rbnak) $statwr] != 0} {
|
if {[llength $wrerr] == 0 && [regget rlink::STAT(rbnak) $statwr] != 0} {
|
lappend wrerr $i $j $nbusy
|
lappend wrerr $i $j $nbusy
|
}
|
}
|
if {[llength $rderr] == 0 && [regget rlink::STAT(rbnak) $statrd] != 0} {
|
if {[llength $rderr] == 0 && [regget rlink::STAT(rbnak) $statrd] != 0} {
|
lappend rderr $i $j $nbusy
|
lappend rderr $i $j $nbusy
|
}
|
}
|
}
|
}
|
}
|
}
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
lappend rbusy $wrerr $rderr
|
lappend rbusy $wrerr $rderr
|
#
|
#
|
# probe stat wiring
|
# probe stat wiring
|
#
|
#
|
for {set i 0} { $i < 3 } {incr i} {
|
for {set i 0} { $i < 3 } {incr i} {
|
set valc [regbld rbtest::CNTL [list stat [expr {1 << $i}]]]
|
set valc [regbld rbtest::CNTL [list stat [expr {1 << $i}]]]
|
rlc exec -estatdef $esdval $esdmsk \
|
rlc exec -estatdef $esdval $esdmsk \
|
-wreg te.cntl $valc \
|
-wreg te.cntl $valc \
|
-rreg te.data dummy statrd
|
-rreg te.data dummy statrd
|
lappend rstat [list $i [regget rlink::STAT(stat) $statrd]]
|
lappend rstat [list $i [regget rlink::STAT(stat) $statrd]]
|
}
|
}
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
|
#
|
#
|
# probe attn wiring
|
# probe attn wiring
|
#
|
#
|
rlc exec -attn
|
rlc exec -attn
|
for {set i 0} { $i < 16 } {incr i} {
|
for {set i 0} { $i < 16 } {incr i} {
|
rlc exec -estatdef $esdval $esdmskatt \
|
rlc exec -estatdef $esdval $esdmskatt \
|
-wreg te.attn [expr {1 << $i}] \
|
-wreg te.attn [expr {1 << $i}] \
|
-attn attnpat
|
-attn attnpat
|
lappend rattn [list $i $attnpat]
|
lappend rattn [list $i $attnpat]
|
}
|
}
|
rlc exec -attn
|
rlc exec -attn
|
#
|
#
|
return [list $rbusy $rstat $rattn]
|
return [list $rbusy $rstat $rattn]
|
}
|
}
|
#
|
#
|
# probe_print: print probe results
|
# probe_print: print probe results
|
#
|
#
|
proc probe_print {{plist {}}} {
|
proc probe_print {{plist {}}} {
|
set rval {}
|
set rval {}
|
|
|
if {[llength $plist] == 0} {
|
if {[llength $plist] == 0} {
|
set plist [probe]
|
set plist [probe]
|
}
|
}
|
|
|
set rbusy [lindex $plist 0]
|
set rbusy [lindex $plist 0]
|
set rstat [lindex $plist 1]
|
set rstat [lindex $plist 1]
|
set rattn [lindex $plist 2]
|
set rattn [lindex $plist 2]
|
#
|
#
|
append rval \
|
append rval \
|
"nbusy: write max [lindex $rbusy 0 2] --> WIDTH=[lindex $rbusy 0 0]"
|
"nbusy: write max [lindex $rbusy 0 2] --> WIDTH=[lindex $rbusy 0 0]"
|
append rval \
|
append rval \
|
"\nnbusy: read max [lindex $rbusy 1 2] --> WIDTH=[lindex $rbusy 1 0]"
|
"\nnbusy: read max [lindex $rbusy 1 2] --> WIDTH=[lindex $rbusy 1 0]"
|
#
|
#
|
for {set i 0} { $i < 3 } {incr i} {
|
for {set i 0} { $i < 3 } {incr i} {
|
set rcvpat [lindex $rstat $i 1]
|
set rcvpat [lindex $rstat $i 1]
|
set rcvind [print_bitind $rcvpat]
|
set rcvind [print_bitind $rcvpat]
|
append rval [format "\nstat: te.cntl line %2d --> design %2d %s" \
|
append rval [format "\nstat: te.cntl line %2d --> design %2d %s" \
|
$i $rcvind [pbvi b3 $rcvpat]]
|
$i $rcvind [pbvi b3 $rcvpat]]
|
}
|
}
|
#
|
#
|
for {set i 0} { $i < 16 } {incr i} {
|
for {set i 0} { $i < 16 } {incr i} {
|
set rcvpat [lindex $rattn $i 1]
|
set rcvpat [lindex $rattn $i 1]
|
set rcvind [print_bitind $rcvpat]
|
set rcvind [print_bitind $rcvpat]
|
append rval [format "\nattn: te.attn line %2d --> design %2d %s" \
|
append rval [format "\nattn: te.attn line %2d --> design %2d %s" \
|
$i $rcvind [pbvi b16 $rcvpat]]
|
$i $rcvind [pbvi b16 $rcvpat]]
|
}
|
}
|
return $rval
|
return $rval
|
}
|
}
|
|
|
#
|
#
|
# print_bitind: helper for probe_print:
|
# print_bitind: helper for probe_print:
|
#
|
#
|
proc print_bitind {pat} {
|
proc print_bitind {pat} {
|
for {set i 0} { $i < 16 } {incr i} {
|
for {set i 0} { $i < 16 } {incr i} {
|
if {[expr {$pat & [expr {1 << $i}] }] } { return $i}
|
if {[expr {$pat & [expr {1 << $i}] }] } { return $i}
|
}
|
}
|
return -1
|
return -1
|
}
|
}
|
}
|
}
|
|
|