将 ISim 结果复制为 strings/text
Copying ISim results as strings/text
我正在创建一个 VHDL 项目,并使用 ISim 预先进行模拟 - 这一切都很好。
然而,我的结果使用定点 - 尽管 Isim 可以将其信号表示为一系列基数,不出所料,定点小数不是其中之一。
因此我想获取每个信号的当前值作为文本,但 "copy" 函数只复制实体和信号名称,而不是字符串值。
例如
我想获取“[00010000、00020000...等等] 的值,但实际上我只获取了“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称。
常识告诉我们一定有一种简单的方法可以做到这一点,但我不知道怎么做!
您可以在测试平台(顶层)中使用 VHDL 的文件 I/O 功能将来自 DUT 的信号转换为人类可读的字符串,并将其写入 STDOUT 或文件。
文件 I/O.
的粗略概述
VHDL 有几个包和 procedures/functions 用于文件 I/O 和字符串操作。
std.textio
VHDL 为 string
定义了一个名为 line
的访问类型(指针),为文本文件定义了一个基本文件类型 text
。
用法:
use std.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_logic_textio
此包声明了更多程序来格式化 std_logic
值。
用法:
library ieee;
use std.textio.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_textio.all;
来自 ieee.std_logic_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
来源:VHDL Kompakt(汉堡大学的德语 VHDL 书籍)
用法示例
以下示例将 mySignal
的值写入日志文件并报告时间。
signal mySignal : STD_LOGIC_VECTOR(7 downto 0);
-- ....
process
file LogFile : TEXT open WRITE_MODE is "logfile.log";
variable LineBuffer : LINE;
begin
write(LineBuffer, ( STRING'("========================================")));
write(LineBuffer, (CR & STRING'("TESTBENCH REPORT")));
write(LineBuffer, (CR & STRING'("========================================")));
writeline(LogFile, LineBuffer);
wait until mySignal /= x"00";
wait until rising_edge(Clock);
for i in 0 to 7 loop
wait until rising_edge(Clock);
write(LineBuffer, "Time " & to_string(now, 1) & " Value 0x" & raw_format_slv_hex(mySignal));
writeline(LogFile, LineBuffer);
end loop;
end process;
now
是内置函数,代表当前的仿真时间。它由 to_string
, which expects a time and a precision. The signal mySignal
is formatted by raw_format_slv_hex
格式化。此函数将任意大小的 STD_LOGIC_VECTOR
格式化为十六进制字符串。
文件应该有这样的内容:
========================================
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
程序将数据附加到 LineBuffer
字符串。当您调用 writeline 时,缓冲区被写入文件,并且 LineBuffer
在该操作之后为空。
最后,example snippet 介绍了如何读取 RAM/ROM 初始化文件并将其转换为通用内存表示形式。
我正在创建一个 VHDL 项目,并使用 ISim 预先进行模拟 - 这一切都很好。
然而,我的结果使用定点 - 尽管 Isim 可以将其信号表示为一系列基数,不出所料,定点小数不是其中之一。
因此我想获取每个信号的当前值作为文本,但 "copy" 函数只复制实体和信号名称,而不是字符串值。
例如
我想获取“[00010000、00020000...等等] 的值,但实际上我只获取了“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称。
常识告诉我们一定有一种简单的方法可以做到这一点,但我不知道怎么做!
您可以在测试平台(顶层)中使用 VHDL 的文件 I/O 功能将来自 DUT 的信号转换为人类可读的字符串,并将其写入 STDOUT 或文件。
文件 I/O.
的粗略概述VHDL 有几个包和 procedures/functions 用于文件 I/O 和字符串操作。
std.textio
VHDL 为string
定义了一个名为line
的访问类型(指针),为文本文件定义了一个基本文件类型text
。用法:
use std.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_logic_textio
此包声明了更多程序来格式化std_logic
值。用法:
library ieee; use std.textio.all; use ieee.std_logic_1164.all; use ieee.std_logic_textio.all;
来自
ieee.std_logic_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
来源:VHDL Kompakt(汉堡大学的德语 VHDL 书籍)
用法示例
以下示例将 mySignal
的值写入日志文件并报告时间。
signal mySignal : STD_LOGIC_VECTOR(7 downto 0);
-- ....
process
file LogFile : TEXT open WRITE_MODE is "logfile.log";
variable LineBuffer : LINE;
begin
write(LineBuffer, ( STRING'("========================================")));
write(LineBuffer, (CR & STRING'("TESTBENCH REPORT")));
write(LineBuffer, (CR & STRING'("========================================")));
writeline(LogFile, LineBuffer);
wait until mySignal /= x"00";
wait until rising_edge(Clock);
for i in 0 to 7 loop
wait until rising_edge(Clock);
write(LineBuffer, "Time " & to_string(now, 1) & " Value 0x" & raw_format_slv_hex(mySignal));
writeline(LogFile, LineBuffer);
end loop;
end process;
now
是内置函数,代表当前的仿真时间。它由 to_string
, which expects a time and a precision. The signal mySignal
is formatted by raw_format_slv_hex
格式化。此函数将任意大小的 STD_LOGIC_VECTOR
格式化为十六进制字符串。
文件应该有这样的内容:
========================================
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
程序将数据附加到 LineBuffer
字符串。当您调用 writeline 时,缓冲区被写入文件,并且 LineBuffer
在该操作之后为空。
最后,example snippet 介绍了如何读取 RAM/ROM 初始化文件并将其转换为通用内存表示形式。