VHDL函数在模拟中的行为不同于在模拟中的行为

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

在VHDL测试台中,我有一个解析csv文件以初始化测试阵列的函数

在精化阶段运行函数以设置常量值时,函数的行为与在模拟中使用相同函数时不同(例如,在重置期间初始化信号)

功能代码为:

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。我强烈建议使用不同的工具版本,以查看该问题是否仍然存在。