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

Vhdl 将ISim结果复制为字符串/文本,vhdl,simulation,fpga,xilinx,xilinx-ise,Vhdl,Simulation,Fpga,Xilinx,Xilinx Ise,我正在创建一个VHDL项目,并使用ISim预先进行模拟-这一切都很好 然而,我的结果使用定点——尽管Isim可以将其信号表示为一系列基数,但毫不奇怪,定点小数并不在其中 因此,我希望以文本形式获取每个信号的当前值,但“copy”函数只复制实体和信号名称,而不复制字符串值 比如说 我想得到“[0001000000020000…等”的值,但实际上我只得到“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称 常识告诉我们,必须有一种简单的方法来实现这一点,但我不知道怎么做!您可

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

然而,我的结果使用定点——尽管Isim可以将其信号表示为一系列基数,但毫不奇怪,定点小数并不在其中

因此,我希望以文本形式获取每个信号的当前值,但“copy”函数只复制实体和信号名称,而不复制字符串值

比如说

我想得到“[0001000000020000…等”的值,但实际上我只得到“/fixedpointtb/UUT/s1_fcs[0]”的值,即实体名称


常识告诉我们,必须有一种简单的方法来实现这一点,但我不知道怎么做!

您可以在测试台(顶层)中使用VHDL的文件I/O功能,将来自DUT的信号转换为人类可读的字符串,并将其写入标准输出或文件

关于文件I/O的粗略概述。

VHDL有几个用于文件I/O和字符串操作的包和过程/函数

  • std.textio
    VHDL为
    string
    定义了名为
    line
    的访问类型(指针),为文本文件定义了基本文件类型
    text

    用法:

    use std.textio.all;
    
    library ieee;
    use std.textio.all;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_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
    
    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
    
    来自ieee.std\u logic\u 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
    
    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
    
    now
    是一个内置函数,表示当前模拟时间。它的格式为,需要时间和精度。信号
    mySignal
    的格式为。此函数将任意大小的
    STD\u逻辑向量
    格式化为十六进制字符串

    该文件应包含以下内容:

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

    由于运气好,我发现我可以使用命令
    show value signal\u name
    将二进制字符串打印到ISim控制台,尽管这只将信号打印为二进制。如果任何人有一个排列,则允许将信号以十六进制打印到控制台,这将是一个理想的答案!它是测试台中的顶级信号吗?您想打印信号的最后状态还是在模拟中的某个时间点?我希望在该时间点打印信号,即信号图旁边显示的值。它是顶级信号.VHDL具有文件I/O功能。因此,您可以将信号数据(由自定义函数格式化)写入标准输出或文件中。例如,每行和时间事件一个值。如果您对此感兴趣,我可以将一个简短的示例汇编成一个答案。@Paebbels听起来不错-我喜欢一个可以使用的快速示例!