将 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 初始化文件并将其转换为通用内存表示形式。