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

时间:2015-07-13 10:44:39

标签: vhdl xilinx vivado

当我尝试使用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;

我尝试运行模拟时出现错误

1 个答案:

答案 0 :(得分:1)

这是一个溢出问题。 我有以下信号

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);

我考虑过改变G的大小

signal G : unsigned (15  downto 0 );

现在它正在运作