Search code examples
vhdlsequential

Vhdl vector boundry check


type dmemSpace is array(0 to 1023) of std_logic_vector(31 downto 0);
signal dataMem : dmemSpace := ( 
  400 => X"00000000",
  404 => X"00001000",
  408 => X"FFFFEFFF",
  others => X"00000000"
);

signal dAddr : std_logic_vector(31 downto 0);
signal check : integer; 


dAddr(31 downto 0) <= Addr(31 downto 2) & "00";  
check <= to_integer(unsigned(dAddr));
DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

Its me again.... In working on a single cycle cpu and everything else works fine but this particular line in the memory.

DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

I want to prevent an index out of bounds error for DataOut but this doesn't work. Any ideas?

  • Check > 0 prevents all data from coming out.
  • Check >= 0 lets the error through... when the index that causes the exception is -4.

Solution

  • If you have it in a process, you need "dAddr" and "check" to be variables, or else you are taking two clock cycles based on whether or not the previous address was valid, not the one you are using.