【问题标题】:Copying ISim results as strings/text将 ISim 结果复制为字符串/文本
【发布时间】:2016-06-19 11:21:50
【问题描述】:

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

但是,我的结果使用定点 - 尽管 Isim 可以将其信号表示为一个基数范围,但不出所料,定点小数不是其中之一。

因此我想将每个信号的当前值作为文本获取,但“复制”函数只复制实体和信号名称,而不是字符串值。

例如

我想获取“[00010000, 00020000...etc] 的值,但实际上我只是获取了”/fixedpointtb/UUT/s1_fcs[0]” 的值,即实体名称。

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

【问题讨论】:

  • 纯属运气,我发现我可以使用命令show value signal_name 将二进制字符串打印到 ISim 控制台 - 尽管这仅将信号打印为二进制。如果有人有允许将信号作为十六进制打印到控制台的排列,那将是一个理想的答案!
  • 是测试台中的顶级信号吗?您想打印信号的最后状态还是在仿真中的某个时间点打印?
  • 我希望及时打印该实例的信号,即信号图旁边显示的值。这是一个顶级信号。
  • VHDL 具有文件 I/O 功能。因此,您可以将信号数据(由自定义函数格式化)写入 STDOUT 或写入文件。例如。每个行和时间事件一个值。如果您对此感兴趣,我可以将一个简短的示例组合成一个答案。
  • @Paebbels 听起来很棒 - 我想要一个我可以使用的简单示例!

标签: vhdl simulation fpga xilinx xilinx-ise


【解决方案1】:

您可以在测试台(顶层)中使用 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 初始化文件并将其转换为通用内存表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2011-07-11
    • 1970-01-01
    • 2011-07-04
    • 2020-09-27
    相关资源
    最近更新 更多