- minor improvements for load/store shifter
Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@430 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -264,7 +264,7 @@ package mips_types is
|
|||||||
end record;
|
end record;
|
||||||
|
|
||||||
type cop0_ctrl_out_t is record
|
type cop0_ctrl_out_t is record
|
||||||
RE : STD_LOGIC;
|
EB : STD_LOGIC;
|
||||||
exc_inject : STD_LOGIC;
|
exc_inject : STD_LOGIC;
|
||||||
exc_commit : STD_LOGIC;
|
exc_commit : STD_LOGIC;
|
||||||
exc_pending : STD_LOGIC;
|
exc_pending : STD_LOGIC;
|
||||||
@@ -454,56 +454,53 @@ package body mips_types is
|
|||||||
function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned is
|
function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned is
|
||||||
variable result : unsigned(3 downto 0);
|
variable result : unsigned(3 downto 0);
|
||||||
begin
|
begin
|
||||||
if bypass = '1' then
|
result := (3 downto 0 => be_src);
|
||||||
result := (3 downto 0 => be_src);
|
if bypass = '0' then
|
||||||
elsif word2_en = '1' then
|
if word2_en = '1' then
|
||||||
case va is
|
case va is
|
||||||
when "00" | "01" =>
|
when "00" =>
|
||||||
result := "00" & be_src & be_src;
|
result := "00" & be_src & be_src;
|
||||||
when "10" | "11" =>
|
when "10" =>
|
||||||
result := be_src & be_src & "00";
|
result := be_src & be_src & "00";
|
||||||
when others =>
|
when others => null;
|
||||||
result := "0000";
|
end case;
|
||||||
end case;
|
elsif word4_en = '1' then
|
||||||
elsif word4_en = '1' then
|
case va is
|
||||||
case va is
|
when "00" =>
|
||||||
when "00" =>
|
result := "000" & be_src;
|
||||||
result := "000" & be_src;
|
when "01" =>
|
||||||
when "01" =>
|
result := "00" & be_src & '0';
|
||||||
result := "00" & be_src & '0';
|
when "10" =>
|
||||||
when "10" =>
|
result := '0' & be_src & "00";
|
||||||
result := '0' & be_src & "00";
|
when "11" =>
|
||||||
when "11" =>
|
result := be_src & "000";
|
||||||
result := be_src & "000";
|
when others => null;
|
||||||
when others =>
|
end case;
|
||||||
result := "0000";
|
elsif align_left = '1' then
|
||||||
end case;
|
case va is
|
||||||
elsif align_left = '1' then
|
when "00" =>
|
||||||
case va is
|
result := be_src & be_src & be_src & be_src;
|
||||||
when "00" =>
|
when "01" =>
|
||||||
result := be_src & be_src & be_src & be_src;
|
result := be_src & be_src & be_src & '0';
|
||||||
when "01" =>
|
when "10" =>
|
||||||
result := be_src & be_src & be_src & '0';
|
result := be_src & be_src & "00";
|
||||||
when "10" =>
|
when "11" =>
|
||||||
result := be_src & be_src & "00";
|
result := be_src & "000";
|
||||||
when "11" =>
|
when others => null;
|
||||||
result := be_src & "000";
|
end case;
|
||||||
when others =>
|
else
|
||||||
result := "0000";
|
case va is
|
||||||
end case;
|
when "00" =>
|
||||||
else
|
result := "000" & be_src;
|
||||||
case va is
|
when "01" =>
|
||||||
when "00" =>
|
result := "00" & be_src & be_src;
|
||||||
result := "000" & be_src;
|
when "10" =>
|
||||||
when "01" =>
|
result := '0' & be_src & be_src & be_src;
|
||||||
result := "00" & be_src & be_src;
|
when "11" =>
|
||||||
when "10" =>
|
result := be_src & be_src & be_src & be_src;
|
||||||
result := '0' & be_src & be_src & be_src;
|
when others => null;
|
||||||
when "11" =>
|
end case;
|
||||||
result := be_src & be_src & be_src & be_src;
|
end if;
|
||||||
when others =>
|
|
||||||
result := "0000";
|
|
||||||
end case;
|
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -539,34 +536,33 @@ package body mips_types is
|
|||||||
function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned is
|
function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned is
|
||||||
variable result : unsigned(3 downto 0);
|
variable result : unsigned(3 downto 0);
|
||||||
begin
|
begin
|
||||||
if bypass = '1' then
|
result := (3 downto 0 => '1');
|
||||||
result := (3 downto 0 => '1');
|
if bypass = '0' then
|
||||||
elsif align_left = '1' then
|
if align_left = '1' then
|
||||||
case va is
|
case va is
|
||||||
when "00" =>
|
when "00" =>
|
||||||
result := "1000";
|
result := "1000";
|
||||||
when "01" =>
|
when "01" =>
|
||||||
result := "1100";
|
result := "1100";
|
||||||
when "10" =>
|
when "10" =>
|
||||||
result := "1110";
|
result := "1110";
|
||||||
when "11" =>
|
when "11" =>
|
||||||
result := "1111";
|
result := "1111";
|
||||||
when others =>
|
when others => null;
|
||||||
result := "0000";
|
end case;
|
||||||
end case;
|
else
|
||||||
else
|
case va is
|
||||||
case va is
|
when "00" =>
|
||||||
when "00" =>
|
result := "1111";
|
||||||
result := "1111";
|
when "01" =>
|
||||||
when "01" =>
|
result := "0111";
|
||||||
result := "0111";
|
when "10" =>
|
||||||
when "10" =>
|
result := "0011";
|
||||||
result := "0011";
|
when "11" =>
|
||||||
when "11" =>
|
result := "0001";
|
||||||
result := "0001";
|
when others => null;
|
||||||
when others =>
|
end case;
|
||||||
result := "0000";
|
end if;
|
||||||
end case;
|
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Reference in New Issue
Block a user