From a3c4ba6e822f2c4c7a11d64b8370435137df1119 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 15 Apr 2009 13:21:39 +0000 Subject: [PATCH] - 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 --- lib/CPUs/MIPS/src/core/mips_types.vhd | 154 +++++++++++++------------- 1 file changed, 75 insertions(+), 79 deletions(-) diff --git a/lib/CPUs/MIPS/src/core/mips_types.vhd b/lib/CPUs/MIPS/src/core/mips_types.vhd index fd83491..915a46e 100644 --- a/lib/CPUs/MIPS/src/core/mips_types.vhd +++ b/lib/CPUs/MIPS/src/core/mips_types.vhd @@ -264,7 +264,7 @@ package mips_types is end record; type cop0_ctrl_out_t is record - RE : STD_LOGIC; + EB : STD_LOGIC; exc_inject : STD_LOGIC; exc_commit : 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 variable result : unsigned(3 downto 0); begin - if bypass = '1' then - result := (3 downto 0 => be_src); - elsif word2_en = '1' then - case va is - when "00" | "01" => - result := "00" & be_src & be_src; - when "10" | "11" => - result := be_src & be_src & "00"; - when others => - result := "0000"; - end case; - elsif word4_en = '1' then - case va is - when "00" => - result := "000" & be_src; - when "01" => - result := "00" & be_src & '0'; - when "10" => - result := '0' & be_src & "00"; - when "11" => - result := be_src & "000"; - when others => - result := "0000"; - end case; - elsif align_left = '1' then - case va is - when "00" => - result := be_src & be_src & be_src & be_src; - when "01" => - result := be_src & be_src & be_src & '0'; - when "10" => - result := be_src & be_src & "00"; - when "11" => - result := be_src & "000"; - when others => - result := "0000"; - end case; - else - case va is - when "00" => - result := "000" & be_src; - when "01" => - result := "00" & be_src & be_src; - when "10" => - result := '0' & be_src & be_src & be_src; - when "11" => - result := be_src & be_src & be_src & be_src; - when others => - result := "0000"; - end case; + result := (3 downto 0 => be_src); + if bypass = '0' then + if word2_en = '1' then + case va is + when "00" => + result := "00" & be_src & be_src; + when "10" => + result := be_src & be_src & "00"; + when others => null; + end case; + elsif word4_en = '1' then + case va is + when "00" => + result := "000" & be_src; + when "01" => + result := "00" & be_src & '0'; + when "10" => + result := '0' & be_src & "00"; + when "11" => + result := be_src & "000"; + when others => null; + end case; + elsif align_left = '1' then + case va is + when "00" => + result := be_src & be_src & be_src & be_src; + when "01" => + result := be_src & be_src & be_src & '0'; + when "10" => + result := be_src & be_src & "00"; + when "11" => + result := be_src & "000"; + when others => null; + end case; + else + case va is + when "00" => + result := "000" & be_src; + when "01" => + result := "00" & be_src & be_src; + when "10" => + result := '0' & be_src & be_src & be_src; + when "11" => + result := be_src & be_src & be_src & be_src; + when others => null; + end case; + end if; end if; 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 variable result : unsigned(3 downto 0); begin - if bypass = '1' then - result := (3 downto 0 => '1'); - elsif align_left = '1' then - case va is - when "00" => - result := "1000"; - when "01" => - result := "1100"; - when "10" => - result := "1110"; - when "11" => - result := "1111"; - when others => - result := "0000"; - end case; - else - case va is - when "00" => - result := "1111"; - when "01" => - result := "0111"; - when "10" => - result := "0011"; - when "11" => - result := "0001"; - when others => - result := "0000"; - end case; + result := (3 downto 0 => '1'); + if bypass = '0' then + if align_left = '1' then + case va is + when "00" => + result := "1000"; + when "01" => + result := "1100"; + when "10" => + result := "1110"; + when "11" => + result := "1111"; + when others => null; + end case; + else + case va is + when "00" => + result := "1111"; + when "01" => + result := "0111"; + when "10" => + result := "0011"; + when "11" => + result := "0001"; + when others => null; + end case; + end if; end if; return result;