更改记录字段的 VHDL 函数会破坏 Vivado 仿真中未触及的字段

VHDL function that alters record fields disrupts untouched fields in Vivado Simulation

我在这上面花了太多时间,完全搞糊涂了。我有一个记录类型:

--t_dp_sosi record
TYPE t_fft_sosi_out IS RECORD  -- Source Out or Sink In
sync     : STD_LOGIC;   
bsn      : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);      -- ctrl
re       : STD_LOGIC_VECTOR(c_fft_out_dat_w-1 DOWNTO 0);            -- data
im       : STD_LOGIC_VECTOR(c_fft_out_dat_w-1 DOWNTO 0);            -- data
valid    : STD_LOGIC;                                           -- ctrl
sop      : STD_LOGIC;                                           -- ctrl
eop      : STD_LOGIC;                                           -- ctrl
empty    : STD_LOGIC_VECTOR(c_dp_stream_empty_w-1 DOWNTO 0);    -- info at eop
channel  : STD_LOGIC_VECTOR(c_dp_stream_channel_w-1 DOWNTO 0);  -- info at sop
err      : STD_LOGIC_VECTOR(c_dp_stream_error_w-1 DOWNTO 0);    -- info at eop (name field 'err' to avoid the 'error' keyword)
END RECORD;

并将其创建为数组类型: TYPE t_fft_sosi_arr_out IS ARRAY (INTEGER RANGE <>) OF t_fft_sosi_out;

用于定义类型中字段范围的所有常量都在同一文件中预先定义。这种类型作为接口在我的代码中无处不在,并且运行良好。

现在我有了这个功能:

FUNCTION func_dp_stream_arr_combine_data_info_ctrl(dp : t_fft_sosi_arr_out; info, ctrl : t_fft_sosi_out) RETURN t_fft_sosi_arr_out IS
VARIABLE v_dp : t_fft_sosi_arr_out(dp'RANGE) := dp;       -- hold sosi data
BEGIN
FOR I IN dp'RANGE LOOP                          -- set sosi info
  v_dp(I).bsn     := info.bsn;      
  v_dp(I).channel := info.channel;  
  v_dp(I).empty   := info.empty;    
  v_dp(I).err     := info.err;      
  -- set sosi ctrl
  v_dp(I).valid := ctrl.valid;
  v_dp(I).sop   := ctrl.sop;
  v_dp(I).eop   := ctrl.eop;
  v_dp(I).sync  := ctrl.sync;
END LOOP;
RETURN v_dp;
END func_dp_stream_arr_combine_data_info_ctrl;

意味着 获取记录数组并更改每个记录的某些字段(减去 re 和 im 字段),使其与 ctrlinfo 条记录。

在我的代码中的某些时候,我这样使用函数:

nxt_src_out_arr <= func_dp_stream_arr_combine_data_info_ctrl(snk_in_arr, out_sosi, out_sosi);

它完全弄乱了我的 re 和 im 字段,请看这里(抱歉有点模糊):

snk_in_arrnxt_src_out_arr 都是```t_fft_sosi_arr_out(g_nof_streams-1 DOWNTO 0);`` 数组,其中 g_nof_streams 是定义的泛型。如果我不通过这样的功能:

nxt_src_out_arr <= snk_in_arr;

然后 re 和 im 字段匹配,一切正常:

我 运行 在 Windows 10 上使用 Vivado 2020.2。 我发现 Vivado 2020.1 不会出现此问题(在 Mint 或 Windows 10 上)。

提前致谢。

我发现这似乎是此问题和提到的问题的版本问题 here

如您所见,在 Vivado 2020.1(下)中,nxt_src_out_arrsnk_in_arr 现在通过相关函数在 运行 之后匹配:

谢谢大家,我会用 Vivado 记录这个问题,但我很难这样做。我还多次登录并填写了一份调查表,试图进入社区论坛。当我终于到达那里时, 选择 'Vivado' 作为我的问题主题时出现错误。希望他们能在这里找到这个问题。