原创
【博客大赛】目前在使用TCL创建Virtual JTAG平台时待解决的几个问题
工具命令行语言(TCL)在测试领域的应用应该还是比较广泛的,目前感觉它的几个特点或者好处是指令简单,不需要编译器,程序即为可执行状态,还有就是在进行GUI设计的时候非常简单,例如本人创建的VJ平台就很简单直观,可参加我之前的博客里的截图。
由于本人不是十分精通tcl,所以在进行平台更进一步创建的时候还是遇到几个目前无法解决的问题,所以想借博客大赛的人气来求助。
第一个问题是我需要在调试的时候把经VJ平台从FPGA里读来数据存储在一个文件里,我可以存储成文本格式,但是我希望存储成纯二进制的格式,目前不知道如何操作。存成纯二进制值格式的好处就是省硬盘空间,当数据比较少的时候无所谓,但是当数据量很庞大的时候就就可以节约不少的空间。由于tcl一切都是基于字符地操作,还未摸索出剔除所有冗余信息的存储方式。
图1 纯二进制文件存储格式
图2 本人目前存储数据格式
图2的数据存储格式其实就是一般的文本文件格式,每一行存放一个32bit的数据,这样在进行离线处理的时候也很方便。而图1的格式就是纯二进制存储格式,节约空间,文件中没有任何冗余信息。这个有点像altera的不同配置文件格式一样,sof和pof文件就很大,而rbf文件就很小,因为其就是去除了很多多余的信息。
第二个问题是tcl在写文件时候似乎有block或者nonblock模式的区别,也即先把数据写入到buffer里,等buffer满了以后才一次性将buffer里的数据转移到文件里,这个问题可以通过在写命令后加一个flush命令解决。但是在读取文件里的数据进行分析的时候,似乎也有类似的问题,就不知道如何解决,是不是也有类似flush这样的命令呢?比如我有个文件里存了800万个数据,需要读出来进行2-D map处理,但是tcl程序写完执行的时候报告内存不足,或者呈现死机状态,只能在修改程序,即在处理到10万个左右数据后break出来。下面是处理程序
;###下述代码读取二进制文件,获取PPU参数
set cnt 0
set chan [open "lg5mm.dat" r]
fconfigure $chan -translation binary
while {1} {
set data_read [read $chan 4];##一次读4个字节,即32bit,在循环体中,该命令似乎可以自动连续往后读。
binary scan $data_read "H*" tmp0;##将这4个字节转换成16进制数据
set m_val [get_m $tmp0]
set x_val [get_x $tmp0]
set y_val [get_y $tmp0]
pain_cross_star $m_val $x_val $y_val
;##flush $chan
;##if {[eof $chan]} {;###判断是否到文件末尾,由于lg5mm.dat文件太大,写入文本文件时间长,有时会导致内存不足。
;## break
;##}
;###下列代码是部分转换
incr cnt
if {$cnt > 100000} {
break
close $chan
}
}
注意在tcl里“;”和“#”都是注释标志,上述代码里不能通过判断文件末尾来结束循环,原因注释里有,只能通过计数到10万左右break出来。这段代码生成的2D-map图如图3所示
文章评论(0条评论)
登录后参与讨论