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

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.