我有一个接收数组的组件:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.index_pkg.all;
entity update_reg is
port (
index : in integer;
number_data : in array_integer(9 downto 0);
output_number : out integer;
);
end update_reg;
architecture behavior of update_reg is
begin
process1 : process(index, number_data)
begin
output_number <= number_data(index);
end process;
end architecture;
目的是在组件的输出处具有由索引指定的数组元素。我构建了以下tb来测试它的行为:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.index_pkg.all;
entity tb_update_reg is
end tb_update_reg;
architecture rtl of tb_update_reg is
component update_reg is
port (
index : in integer;
number_data : in array_integer(9 downto 0);
output_number : out integer
);
end component;
signal tb_index : integer;
signal tb_number_data : array_integer(9 downto 0);
signal tb_output_number : integer;
begin
fill_process : process(tb_number_data)
begin
for n in 0 to 9 loop
tb_number_data(n) <= 10 - n;
end loop;
end process;
stim_process : process
begin
tb_index <= 6;
wait for 2.0 ns;
tb_index <= 0;
wait for 2.0 ns;
tb_index <= 9;
wait for 2.0 ns;
tb_index <= 4;
wait for 2.0 ns;
tb_index <= 1;
wait for 2.0 ns;
end process;
upd_reg : update_reg
port map(
index => tb_index,
number_data => tb_number_data,
output_number => tb_output_number
);
end architecture;
我添加了一个包,其中包含了数组整数的声明:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package index_pkg is
type array_integer is array (natural range <>) of integer;
end;
我希望数字为4/10/1/6/9。相反,模拟被冻结。我缺少一些方面吗?
如果有人能提供帮助,我将不胜感激。
答案 0 :(得分:1)
您有两个问题:
i)您需要将信号tb_index
初始化为6:
signal tb_index : integer := 6;
在VHDL中,所有过程都在模拟开始时的0时执行。没有这样的初始化,你的设计中的这一行:
output_number <= number_data(index);
在index
信号被此行赋值之前执行:
tb_index <= 6;
因此,在第一个 delta周期上,index
的值是整数的默认值,最左边的值( - 2 ^ 31-1) ,当然超出范围。
ii)您需要stim_process
进程底部的等待声明:
wait for 2.0 ns;
wait;
end process;
在VHDL中,所有进程都在不断循环。因此,stim_process
进程循环回到顶部,因此您的模拟将永远运行。 VHDL中的wait;
表示永远等待,这就是您需要的。
此外,您设计中的这一行还有一个额外的分号:
output_number : out integer;
它应该是:
output_number : out integer