2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
9 use unisim.vcomponents.all;
15 m_in : in Execute1ToMultiplyType;
16 m_out : out MultiplyToExecute1Type
20 architecture behaviour of multiply is
21 signal m00_p, m01_p, m02_p, m03_p : std_ulogic_vector(47 downto 0);
22 signal m00_pc : std_ulogic_vector(47 downto 0);
23 signal m10_p, m11_p, m12_p, m13_p : std_ulogic_vector(47 downto 0);
24 signal m11_pc, m12_pc, m13_pc : std_ulogic_vector(47 downto 0);
25 signal m20_p, m21_p, m22_p, m23_p : std_ulogic_vector(47 downto 0);
26 signal s0_pc, s1_pc : std_ulogic_vector(47 downto 0);
27 signal product_lo : std_ulogic_vector(31 downto 0);
28 signal product : std_ulogic_vector(127 downto 0);
29 signal addend : std_ulogic_vector(127 downto 0);
30 signal s0_carry, p0_carry : std_ulogic_vector(3 downto 0);
31 signal p0_mask : std_ulogic_vector(47 downto 0);
32 signal p0_pat, p0_patb : std_ulogic;
33 signal p1_pat, p1_patb : std_ulogic;
35 signal req_32bit, r32_1 : std_ulogic;
36 signal req_neg, rneg_1 : std_ulogic;
37 signal valid_1 : std_ulogic;
40 addend <= (others => m_in.neg_result);
56 A => "0000000" & m_in.data1(22 downto 0),
57 ACIN => (others => '0'),
59 B => '0' & m_in.data2(16 downto 0),
60 BCIN => (others => '0'),
61 C => "00000000000000" & addend(33 downto 0),
84 PCIN => (others => '0'),
112 A => "0000000" & m_in.data1(22 downto 0),
113 ACIN => (others => '0'),
115 B => '0' & m_in.data2(33 downto 17),
116 BCIN => (others => '0'),
117 C => (others => '0'),
135 D => (others => '0'),
142 RSTALLCARRYIN => '0',
167 A => "0000000" & m_in.data1(22 downto 0),
168 ACIN => (others => '0'),
170 B => '0' & m_in.data2(50 downto 34),
171 BCIN => (others => '0'),
172 C => x"0000000" & "000" & addend(50 downto 34),
190 D => (others => '0'),
195 PCIN => (others => '0'),
197 RSTALLCARRYIN => '0',
222 A => "0000000" & m_in.data1(22 downto 0),
223 ACIN => (others => '0'),
225 B => "00000" & m_in.data2(63 downto 51),
226 BCIN => (others => '0'),
227 C => x"000000" & '0' & addend(73 downto 51),
245 D => (others => '0'),
250 PCIN => (others => '0'),
252 RSTALLCARRYIN => '0',
278 A => "0000000000000" & m_in.data1(39 downto 23),
279 ACIN => (others => '0'),
281 B => '0' & m_in.data2(16 downto 0),
282 BCIN => (others => '0'),
283 C => x"000" & "00" & m01_p(39 downto 6),
301 D => (others => '0'),
306 PCIN => (others => '0'),
308 RSTALLCARRYIN => '0',
334 A => "0000000000000" & m_in.data1(39 downto 23),
335 ACIN => (others => '0'),
337 B => '0' & m_in.data2(33 downto 17),
338 BCIN => (others => '0'),
339 C => x"000" & "00" & m02_p(39 downto 6),
357 D => (others => '0'),
362 PCIN => (others => '0'),
365 RSTALLCARRYIN => '0',
391 A => "0000000000000" & m_in.data1(39 downto 23),
392 ACIN => (others => '0'),
394 B => '0' & m_in.data2(50 downto 34),
395 BCIN => (others => '0'),
396 C => x"0000" & '0' & m03_p(36 downto 6),
414 D => (others => '0'),
419 PCIN => (others => '0'),
422 RSTALLCARRYIN => '0',
447 A => "0000000000000" & m_in.data1(39 downto 23),
448 ACIN => (others => '0'),
450 B => "00000" & m_in.data2(63 downto 51),
451 BCIN => (others => '0'),
452 C => x"0000000" & "000" & addend(90 downto 74),
470 D => (others => '0'),
475 PCIN => (others => '0'),
478 RSTALLCARRYIN => '0',
503 A => "000000" & m_in.data1(63 downto 40),
504 ACIN => (others => '0'),
506 B => '0' & m_in.data2(16 downto 0),
507 BCIN => (others => '0'),
508 C => (others => '0'),
526 D => (others => '0'),
533 RSTALLCARRYIN => '0',
558 A => "000000" & m_in.data1(63 downto 40),
559 ACIN => (others => '0'),
561 B => '0' & m_in.data2(33 downto 17),
562 BCIN => (others => '0'),
563 C => (others => '0'),
581 D => (others => '0'),
588 RSTALLCARRYIN => '0',
613 A => "000000" & m_in.data1(63 downto 40),
614 ACIN => (others => '0'),
616 B => '0' & m_in.data2(50 downto 34),
617 BCIN => (others => '0'),
618 C => (others => '0'),
636 D => (others => '0'),
643 RSTALLCARRYIN => '0',
668 A => "000000" & m_in.data1(63 downto 40),
669 ACIN => (others => '0'),
671 B => "00000" & m_in.data2(63 downto 51),
672 BCIN => (others => '0'),
673 C => x"00" & "000" & addend(127 downto 91),
691 D => (others => '0'),
696 PCIN => (others => '0'),
698 RSTALLCARRYIN => '0',
726 A => m22_p(5 downto 0) & x"0000" & m10_p(34 downto 27),
727 ACIN => (others => '0'),
729 B => m10_p(26 downto 9),
730 BCIN => (others => '0'),
731 C => m20_p(39 downto 0) & m02_p(5 downto 0) & "00",
735 CARRYOUT => s0_carry,
750 D => (others => '0'),
754 PCIN => (others => '0'),
757 RSTALLCARRYIN => '0',
785 A => x"000" & m22_p(41 downto 24),
786 ACIN => (others => '0'),
788 B => m22_p(23 downto 6),
789 BCIN => (others => '0'),
790 C => m23_p(36 downto 0) & x"00" & "0" & m20_p(41 downto 40),
792 CARRYIN => s0_carry(3),
808 D => (others => '0'),
812 PCIN => (others => '0'),
815 RSTALLCARRYIN => '0',
826 -- mask is 0 for 32-bit ops, 0x0000ffffffff for 64-bit
827 p0_mask(47 downto 31) <= (others => '0');
828 p0_mask(30 downto 0) <= (others => not r32_1);
846 USE_PATTERN_DETECT => "PATDET"
849 A => m21_p(22 downto 0) & m03_p(5 downto 0) & '0',
850 ACIN => (others => '0'),
851 ALUMODE => "00" & rneg_1 & '0',
852 B => (others => '0'),
853 BCIN => (others => '0'),
858 CARRYOUT => p0_carry,
873 D => (others => '0'),
877 P => product(79 downto 32),
878 PATTERNDETECT => p0_pat,
879 PATTERNBDETECT => p0_patb,
882 RSTALLCARRYIN => '0',
904 MASK => x"000000000000",
909 USE_PATTERN_DETECT => "PATDET"
912 A => x"0000000" & '0' & m21_p(41),
913 ACIN => (others => '0'),
914 ALUMODE => "00" & rneg_1 & '0',
915 B => m21_p(40 downto 23),
916 BCIN => (others => '0'),
917 C => (others => '0'),
919 CARRYIN => p0_carry(3),
935 D => (others => '0'),
939 P => product(127 downto 80),
940 PATTERNDETECT => p1_pat,
941 PATTERNBDETECT => p1_patb,
944 RSTALLCARRYIN => '0',
955 product(31 downto 0) <= product_lo xor (31 downto 0 => req_neg);
957 mult_out: process(all)
958 variable ov : std_ulogic;
960 -- set overflow if the high bits are neither all zeroes nor all ones
961 if req_32bit = '0' then
962 ov := not ((p1_pat and p0_pat) or (p1_patb and p0_patb));
964 ov := not ((p1_pat and p0_pat and not product(31)) or
965 (p1_patb and p0_patb and product(31)));
968 m_out.result <= product;
969 m_out.overflow <= ov;
974 if rising_edge(clk) then
975 product_lo <= m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0);
976 m_out.valid <= valid_1;
977 valid_1 <= m_in.valid;
979 r32_1 <= m_in.is_32bit;
981 rneg_1 <= m_in.neg_result;
985 end architecture behaviour;