Vhdl vivado上的模拟错误:检测到致命的运行时错误。模拟无法继续

Vhdl vivado上的模拟错误:检测到致命的运行时错误。模拟无法继续,vhdl,xilinx,vivado,Vhdl,Xilinx,Vivado,当我尝试使用vivado运行模拟时,出现以下错误: 检测到致命的运行时错误。模拟无法继续 你知道错误的类型吗?在我的测试台下面: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; ------------------------------------------------------------------------------- entity tb_processing_unit is end

当我尝试使用
vivado
运行模拟时,出现以下错误:

检测到致命的运行时错误。模拟无法继续

你知道错误的类型吗?在我的测试台下面:

library ieee;

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-------------------------------------------------------------------------------

entity tb_processing_unit is

end tb_processing_unit;



architecture behavioral of tb_processing_unit is

  component processing_unit is
    port (bus_clk : in  std_logic;
          rst     : in  std_logic;
          enable  : in  std_logic;
          GPIO    : in  std_logic_vector (7 downto 0);
          din_0   : in  std_logic_vector (7 downto 0);
          din_1   : in  std_logic_vector (7 downto 0);
          din_2   : in  std_logic_vector (7 downto 0);
          o_data  : out std_logic_vector (7 downto 0);
          o_wr_en : out std_logic;
          p_data  : out std_logic_vector (31 downto 0);
          p_wr_en : out std_logic;
          p_full  : in  std_logic
          );
  end component;

-- the size of the frames to be processed
  constant FRAME_HEIGHT : integer := 480;
  constant FRAME_WIDTH  : integer := 854;


  signal clk         : std_logic := '0';
  signal reset       : std_logic := '0';
  signal enable_sig  : std_logic;
  signal din_0_sig   : std_logic_vector (7 downto 0);
  signal din_1_sig   : std_logic_vector (7 downto 0);
  signal din_2_sig   : std_logic_vector (7 downto 0);
  signal o_data_sig  : std_logic_vector (7 downto 0);
  signal o_wr_en_sig : std_logic;
  signal GPIO        : std_logic_vector (7 downto 0);
  signal prof_data   : std_logic_vector (31 downto 0);
  signal prof_wren   : std_logic;
  signal prof_full   : std_logic;

-- signals as expected 
  signal Gx_exp, Gy_exp : unsigned (9 downto 0)         := (others => '0');
  signal o_dat_exp      : std_logic_vector (7 downto 0) := (others => '0');


begin

-- Instantiate the Unit Under Test (UUT)
  uut : processing_unit
    port map (enable  => enable_sig,
              din_0   => din_0_sig,
              din_1   => din_1_sig,
              din_2   => din_2_sig,
              o_data  => o_data_sig,
              o_wr_en => o_wr_en_sig,
              rst     => reset,
              bus_clk => clk,
              GPIO    => GPIO,
              p_data  => prof_data,
              p_wr_en => prof_wren,
              p_full  => prof_full
              );

-- generate a clock with 100 ns period
  clkg : process
  begin
    wait for 50 ns;
    clk <= not clk;
  end process;

