a2o/rel/fpga/waimea.tcl

180 lines
4.2 KiB
Tcl

# waimea board/core command interface
####################################################################
# system commands
set version 1 ;#coremark_1
proc reset {} {
global version
if {$version == 1} {
set filter "CELL_NAME=~\"*vio*\""
set probe "vio_0_probe_out1"
} else {
set filter "CELL_NAME=~\"*marvio*\""
set probe "vio_0_probe_out1"
}
set obj_vio [get_hw_vios -of_objects [get_hw_devices xcvu3p_0] -filter $filter]
set rst [get_hw_probes a2x_axi_bd_i/vio_0_probe_out1 -of_objects $obj_vio]
startgroup
set_property OUTPUT_VALUE 0 $rst
commit_hw_vio $rst
endgroup
startgroup
set_property OUTPUT_VALUE 1 $rst
commit_hw_vio $rst
endgroup
puts "[datetime] Reset"
}
proc threadstop {{val F}} {
global version
if {$version == 1} {
set filter "CELL_NAME=~\"*vio*\""
set probe "vio_0_probe_out0"
} else {
set filter "CELL_NAME=~\"*marvio*\""
set probe "marvio_probe_out0"
}
set obj_vio [get_hw_vios -of_objects [get_hw_devices xcvu3p_0] -filter $filter]
set thread_stop [get_hw_probes a2x_axi_bd_i/$probe -of_objects $obj_vio]
set_property OUTPUT_VALUE $val $thread_stop
commit_hw_vio $thread_stop
puts "[datetime] ThreadStop=$val"
}
####################################################################
# ila commands
proc ila_arm {{n 0}} {
set filter "CELL_NAME=~\"u_ila_$n\""
set res [run_hw_ila [get_hw_ilas -of_objects [get_hw_devices xcvu3p_0] -filter $filter]]
puts "[datetime] ILA$n armed."
}
proc ila_wait {{n 0}} {
set filter "CELL_NAME=~\"u_ila_$n\""
puts "[datetime] ILA$n waiting..."
set res [wait_on_hw_ila [get_hw_ilas -of_objects [get_hw_devices xcvu3p_0] -filter $filter]]
display_hw_ila_data [upload_hw_ila_data [get_hw_ilas -of_objects [get_hw_devices xcvu3p_0] -filter $filter]]
puts "[datetime] ILA$n triggered."
}
####################################################################
# axi slave commands
proc raxi {addr {len 8} {dev 0} {width 8}} {
if {$dev == 0} {
set dev [get_hw_axis hw_axi_1]
}
create_hw_axi_txn -f raxi_txn $dev -address $addr -len $len -type read
run_hw_axi -quiet raxi_txn
set res [report_hw_axi_txn -w $width raxi_txn]
return $res
}
proc waxi {addr data {len 8} {dev 0}} {
if {$dev == 0} {
set dev [get_hw_axis hw_axi_1]
}
create_hw_axi_txn -f waxi_txn $dev -address $addr -len $len -type write -data $data
run_hw_axi -quiet waxi_txn
set res [report_hw_axi_txn waxi_txn]
return $res
}
proc waxiq {addr data {len 8} {dev 0}} {
set res [waxi $addr $data $len $dev]
}
proc testwrites {addr xfers} {
set start [datetime]
for {set i 0} {$i < $xfers} {incr i} {
waxi $addr 00000000_11111111_22222222_33333333_44444444_55555555_66666666_77777777
}
set end [datetime]
puts "Finished $xfers 32B writes."
puts "Start: $start"
puts " End: $end"
}
proc testwrites_128B {addr xfers} {
set start [datetime]
for {set i 0} {$i < $xfers} {incr i} {
waxi $addr {
00000000 00000001 00000002 00000003 00000004 00000005 00000006 00000007
00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F
00000010 00000011 00000012 00000013 00000014 00000015 00000006 00000017
00000018 00000019 0000001A 0000001B 0000001C 0000001D 0000000E 0000001F
} 32
}
set end [datetime]
puts "Finished $xfers 122B writes."
puts "Start: $start"
puts " End: $end"
}
proc map {lambda list} {
set res {}
foreach i $list {
lappend res [apply $lambda $i]
}
return $res
}
proc bytereverse {x} {
set res ""
for {set i 0} {$i < [string length $x]} {incr i 2} {
set res "[string range $x $i [expr $i+1]]$res"
}
return $res
}
proc ascii {start {len 32} {dev 0}} {
set w 128
set res ""
set count [expr ($len-1)/$w + 1]
set ptr $start
for {set i 0} {$i < $count} {incr i} {
set mem [raxi $ptr [expr $w/4] $dev $w]
set ptr [format %x [expr [expr 0x$ptr] + $w]]
# split and remove addr
set tokens [regexp -all -inline {\S+} $mem]
set tokens [lrange $tokens 1 end]
# bytereverse and ascii
set tokens [map {x {return [bytereverse $x]}} $tokens]
set bytes [join $tokens {}]
set chars [binary format H* $bytes]
set res "$res$chars"
}
return $res
}