首页 > 解决方案 > VHDL 空文件句柄

问题描述

我有一个程序(仅限测试台,不可综合),它通过 AXIS 接口接收数据并将其写入字节数组。我还想要将接收到的数据写入文件的选项。为此,我添加了一个文件句柄,这样任何使用此过程的测试台都可以声明一个文件句柄并将其传递给该过程,并且接收到的数据将通过文件句柄写入给定文件。

这是程序声明:

    procedure AXI_STREAM_RECEIVER
    ( 
        -- AXI-Stream Parameters
        variable PAYLOAD                : inout p_byte_array;
        constant SLAVE_READY_BEHAVE     : in    t_slave_ready_behave    := always_ready;
        constant READY_GAP_RANGE        : in    natural                 := 20;
        constant VERIFY_TKEEP           : in    boolean                 := false; 
        file     file_handle            : text;
        -- Interface Clock             
        signal   CLK                    : in    std_logic;
        -- Master/Slave I/O            
        signal   axis_tdata             : in    std_logic_vector;
        signal   axis_tkeep             : in    std_logic_vector;
        signal   axis_tvalid            : in    std_logic;
        signal   axis_tlast             : in    std_logic;
        signal   axis_tready            : out   std_logic;
        -- Misc.  
        constant VERIFY_TLAST           : in    boolean        := true;    
        constant VERBOSE                : in    boolean        := c_verbosity_default;
        constant DEBUG_SEVERITY_LEVEL   : in    severity_level := c_axil_debug_severity_level;
        constant DEBUG_PAYLOAD_CONTENT  : in    boolean        := false   
    ); 

因为我希望写入文件是可选的,所以我希望能够在不需要写入文件时提供一个“空”文件句柄作为默认值。我尝试分配默认值,但我得到:

FILE interface declaration must not contain a default expression

然后我尝试在实例化时将其分配给“null”:

Illegal use of NULL literal.

但是,如果我没有默认并且没有分配它,我会得到:

No feasible entries for subprogram "AXI_STREAM_RECEIVER"

有人知道是否可以传入某种空文件描述符?

标签: vhdl

解决方案


您可以使用 VHDL-2008 使用带有泛型的包来实现这一点。文件句柄和过程在包头中分别声明。这是一个例子:

library ieee;
use ieee.std_logic_1164.all;

library std;
use std.textio.all;

package gen_pkg is

  generic (
    PRINT_TO_FILE : boolean;
    FILE_NAME     : string;
    FILE_MODE     : file_open_kind := write_mode
  );

  file outfile : text;

  procedure TEST_PROCEDURE;

end gen_pkg;

package body gen_pkg is

  procedure TEST_PROCEDURE is
    variable outline : line;
  begin

    write(outline,string'("TEST STRING"));

    if PRINT_TO_FILE then
      file_open(outfile, FILE_NAME, FILE_MODE);
      writeline(outfile, outline);
      file_close(outfile);
    end if;

  end TEST_PROCEDURE;

end gen_pkg;

我只展示了一个正在编写的字符串,但是根据您所需的数据类型使用包write中的任何重载变体,或者您可以使用支持所有类型转换的 VHDL-2008 函数。textioto_string

然后在您的测试台中,使用实例化名称创建包的新实例化并访问过程/函数等:

library ieee;
use ieee.std_logic_1164.all;

library std;
use std.textio.all;

entity tb is
end tb;

architecture arch of tb is

  package gp is new work.gen_pkg
  generic map (
    PRINT_TO_FILE => TRUE,
    FILE_NAME     => "./test_file.txt",
    FILE_MODE     => append_mode
  );

begin

  process begin
    for i in 0 to 4 loop
      gp.TEST_PROCEDURE;
    end loop;
    wait;
  end process;

end arch;

请注意,如果您多次写入文件,如本例所示,文件模式必须为append_mode. 在中,每次调用write_mode该文件都会被覆盖。file_open如果您每次模拟只写入一次文件,那write_mode就没问题了。您还可以在多个位置有多个新的通用包实例化,全部写入同一个文件,以及它们都append_mode用于文件模式。

这是使用 Aldec Riviera Pro 2017.02 的 EDA Playground 设置的工作示例。需要登录才能运行它。您必须在浏览器中禁用弹出窗口阻止程序才能下载输出文件进行检查。字符串“ TEST STRING”应该被写入文件 5 次。


推荐阅读