📄 numeric_std-body.vhdl
字号:
-- Id: A.31 function "rem" (L: SIGNED; R: INTEGER) return SIGNED is constant R_LENGTH: NATURAL := MAX(L'LENGTH, SIGNED_NUM_BITS(R)); variable XR, XREM: SIGNED(R_LENGTH-1 downto 0); begin if (L'LENGTH < 1) then return NAS; end if; XR := TO_SIGNED(R, R_LENGTH); XREM := RESIZE((L rem XR), XREM'LENGTH); if R_LENGTH > L'LENGTH and XREM(0)/='X' and XREM(R_LENGTH-1 downto L'LENGTH) /= (R_LENGTH-1 downto L'LENGTH => XREM(L'LENGTH-1)) then assert NO_WARNING report "NUMERIC_STD.""rem"": Remainder Truncated" severity WARNING; end if; return RESIZE(XREM, L'LENGTH); end "rem"; -- Id: A.32 function "rem" (L: INTEGER; R: SIGNED) return SIGNED is constant L_LENGTH: NATURAL := MAX(SIGNED_NUM_BITS(L), R'LENGTH); variable XL, XREM: SIGNED(L_LENGTH-1 downto 0); begin if (R'LENGTH < 1) then return NAS; end if; XL := TO_SIGNED(L, L_LENGTH); XREM := RESIZE((XL rem R), XREM'LENGTH); if L_LENGTH > R'LENGTH and XREM(0)/='X' and XREM(L_LENGTH-1 downto R'LENGTH) /= (L_LENGTH-1 downto R'LENGTH => XREM(R'LENGTH-1)) then assert NO_WARNING report "NUMERIC_STD.""rem"": Remainder Truncated" severity WARNING; end if; return RESIZE(XREM, R'LENGTH); end "rem"; --============================================================================ -- Id: A.33 function "mod" (L, R: UNSIGNED) return UNSIGNED is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XXL: UNSIGNED(L_LEFT downto 0) is L; alias XXR: UNSIGNED(R_LEFT downto 0) is R; variable XL: UNSIGNED(L_LEFT downto 0); variable XR: UNSIGNED(R_LEFT downto 0); variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0); variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0); begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU; end if; XL := TO_01(XXL, 'X'); XR := TO_01(XXR, 'X'); if ((XL(XL'LEFT)='X') or (XR(XR'LEFT)='X')) then FREMAIN := (others => 'X'); return FREMAIN; end if; DIVMOD(XL, XR, FQUOT, FREMAIN); return FREMAIN; end "mod"; -- Id: A.34 function "mod" (L, R: SIGNED) return SIGNED is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XXL: SIGNED(L_LEFT downto 0) is L; alias XXR: SIGNED(R_LEFT downto 0) is R; variable XL: SIGNED(L_LEFT downto 0); variable XR: SIGNED(R_LEFT downto 0); variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0); variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0); variable XNUM: UNSIGNED(L'LENGTH-1 downto 0); variable XDENOM: UNSIGNED(R'LENGTH-1 downto 0); variable RNEG: BOOLEAN := FALSE; begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAS; end if; XL := TO_01(XXL, 'X'); XR := TO_01(XXR, 'X'); if ((XL(XL'LEFT)='X') or (XR(XR'LEFT)='X')) then FREMAIN := (others => 'X'); return SIGNED(FREMAIN); end if; if XL(XL'LEFT)='1' then XNUM := UNSIGNED(-XL); else XNUM := UNSIGNED(XL); end if; if XR(XR'LEFT)='1' then XDENOM := UNSIGNED(-XR); RNEG := TRUE; else XDENOM := UNSIGNED(XR); end if; DIVMOD(XNUM, XDENOM, FQUOT, FREMAIN); if RNEG and L(L'LEFT)='1' then FREMAIN := "0"-FREMAIN; elsif RNEG and FREMAIN/="0" then FREMAIN := FREMAIN-XDENOM; elsif L(L'LEFT)='1' and FREMAIN/="0" then FREMAIN := XDENOM-FREMAIN; end if; return SIGNED(FREMAIN); end "mod"; -- Id: A.35 function "mod" (L: UNSIGNED; R: NATURAL) return UNSIGNED is constant R_LENGTH: NATURAL := MAX(L'LENGTH, UNSIGNED_NUM_BITS(R)); variable XR, XREM: UNSIGNED(R_LENGTH-1 downto 0); begin if (L'LENGTH < 1) then return NAU; end if; XR := TO_UNSIGNED(R, R_LENGTH); XREM := RESIZE((L mod XR), XREM'LENGTH); if R_LENGTH > L'LENGTH and XREM(0)/='X' and XREM(R_LENGTH-1 downto L'LENGTH) /= (R_LENGTH-1 downto L'LENGTH => '0') then assert NO_WARNING report "NUMERIC_STD.""mod"": Modulus Truncated" severity WARNING; end if; return RESIZE(XREM, L'LENGTH); end "mod"; -- Id: A.36 function "mod" (L: NATURAL; R: UNSIGNED) return UNSIGNED is constant L_LENGTH: NATURAL := MAX(UNSIGNED_NUM_BITS(L), R'LENGTH); variable XL, XREM: UNSIGNED(L_LENGTH-1 downto 0); begin if (R'LENGTH < 1) then return NAU; end if; XL := TO_UNSIGNED(L, L_LENGTH); XREM := RESIZE((XL mod R), XREM'LENGTH); if L_LENGTH > R'LENGTH and XREM(0)/='X' and XREM(L_LENGTH-1 downto R'LENGTH) /= (L_LENGTH-1 downto R'LENGTH => '0') then assert NO_WARNING report "NUMERIC_STD.""mod"": Modulus Truncated" severity WARNING; end if; return RESIZE(XREM, R'LENGTH); end "mod"; -- Id: A.37 function "mod" (L: SIGNED; R: INTEGER) return SIGNED is constant R_LENGTH: NATURAL := MAX(L'LENGTH, SIGNED_NUM_BITS(R)); variable XR, XREM: SIGNED(R_LENGTH-1 downto 0); begin if (L'LENGTH < 1) then return NAS; end if; XR := TO_SIGNED(R, R_LENGTH); XREM := RESIZE((L mod XR), XREM'LENGTH); if R_LENGTH > L'LENGTH and XREM(0)/='X' and XREM(R_LENGTH-1 downto L'LENGTH) /= (R_LENGTH-1 downto L'LENGTH => XREM(L'LENGTH-1)) then assert NO_WARNING report "NUMERIC_STD.""mod"": Modulus Truncated" severity WARNING; end if; return RESIZE(XREM, L'LENGTH); end "mod"; -- Id: A.38 function "mod" (L: INTEGER; R: SIGNED) return SIGNED is constant L_LENGTH: NATURAL := MAX(SIGNED_NUM_BITS(L), R'LENGTH); variable XL, XREM: SIGNED(L_LENGTH-1 downto 0); begin if (R'LENGTH < 1) then return NAS; end if; XL := TO_SIGNED(L, L_LENGTH); XREM := RESIZE((XL mod R), XREM'LENGTH); if L_LENGTH > R'LENGTH and XREM(0)/='X' and XREM(L_LENGTH-1 downto R'LENGTH) /= (L_LENGTH-1 downto R'LENGTH => XREM(R'LENGTH-1)) then assert NO_WARNING report "NUMERIC_STD.""mod"": Modulus Truncated" severity WARNING; end if; return RESIZE(XREM, R'LENGTH); end "mod"; --============================================================================ -- Id: C.1 function ">" (L, R: UNSIGNED) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XL: UNSIGNED(L_LEFT downto 0) is L; alias XR: UNSIGNED(R_LEFT downto 0) is R; constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH); variable L01 : UNSIGNED(L_LEFT downto 0); variable R01 : UNSIGNED(R_LEFT downto 0); begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); R01 := TO_01(XR, 'X'); if ((L01(L01'LEFT)='X') or (R01(R01'LEFT)='X')) then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; return not UNSIGNED_LESS_OR_EQUAL(RESIZE(L01, SIZE), RESIZE(R01, SIZE)); end ">"; -- Id: C.2 function ">" (L, R: SIGNED) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XL: SIGNED(L_LEFT downto 0) is L; alias XR: SIGNED(R_LEFT downto 0) is R; constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH); variable L01 : SIGNED(L_LEFT downto 0); variable R01 : SIGNED(R_LEFT downto 0); begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); R01 := TO_01(XR, 'X'); if ((L01(L01'LEFT)='X') or (R01(R01'LEFT)='X')) then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; return not SIGNED_LESS_OR_EQUAL(RESIZE(L01, SIZE), RESIZE(R01, SIZE)); end ">"; -- Id: C.3 function ">" (L: NATURAL; R: UNSIGNED) return BOOLEAN is constant R_LEFT: INTEGER := R'LENGTH-1; alias XR: UNSIGNED(R_LEFT downto 0) is R; variable R01 : UNSIGNED(R_LEFT downto 0); begin if (R'LENGTH < 1) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; R01 := TO_01(XR, 'X'); if (R01(R01'LEFT)='X') then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; if UNSIGNED_NUM_BITS(L) > R'LENGTH then return TRUE; end if; return not UNSIGNED_LESS_OR_EQUAL(TO_UNSIGNED(L, R01'LENGTH), R01); end ">"; -- Id: C.4 function ">" (L: INTEGER; R: SIGNED) return BOOLEAN is constant R_LEFT: INTEGER := R'LENGTH-1; alias XR: SIGNED(R_LEFT downto 0) is R; variable R01 : SIGNED(R_LEFT downto 0); begin if (R'LENGTH < 1) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; R01 := TO_01(XR, 'X'); if (R01(R01'LEFT)='X') then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; if SIGNED_NUM_BITS(L) > R'LENGTH then return L > 0; end if; return not SIGNED_LESS_OR_EQUAL(TO_SIGNED(L, R01'LENGTH), R01); end ">"; -- Id: C.5 function ">" (L: UNSIGNED; R: NATURAL) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; alias XL: UNSIGNED(L_LEFT downto 0) is L; variable L01 : UNSIGNED(L_LEFT downto 0); begin if (L'LENGTH < 1) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); if (L01(L01'LEFT)='X') then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; if UNSIGNED_NUM_BITS(R) > L'LENGTH then return FALSE; end if; return not UNSIGNED_LESS_OR_EQUAL(L01, TO_UNSIGNED(R, L01'LENGTH)); end ">"; -- Id: C.6 function ">" (L: SIGNED; R: INTEGER) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; alias XL: SIGNED(L_LEFT downto 0) is L; variable L01 : SIGNED(L_LEFT downto 0); begin if (L'LENGTH < 1) then assert NO_WARNING report "NUMERIC_STD."">"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); if (L01(L01'LEFT)='X') then assert NO_WARNING report "NUMERIC_STD."">"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; if SIGNED_NUM_BITS(R) > L'LENGTH then return 0 > R; end if; return not SIGNED_LESS_OR_EQUAL(L01, TO_SIGNED(R, L01'LENGTH)); end ">"; --============================================================================ -- Id: C.7 function "<" (L, R: UNSIGNED) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XL: UNSIGNED(L_LEFT downto 0) is L; alias XR: UNSIGNED(R_LEFT downto 0) is R; constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH); variable L01 : UNSIGNED(L_LEFT downto 0); variable R01 : UNSIGNED(R_LEFT downto 0); begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then assert NO_WARNING report "NUMERIC_STD.""<"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); R01 := TO_01(XR, 'X'); if ((L01(L01'LEFT)='X') or (R01(R01'LEFT)='X')) then assert NO_WARNING report "NUMERIC_STD.""<"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; return UNSIGNED_LESS(RESIZE(L01, SIZE), RESIZE(R01, SIZE)); end "<"; -- Id: C.8 function "<" (L, R: SIGNED) return BOOLEAN is constant L_LEFT: INTEGER := L'LENGTH-1; constant R_LEFT: INTEGER := R'LENGTH-1; alias XL: SIGNED(L_LEFT downto 0) is L; alias XR: SIGNED(R_LEFT downto 0) is R; constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH); variable L01 : SIGNED(L_LEFT downto 0); variable R01 : SIGNED(R_LEFT downto 0); begin if ((L'LENGTH < 1) or (R'LENGTH < 1)) then assert NO_WARNING report "NUMERIC_STD.""<"": null argument detected, returning FALSE" severity WARNING; return FALSE; end if; L01 := TO_01(XL, 'X'); R01 := TO_01(XR, 'X'); if ((L01(L01'LEFT)='X') or (R01(R01'LEFT)='X')) then assert NO_WARNING report "NUMERIC_STD.""<"": metavalue detected, returning FALSE" severity WARNING; return FALSE; end if; return SIGNED_LESS(RESIZE(L01, SIZE), RESIZE(R01, SIZE)); end "<"; -- Id: C.9 function "<" (L: NATURAL; R: UNSIGNED) return BOOLEAN is constant R_LEFT: INTEGER := R'LENGTH-1; alias XR: UNSIGNED(R_LEFT downto 0) is R; variable R01 : UNSIGNED(R_LEFT downto 0); begin if (R'LENGTH < 1) then assert NO_WARNING report "NUMERIC_STD.""<"": null argument detected, returning FALSE"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -