将ISim结果复制为字符串/文本

时间:2016-03-05 18:12:00

标签: vhdl simulation fpga xilinx xilinx-ise

我正在创建一个VHDL项目,并使用ISim预先模拟 - 这一切都很好。

然而,我的结果使用了固定点 - 虽然Isim可以将其信号表示为一系列基数,但不出所料,定点小数不是其中之一。

因此,我希望将每个信号的当前值作为文本,但是" copy" function仅复制实体和信号名称,而不复制字符串值。

例如

enter image description here

我想得到" [00010000,00020000 ......等等]的值,但实际上我只得到" / fixedpointtb / UUT / s1_fcs [0]"的值。即实体名称。

常识说必须有一种简单的方法可以做到这一点,但我不知道怎么做!

1 个答案:

答案 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