vhdl - 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-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 函数。textio
to_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 次。
推荐阅读
- python - 使用 struct.pack 在 Python 中打包/解包一个 3 字节整数
- javascript - 单击按钮后显示连续数字的问题
- c# - SignTool 错误:未找到满足所有给定条件的证书。- 如何建造
- python - How to draw on a Fourier transform numpy array Opencv
- python - 从 csv 文件读取变量时 Subprocess.Popen() 不起作用
- javascript - 在 React 中创建标题
- database-administration - 当我运行维护计划时,日志查看器中显示的用户“sa”登录失败
- django - Django 视图中的动态模板
- ctypes - Ctypes LPSTR 函数参数
- c++ - 测量 C/C++ 代码块中分配的内存