Vhdl 将ISim结果复制为字符串/文本
我正在创建一个VHDL项目,并使用ISim预先进行模拟-这一切都很好 然而,我的结果使用定点——尽管Isim可以将其信号表示为一系列基数,但毫不奇怪,定点小数并不在其中 因此,我希望以文本形式获取每个信号的当前值,但“copy”函数只复制实体和信号名称,而不复制字符串值 比如说 我想得到“[0001000000020000…等”的值,但实际上我只得到“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称Vhdl 将ISim结果复制为字符串/文本,vhdl,simulation,fpga,xilinx,xilinx-ise,Vhdl,Simulation,Fpga,Xilinx,Xilinx Ise,我正在创建一个VHDL项目,并使用ISim预先进行模拟-这一切都很好 然而,我的结果使用定点——尽管Isim可以将其信号表示为一系列基数,但毫不奇怪,定点小数并不在其中 因此,我希望以文本形式获取每个信号的当前值,但“copy”函数只复制实体和信号名称,而不复制字符串值 比如说 我想得到“[0001000000020000…等”的值,但实际上我只得到“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称 常识告诉我们,必须有一种简单的方法来实现这一点,但我不知道怎么做!您可
常识告诉我们,必须有一种简单的方法来实现这一点,但我不知道怎么做!您可以在测试台(顶层)中使用VHDL的文件I/O功能,将来自DUT的信号转换为人类可读的字符串,并将其写入标准输出或文件 关于文件I/O的粗略概述。 VHDL有几个用于文件I/O和字符串操作的包和过程/函数
- std.textio
VHDL为
定义了名为string
的访问类型(指针),为文本文件定义了基本文件类型line
用法:text
use std.textio.all;
来自library ieee; use std.textio.all; use ieee.std_logic_1164.all; use ieee.std_logic_textio.all;
的声明:std.textio
-- types type line is access string; type text is file of string; -- STD files file input : text open read_mode is "STD_INPUT"; file output : text open write_mode is "STD_OUTPUT"; -- procedures (some with overloads) read (<lineVar>, <vhdlObji [,<status>]); readline (<fileObj>, <lineVari); write (<lineVar>, <vhdlObj> [,right|left, <width>]); write (<lineVar>, <realObj> [,right|left, <width>, <digits>]); write (<lineVar>, <timeObj> [,right|left, <width>, <unit>]); writeline (<fileObj>, <lineVar>); -- functions endfile (<fileObj>) : boolean
来自ieee.std\u logic\u textio的声明read (<lineVar>, <vhdlObj> [,<status>]); -- binary hread (<lineVar>, <vhdlObj> [,<status>]); -- hexadecimal oread (<lineVar>, <vhdlObj> [,<status>]); -- octal write (<lineVar>, <vhdlObj> [,right|left, <width>]); -- binary hwrite (<lineVar>, <vhdlObj> [,right|left, <width>]); -- hexadecimal owrite (<lineVar>, <vhdlObj> [,right|left, <width>]); -- octal
-- types type line is access string; type text is file of string; -- STD files file input : text open read_mode is "STD_INPUT"; file output : text open write_mode is "STD_OUTPUT"; -- procedures (some with overloads) read (<lineVar>, <vhdlObji [,<status>]); readline (<fileObj>, <lineVari); write (<lineVar>, <vhdlObj> [,right|left, <width>]); write (<lineVar>, <realObj> [,right|left, <width>, <digits>]); write (<lineVar>, <timeObj> [,right|left, <width>, <unit>]); writeline (<fileObj>, <lineVar>); -- functions endfile (<fileObj>) : boolean
read (<lineVar>, <vhdlObj> [,<status>]); -- binary hread (<lineVar>, <vhdlObj> [,<status>]); -- hexadecimal oread (<lineVar>, <vhdlObj> [,<status>]); -- octal write (<lineVar>, <vhdlObj> [,right|left, <width>]); -- binary hwrite (<lineVar>, <vhdlObj> [,right|left, <width>]); -- hexadecimal owrite (<lineVar>, <vhdlObj> [,right|left, <width>]); -- octal
是一个内置函数,表示当前模拟时间。它的格式为,需要时间和精度。信号now
的格式为。此函数将任意大小的mySignal
格式化为十六进制字符串 该文件应包含以下内容:STD\u逻辑向量
最后一个提示======================================== TESTBENCH REPORT ======================================== Time 50 ns Value 0x08 Time 60 ns Value 0x09 Time 70 ns Value 0x0A Time 80 ns Value 0x0B Time 90 ns Value 0x0C ....
过程将这些数据附加到write
字符串。当调用writeline时,缓冲区将写入文件,并且LineBuffer
在该操作后为空LineBuffer
最后,这里是一个关于如何读取RAM/ROM初始化文件并将其转换为通用内存表示的示例。由于运气好,我发现我可以使用命令
将二进制字符串打印到ISim控制台,尽管这只将信号打印为二进制。如果任何人有一个排列,则允许将信号以十六进制打印到控制台,这将是一个理想的答案!它是测试台中的顶级信号吗?您想打印信号的最后状态还是在模拟中的某个时间点?我希望在该时间点打印信号,即信号图旁边显示的值。它是顶级信号.VHDL具有文件I/O功能。因此,您可以将信号数据(由自定义函数格式化)写入标准输出或文件中。例如,每行和时间事件一个值。如果您对此感兴趣,我可以将一个简短的示例汇编成一个答案。@Paebbels听起来不错-我喜欢一个可以使用的快速示例!show value signal\u name