VHDL函数在模拟中的行为不同于在模拟中的行为
在VHDL测试台中,我有一个解析csv文件以初始化测试阵列的函数 在精化阶段运行函数以设置常量值时,函数的行为与在模拟中使用相同函数时不同(例如,在重置期间初始化信号) 功能代码为:VHDL函数在模拟中的行为不同于在模拟中的行为,vhdl,xilinx,vivado,Vhdl,Xilinx,Vivado,在VHDL测试台中,我有一个解析csv文件以初始化测试阵列的函数 在精化阶段运行函数以设置常量值时,函数的行为与在模拟中使用相同函数时不同(例如,在重置期间初始化信号) 功能代码为: constant cn_DATA_WIDTH : natural := 10; constant cn_DATA_DEPTH : natural := 400; type tav_data_array
constant cn_DATA_WIDTH : natural := 10;
constant cn_DATA_DEPTH : natural := 400;
type tav_data_array is array (0 to cn_DATA_DEPTH - 1) of std_logic_vector(cn_DATA_WIDTH - 1 downto 0);
function f_init_data_from_file (
s_file_path : in string;
i_column_index : in integer := 0
) return tav_data_array is
-- file parsing
file f_data_file_buf : text is in s_file_path;
variable vl_data_file_line : line;
variable vi_data_entry : integer;
variable vc_comma : character;
variable vb_good_num : boolean;
-- destination
variable vav_data_array : tav_data_array;
begin
-- Skip first line that contains header
readline (f_data_file_buf, vl_data_file_line);
for line_index in vav_data_array'range loop
readline (f_data_file_buf, vl_data_file_line);
read (vl_data_file_line, vi_data_entry, vb_good_num);
assert vb_good_num
report "Failed reading file : " & s_file_path
& ", at line = " & integer'image(line_index)
& ", at column = 0"
severity failure;
for column_index in 1 to i_column_index loop
read(vl_data_file_line, vc_comma);
read(vl_data_file_line, vi_data_entry, vb_good_num);
assert vb_good_num
report "Failed reading file : " & s_file_path
& ", at line = " & integer'image(line_index)
& ", at column = " & integer'image(column_index)
severity failure;
end loop;
vav_data_array(line_index) := std_logic_vector(to_unsigned(vi_data_entry, cn_DATA_WIDTH));
end loop;
return vav_data_array;
end function;
细化中的函数使用:
constant cav_data : tav_data_array :=
f_init_data_from_file (
s_file_path => "my_path" ,
i_column_index => 3
);
signal sav_data : tav_data_array;
-- ...
process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
sav_data <=
f_init_data_from_file (
s_file_path => "my_path" ,
i_column_index => 3
);
else
-- ...
end if;
end if;
end process;
结果:测试数组未使用预期数据初始化。用于初始化的数据是第0列,而不是第3列
细化中的函数使用:
constant cav_data : tav_data_array :=
f_init_data_from_file (
s_file_path => "my_path" ,
i_column_index => 3
);
signal sav_data : tav_data_array;
-- ...
process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
sav_data <=
f_init_data_from_file (
s_file_path => "my_path" ,
i_column_index => 3
);
else
-- ...
end if;
end if;
end process;
您是否尝试过更新版本的Vivado?没有一个完整的,很难说更多。假设文件肯定是相同的,并且肯定是从相同的路径读取的(Vivado使用路径有点奇怪),那么我只能假设工具错误。2018.2已经2岁了。最新版本是2020.1(2020.2可能很快会下降),为您的问题创建了一个最小、完整且可验证的示例。您使用其他工具的读者可能会发现该函数不纯净(添加于-1993年,文件声明使用-1987语法),并且该问题无法用更新版本的VHDL工具复制(子程序中声明的文件有一个隐式文件\u CLOSE)。请尝试使用修订版-1993或更新版本的工具,以符合文件声明,或使用两个不同的my_path副本。文件操作的语义在-1987中定义不完整。请提供一个完整的MCVE。我目前只安装了2018.2 Vivado,因此无法使用其他版本对其进行测试。file是在精化和模拟中发现的,所以我不认为这是一个路径问题。因为我有一个解决方法,答案对我来说并不重要,但我想验证一下,我有一些明显的遗漏,如果有解决方案,也会对社区有益。@user1155120我创建了一个完整的MCVE。我有一些关于与文件缓冲区相关的函数不纯净。但是,使函数不纯净对错误没有任何影响。在我在模拟中添加解析文件的解决方法之前,该文件一直在单个位置使用。Vivado 2018.2默认启用VHDL-2008支持。我没有尝试使用限制在-1993或-1987的工具。而2018.2具有VHDL2008支持,除非文件被指定为VHDL 1993,否则它将默认为VHDL 1993。我强烈建议使用不同的工具版本,以查看问题是否仍然存在。您是否尝试使用较新版本的Vivado?没有完整的、很难说的更多内容。假设文件肯定是相同的,并且肯定是从相同的路径读取的(Vivado在路径方面有点奇怪)那么我只能假设工具错误。2018.2已经有2年了。最新版本是2020.1(2020.2可能很快就会下降),为您的问题创建了一个最小、完整且可验证的示例。您使用其他工具的读者可能会发现该函数不纯净(在-1993年添加,文件声明使用-1987语法)并且这个问题不能用更新版本的VHDL工具复制(子程序中声明的文件有一个隐式文件关闭)。请尝试使用修订版-1993或更新版本的工具,以符合文件声明,或使用两个不同的my_path副本。文件操作的语义在-1987中定义不完整。请提供一个完整的MCVE。我目前只安装了2018.2 Vivado,因此无法使用其他版本对其进行测试。file是在精化和模拟中发现的,所以我不认为这是一个路径问题。因为我有一个解决方法,答案对我来说并不重要,但我想验证一下,我有一些明显的遗漏,如果有解决方案,也会对社区有益。@user1155120我创建了一个完整的MCVE。我有一些关于与文件缓冲区相关的函数不纯净。但是,使函数不纯净对错误没有任何影响。在我在模拟中添加解析文件的解决方法之前,该文件一直在单个位置使用。Vivado 2018.2默认启用VHDL-2008支持。我没有尝试使用限制在-1993或-1987的工具。而2018.2具有VHDL2008支持,除非文件被指定为VHDL 1993,否则它将默认为VHDL 1993。我强烈建议使用不同的工具版本,以查看该问题是否仍然存在。