From 3de1c312bb20faa9b60aa8d318beeddd9bc2259e Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 5 May 2009 11:07:02 +0000 Subject: [PATCH] - removed register output latch (latch introduced global clock buffer, which is deprecated) - added separate reg_pointer for read/write 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@470 cc03376c-175c-47c8-b038-4cd826a8556b --- lib/CPUs/MIPS/src/core/mips_cop.vhd | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/CPUs/MIPS/src/core/mips_cop.vhd b/lib/CPUs/MIPS/src/core/mips_cop.vhd index 8517910..8d63030 100644 --- a/lib/CPUs/MIPS/src/core/mips_cop.vhd +++ b/lib/CPUs/MIPS/src/core/mips_cop.vhd @@ -77,6 +77,8 @@ architecture Behavioral of cop is signal EB_reg : STD_LOGIC; signal icache_info : unsigned(7 downto 0); signal dcache_info : unsigned(7 downto 0); + signal reg_rptr : reg_ptr_t; + signal reg_wptr : reg_ptr_t; type cop_pipe_t is record opc : opcode_t; @@ -364,15 +366,22 @@ cop_pipe: cop_pipe_EX.re <= '0'; elsif ctrl_in.sdu.stall_all = '0' then cop_pipe_EX <= cop_pipe_ID; + if cop_pipe_ID.we = '1' then + reg_wptr <= cop_pipe_ID.reg_ptr; + end if; + if cop_pipe_ID.re = '1' then + reg_rptr <= cop_pipe_ID.reg_ptr; + end if; end if; end if; end process; cop_register_read: - process(cop_pipe_EX, BadVAddr, status, cause, epc, dcache_info, icache_info, test_reg) + process(reg_rptr, BadVAddr, status, cause, epc, dcache_info, icache_info, test_reg) variable reg : word_t; begin - case cop_pipe_EX.reg_ptr is + + case reg_rptr is when "01000" => -- BadVAddr reg := BadVAddr; @@ -396,10 +405,7 @@ cop_register_read: end case; - -- Output latch - if cop_pipe_EX.re = '1' then - dout <= reg after 2 ns; - end if; + dout <= reg after 2 ns; end process; @@ -420,7 +426,7 @@ cop_we_gen: ip_reg_we <= '0'; if cop_pipe_EX.we = '1' then - case cop_pipe_EX.reg_ptr is + case reg_wptr is when "01100" => stat_reg_we <= '1'; -- not status(1) or status(28);