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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [tools/] [tcl/] [rbmoni/] [util.tcl] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 21 wfjm
# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
2 10 wfjm
#
3 21 wfjm
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4 10 wfjm
#
5
# This program is free software; you may redistribute and/or modify it under
6
# the terms of the GNU General Public License as published by the Free
7
# Software Foundation, either version 2, or at your option any later version.
8
#
9
# This program is distributed in the hope that it will be useful, but
10
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
# for complete details.
13
#
14
#  Revision History:
15
# Date         Rev Version  Comment
16
# 2011-03-27   374   1.0    Initial version
17
# 2011-03-13   369   0.1    First draft
18
#
19
 
20
package provide rbmoni 1.0
21
 
22
package require rutil
23
package require rlink
24
 
25
namespace eval rbmoni {
26
  #
27
  # setup register descriptions for rbd_rbmon
28
  #
29
  regdsc CNTL {go 0}
30
  regdsc ALIM {hilim 15 8} {lolim 7 8}
31
  regdsc ADDR {wrap 15} {addr 10 11 "-"} {laddr 10 9} {waddr 1 2}
32
  #
33
  regdsc DAT3 {flags 15 8 "-"} {ack 15} {busy 14} {err 13} {nak 12} {tout 11} \
34
    {init 9} {we 8} {addr 7 8}
35
  regdsc DAT0 {ndlymsb 15 4} {nbusy 11 12}
36
  #
37
  # 'pseudo register', describes 1st word in return list element of rbmoni::read
38
  # must have same bit sequence as DAT3(flags)
39
  regdsc FLAGS {ack 7} {busy 6} {err 5} {nak 4} {tout 3} {init 1} {we 0}
40
  #
41
  # setup: amap definitions for rbd_rbmon
42
  # 
43
  proc setup {{base 0x00fc}} {
44 21 wfjm
    rlc amap -insert rm.cntl [expr {$base + 0x00}]
45
    rlc amap -insert rm.alim [expr {$base + 0x01}]
46
    rlc amap -insert rm.addr [expr {$base + 0x02}]
47
    rlc amap -insert rm.data [expr {$base + 0x03}]
48 10 wfjm
  }
49
  #
50
  # init: reset rbd_rbmon (stop, reset alim)
51
  # 
52
  proc init {} {
53
    rlc exec \
54
      -wreg rm.cntl 0x0000 \
55
      -wreg rm.alim [regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}] \
56
      -wreg rm.addr 0x0000
57
  }
58
  #
59
  # start: start the rbmon
60
  #
61
  proc start {} {
62
    rlc exec -wreg rm.cntl [regbld rbmoni::CNTL go]
63
  }
64
  #
65
  # stop: stop the rbmon
66
  #
67
  proc stop {} {
68
    rlc exec -wreg rm.cntl 0x0000
69
  }
70
  #
71
  # read: read nent last entries (by default all)
72
  #
73
  proc read {{nent -1}} {
74
    set amax  [regget rbmoni::ADDR(laddr) -1]
75
    if {$nent == -1} { set nent $amax }
76
 
77
    rlc exec -rreg rm.addr raddr
78
 
79
    set laddr [regget rbmoni::ADDR(laddr) $raddr]
80
    set nval  $laddr
81
    if {[regget rbmoni::ADDR(wrap) $raddr]} { set nval $amax }
82
 
83
    if {$nent > $nval} {set nent $nval}
84
    if {$nent == 0} { return {} }
85
 
86 21 wfjm
    set caddr [expr {( $laddr - $nent ) & $amax}]
87 10 wfjm
    rlc exec -wreg rm.addr [regbld rbmoni::ADDR [list laddr $caddr]]
88
 
89
    set rval {}
90
 
91
    while {$nent > 0} {
92 21 wfjm
      set nblk [expr {$nent << 2}]
93 10 wfjm
      if {$nblk > 256} {set nblk 256}
94
      rlc exec -rblk rm.data $nblk rawdat
95
 
96
      foreach {d0 d1 d2 d3} $rawdat {
97
        set eflag  [regget rbmoni::DAT3(flags) $d3]
98
        set eaddr  [regget rbmoni::DAT3(addr)  $d3]
99 21 wfjm
        set edly   [expr {( [regget rbmoni::DAT0(ndlymsb) $d0] << 16 ) | $d1 }]
100 10 wfjm
        set enbusy [regget rbmoni::DAT0(nbusy) $d0]
101
        lappend rval [list $eflag $eaddr $d2 $edly $enbusy]
102
      }
103
 
104 21 wfjm
      set nent [expr {$nent - ( $nblk >> 2 ) }]
105 10 wfjm
    }
106
 
107
    rlc exec -wreg rm.addr $raddr
108
 
109
    return $rval
110
  }