-- generate some testpatterns 
  tb : process
  begin
    prof_full  <= '0';
    din_0_sig  <= X"00";
    din_1_sig  <= X"00";
    din_2_sig  <= X"00";
    GPIO       <= "00000111";
    enable_sig <= '0';

    wait for 200 ns;

    -- we reset the fsm
    reset <= '1';
    wait for 100 ns;
    reset <= '0';

    -- no we enable the unit
    enable_sig <= '1';

    -- have to wait until the processing unit is
    -- really outputting calculated values from the sobel
    -- filter (it waits 
    enable_sig <= '1';

--  FOR i in 1 TO (2*FRAME_WIDTH+2) LOOP
    wait for (2*FRAME_WIDTH+2) * 100 ns;

    din_0_sig  <= X"33";
    din_1_sig  <= X"40";
    din_2_sig  <= X"43";
    wait for 100 ns;
    din_0_sig  <= X"F5";
    din_1_sig  <= X"9B";
    din_2_sig  <= X"59";
    wait for 100 ns;
    din_0_sig  <= X"C0";
    din_1_sig  <= X"C6";
    din_2_sig  <= X"B2";
    wait for 100 ns;
    din_0_sig  <= X"02";
    din_1_sig  <= X"0D";
    din_2_sig  <= X"A0";
    wait for 100 ns;
    din_0_sig  <= X"D4";
    din_1_sig  <= X"DC";
    din_2_sig  <= X"22";
    wait for 100 ns;
    din_0_sig  <= X"41";
    din_1_sig  <= X"FC";
    din_2_sig  <= X"FF";
    wait for 100 ns;
    din_0_sig  <= X"DB";
    din_1_sig  <= X"39";
    din_2_sig  <= X"4E";
    wait for 100 ns;
    din_0_sig  <= X"85";
    din_1_sig  <= X"43";
    din_2_sig  <= X"7D";
    wait for 100 ns;
    din_0_sig  <= X"81";
    din_1_sig  <= X"57";
    din_2_sig  <= X"29";
    wait for 100 ns;
    din_0_sig  <= X"A4";
    din_1_sig  <= X"C5";
    din_2_sig  <= X"73";
    wait for 100 ns;
    enable_sig <= '1';
    wait for 300 ns;

    wait;                               -- will wait forever
  end process;

  gxy_exp : process
  begin
    wait for ((2*FRAME_WIDTH+6)*100 ns + 50 ns);
    Gx_exp <= B"00" & X"1e";
    Gy_exp <= B"00" & X"02";
    wait for 100 ns;
    Gx_exp <= B"00" & X"50";
    Gy_exp <= B"00" & X"0f";
    wait for 100 ns;
    Gx_exp <= B"00" & X"41";
    Gy_exp <= B"00" & X"26";
    wait for 100 ns;
    Gx_exp <= B"00" & X"39";
    Gy_exp <= B"00" & X"03";
    wait for 100 ns;
    Gx_exp <= B"00" & X"0a";
    Gy_exp <= B"00" & X"0f";
    wait for 100 ns;
    Gx_exp <= B"00" & X"4f";
    Gy_exp <= B"00" & X"01";
    wait for 100 ns;
    Gx_exp <= B"00" & X"22";
    Gy_exp <= B"00" & X"07";
    wait for 100 ns;
    Gx_exp <= B"00" & X"36";
    Gy_exp <= B"00" & X"0c";
    wait for 100 ns;
    Gx_exp <= B"00" & X"08";
    Gy_exp <= B"00" & X"1e";
    wait for 100 ns;
    Gx_exp <= B"00" & X"23";
    Gy_exp <= B"00" & X"1d";
    wait for 100 ns;
    Gx_exp <= B"00" & X"29";
    Gy_exp <= B"00" & X"1d";
    wait for 100 ns;
    Gx_exp <= B"00" & X"00";
    Gy_exp <= B"00" & X"18";
    wait;                               -- wait forever
  end process;

  od_exp : process
  begin
    wait for 650 ns;
    o_dat_exp <= X"80";
    wait for (2*FRAME_WIDTH+2) * 100 ns;
    o_dat_exp <= X"ff";
    wait for 200 ns;
    o_dat_exp <= X"00";
    wait for 100 ns;
    o_dat_exp <= X"ff";
    wait for 600 ns;
    o_dat_exp <= X"00";
    wait;                               -- wait forever
  end process;


end behavioral;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
-------------------------------------------------------------------------------
实体tb_处理单元为
终端tb_处理单元;
tb_处理单元的架构是
组件处理单元是
端口(总线时钟:标准逻辑中;
rst:标准逻辑中;
启用:在std_逻辑中;
GPIO:标准逻辑向量(7到0);
din_0:标准逻辑_向量(7到0);
din_1:标准逻辑_向量中(7到0);
din_2:标准逻辑_向量(7到0);
o_数据:输出标准逻辑向量(7到0);
输出标准逻辑;
p_数据:输出标准逻辑向量(31到0);
p_wr_en:输出标准逻辑;
p_full:在标准逻辑中
);
端部元件;
--要处理的帧的大小
恒定帧高:整数:=480;
恒定帧_宽度:整数:=854;
信号时钟:标准逻辑:='0';
信号复位:标准逻辑:='0';
信号使能信号:标准逻辑;
信号din_0_sig:std_逻辑_矢量(7到0);
信号din_1_sig:std_逻辑_矢量(7到0);
信号din_2_sig:std_逻辑_矢量(7到0);
信号o_数据信号:标准逻辑向量(7到0);
信号o_wr_en_sig:标准逻辑;
信号GPIO:std_逻辑_向量(7到0);
信号教授数据:标准逻辑向量(31到0);
信号prof_-wren:std_逻辑;
信号全:标准逻辑;
--信号如预期
信号Gx_exp,Gy_exp:unsigned(9到0):=(其他=>0');
信号o_dat_exp:std_逻辑_矢量(7到0):=(其他=>'0');
开始
--实例化被测单元(UUT)
uut:处理单元
端口映射(enable=>enable_sig,
din_0=>din_0_信号,
din_1=>din_1_信号,
din_2=>din_2_信号,
o_data=>o_data_sig,
o_wr_en=>o_wr_en_sig,
rst=>重置,
巴士时钟=>时钟,
GPIO=>GPIO,
p_数据=>教授数据,
p_wr_en=>雷恩教授,
p_full=>prof_full
);
--生成周期为100 ns的时钟
clkg:过程
开始
等待50纳秒;

clk这是一个溢出问题。 我得到了以下信号

signal Gx, Gy : unsigned (9 downto 0);
signal G : unsigned (9  downto 0 );
我在执行这个乘法时出错了

G <= Gx(7 downto 0)*Gx(7 downto 0)+Gy(7 downto 0)*Gy(7 downto 0);

现在它工作了

这可能是因为
致命错误:迭代限制已达到
错误,但我无法确认这一点,并且没有代码就无法提供帮助。@user3914897我添加了我的tbTestbench,没有“处理单元”组件就无法提供帮助。它是否报告“致命错误:达到迭代限制”?如果不是这样,问题就出在其他方面。Xilinx ISIM确实会崩溃:可能值得尝试不同的模拟器,例如ghdl。GHDL的编译器非常严格:准备好报告ISIM无法检测到但无论如何都会崩溃的微妙问题。你的“结核病”本身并没有特别大的帮助。你也写过“uut”吗?请注意,您的日志可能会显示多个错误。作为第一步,显示在日志中找到的任何文件的完整文本。我能找到的唯一一个Vivado日志文件实例有错误:[Simulator 45-1]。。。网络上出现了一条信息更丰富的错误消息:“ERROR:Slice range direction”to“与前缀Slice direction”downto“不匹配”,它可能告诉您代码中存在语义错误,可能是在处理单元中。信任@BrianDrummond。您好,谢谢:D我尝试一步一步地运行模拟,发现了问题。无符号(a)*无符号(b)
的结果长度定义为a的长度加上b的长度。因此,
G
需要8+8->16位。啊,我相信这会被一个像样的模拟器捕捉到。但是,Xilinx ISE模拟器在默认情况下会在范围检查关闭的情况下运行!有一个设置(查看ISE中的“Process Properties/Advanced”,可能在Vivado中移动)来打开它们。。。启用它,模拟器可以正确诊断问题。
signal G : unsigned (15  downto 0 );