0
\$\begingroup\$

Given an array of N elements, element is M bits vector. I am going to sum them up.

For example, given an array of 12 bits vectors.

type data_array is array (integer range 0 to 68) of std_logic_vector( 11 downto 0); --69s 12-bits-vectors 

To sum up, I use two loops:

  • first loop: create an array data_array_sum_1 of 6 elements: sum each 10 vectors ( 10 * 6) + sum 9 vectors up.
  • second loop: sum 6 elements up, data_array_sum_2

data_array_sum_1 will be created as:

 type data_array_sum_1 is array (integer range 0 to 6) of signed ( 11+3 downto 0);

I add log2(10)=3 additional bits.

data_array_sum_2 will be created as:

 type data_array_sum_2 is std_logic_vector ( 11+ 5 downto 0);

I add log2(6)=2 additional bits to data_array_sum_1. data_array_sum_2 is the result of addition of 69 elements.

If I don't use loops and sum them up, I should add log2(69)=6, that means the result of addition of 69 elements are 18 bits vector.

I think, I should get the same length of the resultant vector and the length doesn't depend on the algorithm of addition, right? Have I mistaken?

EDIT 1

I am checking different options to sum up two std_logic_vectors. I have read in this forum you suggest to use signed or unsigned type to add them.

My design file:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity test is
port (
 a : in std_logic_vector (11 downto 0); 
 b : in std_logic_vector (11 downto 0); 
 result1 : out unsigned (12 downto 0); 
 result2 : out std_logic_vector (11 downto 0);
 result3 : out std_logic_vector (11 downto 0)
);
end test;
architecture Behavioral of test is 
signal f: std_logic_vector(12 downto 0);
begin
 result1 <= '0'& unsigned(a) + unsigned(b);
 f <= std_logic_vector(unsigned(a) + unsigned(b));
 result3 <= f(12 downto 1);
 result2 <= std_logic_vector(signed(a) + signed(b)); 
 --result3 <= std_logic_vector(('0'& a) + ( '0' & b)); 
 --result3 <= std_logic_vector(resize( a, a'length+1) + resize(b, b'length+1));
end Behavioral;

My test bench file:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 
ENTITY testtb IS
END testtb;
 
ARCHITECTURE behavior OF testtb IS 
 
 COMPONENT test
 PORT(
 a : IN std_logic_vector(11 downto 0);
 b : IN std_logic_vector(11 downto 0);
 result1 : OUT unsigned(12 downto 0);
 result3 : OUT std_logic_vector(11 downto 0);
 result2 : OUT std_logic_vector(11 downto 0)
 );
 END COMPONENT;
 
 --Inputs
 signal a : std_logic_vector(11 downto 0) := (others => '0');
 signal b : std_logic_vector(11 downto 0) := (others => '0');
 --Outputs
 signal result1 : unsigned(12 downto 0);
 signal result2 : std_logic_vector(11 downto 0);
 signal result3 : std_logic_vector(11 downto 0);
 
BEGIN
 
 uut: test PORT MAP (
 a => a,
 b => b,
 result1 => result1,
 result2 => result2
 );
 stim_proc: process
 begin 
 a <= "001001010001";
 b <= "110110101111";
 wait for 10 ns;
 b <= "001001010001";
 a <= "110110101111";
 wait;
 end process;
 END;

I found the correct answer gives result1. Then I have added result3 with f and smth is wrong with f.

ERROR: Array sizes do not match.

Why has it happend? I add two vectors, it means I have one additional bit.

asked May 4, 2021 at 11:04
\$\endgroup\$
5
  • \$\begingroup\$ In system verilog, we do clog2, not log2 cz it's almost useless, must be something like that in VHDL as well. \$\endgroup\$ Commented May 4, 2021 at 12:22
  • \$\begingroup\$ @MituRaj if i define all vectors as signed or unsigned ( using numeric- library), will be it important for me ( add additional bits)? \$\endgroup\$ Commented May 4, 2021 at 12:56
  • \$\begingroup\$ Yea VHDL is strictly typed language. \$\endgroup\$ Commented May 4, 2021 at 13:16
  • \$\begingroup\$ @MituRaj Why is preferred using the signed/unsigned format in addition two std_logic_vectors? \$\endgroup\$ Commented May 5, 2021 at 7:20
  • \$\begingroup\$ Std logic vectors don't support addition (at least not with the standard librariesbin VHDL I know). That's why unsigned or signed conversion. Numeric-std library supports it. \$\endgroup\$ Commented May 5, 2021 at 17:57

1 Answer 1

1
\$\begingroup\$

You are underestimating the number of bits when you ignore the fractional part of the log2 function. What you really want is ceiling(log2()), sometimes called clog2() because it is so commonly used in this type of situation.

So:

  • clog2(10) = 4 (not 3)
  • clog2(7) = 3 (not 2)
  • clog2(69) = 7 (not 6)

Since 4 + 3 = 7, now the results are self-consistent.

answered May 4, 2021 at 11:29
\$\endgroup\$
3
  • \$\begingroup\$ if i define all vectors as signed or unsigned ( using numeric- library), will be it important for me ( add additional bits)? \$\endgroup\$ Commented May 4, 2021 at 12:56
  • \$\begingroup\$ Yes, with signed and unsigned, you still need to explicitly specify the width. \$\endgroup\$ Commented May 4, 2021 at 13:01
  • \$\begingroup\$ Why is preferred using the signed/unsigned format in addition two std_logic_vectors? \$\endgroup\$ Commented May 5, 2021 at 7:20

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.