您可以在测试台(顶层)中使用 VHDL 的文件 I/O 功能将来自 DUT 的信号转换为人类可读的字符串,并将其写入 STDOUT 或文件中。
文件 I/O 的粗略概述。
VHDL 有几个用于文件 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 格式化,它需要时间和精度。信号mySignal 被格式化为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 初始化文件并将其转换为通用内存表示。