我正在创建一个VHDL项目,并使用ISim预先模拟 - 这一切都很好。
然而,我的结果使用了固定点 - 虽然Isim可以将其信号表示为一系列基数,但不出所料,定点小数不是其中之一。
因此,我希望将每个信号的当前值作为文本,但是" copy" function仅复制实体和信号名称,而不复制字符串值。
例如
我想得到" [00010000,00020000 ......等等]的值,但实际上我只得到" / fixedpointtb / UUT / s1_fcs [0]"的值。即实体名称。
常识说必须有一种简单的方法可以做到这一点,但我不知道怎么做!
答案 0 :(得分:1)
您可以在测试平台(顶级)中使用VHDL的文件I / O功能,将来自DUT的信号转换为人类可读的字符串,并将其写入STDOUT或文件。
文件I / O的粗略概述。
VHDL有多个用于文件I / O和字符串操作的包和过程/函数。
<强> std.textio 强>
VHDL为line
定义了一个名为string
的访问类型(一个指针),为文本文件定义了一个基本文件类型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
为空。
最后,这里有一个关于如何读取RAM / ROM初始化文件并将其转换为通用内存表示的example snippet。