Dont care in Array assignment

Guest #5586633
Rate this post
useful
not useful
In modelsim, when I assign a std logic vector(din) to an element (r_reg) 
in n array of std logic vector, it give me dont cares for 1's and 0 for 
0's. Why are the 1's dont care and how to fix it?

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

entity regfile is
  port (
    din: in std_logic_vector(31 downto 0);
    write_address, read_a, read_b: in std_logic_vector(4 downto 0);
    reset, clk, write: in std_logic;
    out_a, out_b: out std_logic_vector(31 downto 0)
  );
end regfile;

architecture structural of regfile is

-- declare components
-- end declare component

-- declare signals used to connect components
type t_reg is array (0 to 31) of std_logic_vector(31 downto 0);
signal r_reg : t_reg := (others => (others => '0'));
-- end declare signals used to connect components

-- declare configuration specification
-- end declare configuration specification

begin

-- init component
-- end init component

r_reg <= (others => (others => '0')) when reset='1';
out_a <= r_reg(to_integer(unsigned(read_a)));
out_b <= r_reg(to_integer(unsigned(read_b)));

process(clk, write, write_address, din)
begin
  if (clk'event and clk='1') then
    if (write='1') then
      r_reg(to_integer(unsigned(write_address))) <= din;
    end if;
  end if;
end process;

end structural;

# do file to test the regfile
add wave reset
add wave clk
add wave din
add wave write
add wave read_a
add wave read_b
add wave write_address
add wave out_a
add wave out_b
add wave r_reg

# reset
force reset 1
force clk 0
force din X"FAFA3B3B"
force write 0
force write_address "00001"
force read_a "00000"
force read_b "00001"
run 2

#deassert reset and write into R1
force reset 0
run 2
force write 1
run 2
force clk 1
run 2
force clk 0
run 2

# write X"FAFA3B3B" into R31 and sent R31 to both out ports
force write_address "11110"
run 2
force read_a "11110"
force read_b "11110"
force clk 1
run 2
force clk 0
run 2

# deassert write, and try to write new data into R31, shouild be
no change
force write 0
run 2
force clk 1
run 2
force clk 0
run 2

# write data into R1-R31 consecutively
force write 1
force write_address "00001"
force din X"00000001"
force clk 1
run 2
force clk 0
run 2

force write_address "00010"
force din X"00000002"
force clk 1
run 2
force clk 0
run 2

force write_address "00011"
force din X"00000003"
force clk 1
run 2
force clk 0
run 2

force write_address "00100"
force din X"00000004"
force clk 1
run 2
force clk 0
run 2

force write_address "00101"
force din X"00000005"
force clk 1
run 2
force clk 0
run 2

force write_address "00110"
force din X"00000006"
force clk 1
run 2
force clk 0
run 2


force write_address "00111"
force din X"00000007"
force clk 1
run 2
force clk 0
run 2

force write_address "01000"
force din X"00000008"
force clk 1
run 2
force clk 0
run 2

force write_address "01001"
force din X"00000009"
force clk 1
run 2
force clk 0
run 2

force write_address "01010"
force din X"0000000A"
force clk 1
run 2
force clk 0
run 2

force write_address "01011"
force din X"0000000B"
force clk 1
run 2
force clk 0
run 2

force write_address "01100"
force din X"0000000C"
force clk 1
run 2
force clk 0
run 2

force write_address "01101"
force din X"0000000D"
force clk 1
run 2
force clk 0
run 2

force write_address "01110"
force din X"0000000E"
force clk 1
run 2
force clk 0
run 2

force write_address "01111"
force din X"0000000F"
force clk 1
run 2
force clk 0
run 2

# second hald of registers

force write_address "10000"
force din X"00000010"
force clk 1
run 2
force clk 0
run 2

force write_address "10001"
force din X"00000011"
force clk 1
run 2
force clk 0
run 2

force write_address "10010"
force din X"00000012"
force clk 1
run 2
force clk 0
run 2

force write_address "10011"
force din X"00000013"
force clk 1
run 2
force clk 0
run 2

force write_address "10100"
force din X"00000014"
force clk 1
run 2
force clk 0
run 2

force write_address "10101"
force din X"00000015"
force clk 1
run 2
force clk 0
run 2

force write_address "10110"
force din X"00000016"
force clk 1
run 2
force clk 0
run 2

force write_address "10111"
force din X"00000017"
force clk 1
run 2
force clk 0
run 2

force write_address "10001"
force din X"00000011"
force clk 1
run 2
force clk 0
run 2

force write_address "11000"
force din X"00000018"
force clk 1
run 2
force clk 0
run 2

force write_address "11001"
force din X"00000019"
force clk 1
run 2
force clk 0
run 2

force write_address "11011"
force din X"0000001B"
force clk 1
run 2
force clk 0
run 2

force write_address "11100"
force din X"0000001C"
force clk 1
run 2
force clk 0
run 2

force write_address "11101"
force din X"0000001D"
force clk 1
run 2
force clk 0
run 2

force write_address "11110"
force din X"0000001E"
force clk 1
run 2
force clk 0
run 2

force write_address "11111"
force din X"0000001F"
force clk 1
run 2
force clk 0
run 2

# now deassert the write and read out consecutively asynchronously

force write 0
force read_a "00000"
force read_b "00001"
run 2

force read_a "00001"
force read_b "00010"
run 2

force read_a "00011"
force read_b "00100"
run 2

force read_a "00100"
force read_b "00101"
run 2

force read_a "00110"
force read_b "00111"
run 2

force read_a "00111"
force read_b "01000"
run 2

force read_a "01001"
force read_b "01010"
run 2

force read_a "01011"
force read_b "01100"
run 2

force read_a "01101"
force read_b "01110"
run 2

force read_a "01111"
force read_b "10000"
run 2

# second half of reads

force read_a "10001"
force read_b "10010"
run 2

force read_a "10011"
force read_b "10100"
run 2

force read_a "10101"
force read_b "10110"
run 2

force read_a "10111"
force read_b "11000"
run 2

force read_a "11001"
force read_b "11010"
run 2

force read_a "11011"
force read_b "11100"
run 2

# next 3 quarter
force read_a "11101"
force read_b "11110"
run 2

force read_a "11111"
force read_b "11111"
run 2
Attached files:
Guest #5586643
Rate this post
useful
not useful
There are tags for code formatting, as mentioned above the text field. 
Then the code is readable.

I bet that there is no don't care as a result.

You have two assignments to r_reg simultaneously. That will result in a 
conflict ('X' as value and red lines in modelsim), when different values 
are assigned.

Reply

Please log in before posting.

or

Log in with Google account

Registration is free and takes only a minute.

Register now