更改记录字段的 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 字段),使其与 ctrl
或 info
条记录。
在我的代码中的某些时候,我这样使用函数:
nxt_src_out_arr <= func_dp_stream_arr_combine_data_info_ctrl(snk_in_arr, out_sosi, out_sosi);
它完全弄乱了我的 re 和 im 字段,请看这里(抱歉有点模糊):
snk_in_arr
和 nxt_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_arr
和 snk_in_arr
现在通过相关函数在 运行 之后匹配:
谢谢大家,我会用 Vivado 记录这个问题,但我很难这样做。我还多次登录并填写了一份调查表,试图进入社区论坛。当我终于到达那里时,
选择 'Vivado' 作为我的问题主题时出现错误。希望他们能在这里找到这个问题。
我在这上面花了太多时间,完全搞糊涂了。我有一个记录类型:
--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 字段),使其与 ctrl
或 info
条记录。
在我的代码中的某些时候,我这样使用函数:
nxt_src_out_arr <= func_dp_stream_arr_combine_data_info_ctrl(snk_in_arr, out_sosi, out_sosi);
它完全弄乱了我的 re 和 im 字段,请看这里(抱歉有点模糊):
snk_in_arr
和 nxt_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_arr
和 snk_in_arr
现在通过相关函数在 运行 之后匹配:
谢谢大家,我会用 Vivado 记录这个问题,但我很难这样做。我还多次登录并填写了一份调查表,试图进入社区论坛。当我终于到达那里时, 选择 'Vivado' 作为我的问题主题时出现错误。希望他们能在这里找到这个问题。