111
  #
112
  # print: print rbmon data (optionally also read them)
113
  #
114
  proc print {{mondat -1}} {
115
 
116
    if {[llength $mondat] == 1} {
117
      set ele [lindex $mondat 0]
118
      if {[llength $ele] == 1} {
119
        set nent [lindex $ele 0]
120
        set mondat [read $nent]
121
      }
122
    }
123
 
124
    set rval {}
125
 
126 21 wfjm
    set eind [expr {1 - [llength $mondat] }]
127 10 wfjm
    append rval " ind  addr       data  delay nbusy     ac bs er na to in we"
128
 
129
    foreach {ele} $mondat {
130
      foreach {eflag eaddr edata edly enbusy} $ele { break }
131
      set fack [regget rbmoni::FLAGS(ack)  $eflag]
132
      set fbsy [regget rbmoni::FLAGS(busy) $eflag]
133
      set ferr [regget rbmoni::FLAGS(err)  $eflag]
134
      set fnak [regget rbmoni::FLAGS(nak)  $eflag]
135
      set fto  [regget rbmoni::FLAGS(tout) $eflag]
136
      set fini [regget rbmoni::FLAGS(init) $eflag]
137
      set fwe  [regget rbmoni::FLAGS(we)   $eflag]
138
      set ename ""
139
      set comment ""
140
      if {$ferr} {append comment " err=1!"}
141
      if {$fini} {
142
        append comment " init"
143
      } else {
144
        if {$fnak} {append comment " nak=1!"}
145
      }
146
      if {$fto}  {append comment " tout=1!"}
147
      if {[rlc amap -testaddr $eaddr]} {set ename [rlc amap -name $eaddr]}
148
      append rval [format \
149
        "\n%4d  %-10s %4.4x %6d  %4d  %2.2x  %d  %d  %d  %d  %d  %d  %d %s" \
150
        $eind $ename $edata $edly $enbusy $eflag \
151
        $fack $fbsy $ferr $fnak $fto $fini $fwe $comment]
152
      incr eind
153
    }
154
 
155
    return $rval
156
  }
157
 
158
  #
159
  # raw_edata: prepare edata lists for raw data reads in tests
160
  #   args is list of {eflag eaddr edata enbusy} sublists
161
 
162
  proc raw_edata {edat emsk args} {
163
    upvar $edat uedat
164
    upvar $emsk uemsk
165
    set uedat {}
166
    set uemsk {}
167
 
168 21 wfjm
    set m0 [expr {0xffff & ~[regget rbmoni::DAT0(nbusy) -1] }]
169 10 wfjm
    set d1 0x0000
170
    set m1 0xffff
171
    set m3 0x0000
172
 
173
    foreach line $args {
174
      foreach {eflags eaddr edata enbusy} $line { break }
175
      set d0 [regbld rbmoni::DAT0 [list nbusy $enbusy]]
176
      if {$edata ne ""} {
177
        set m2 0x0000
178
        set d2 $edata
179
      } else {
180
        set m2 0xffff
181
        set d2 0x0000
182
      }
183
      set d3 [regbld rbmoni::DAT3 [list flags $eflags] [list addr $eaddr]]
184
 
185
      lappend uedat $d0 $d1 $d2 $d3
186
      lappend uemsk $m0 $m1 $m2 $m3
187
    }
188
 
189
    return ""
190
  }
191
 
192
  #
193
  # raw_check: check raw data against expect values prepared by raw_edata
194
  #
195
  proc raw_check {edat emsk} {
196
 
197
    rlc exec -estatdef 0x0 [regbld rlink::STAT {stat -1}] \
198
      -rreg rm.addr -edata [llength $edat] \
199
      -wreg rm.addr 0 \
200
      -rblk rm.data [llength $edat] -edata $edat $emsk \
201
      -rreg rm.addr -edata [llength $edat]
202
    return ""
203
  }
204
 
205
}

powered by: WebSVN 2.1.0

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