OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [rtl/] [riverlib/] [core/] [regibank.vhd] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sergeykhbr
-----------------------------------------------------------------------------
2
--! @file
3
--! @copyright Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
--! @author    Sergey Khabarov - sergeykhbr@gmail.com
5
--! @brief     Multi-port CPU Integer Registers memory.
6
------------------------------------------------------------------------------
7
 
8
library ieee;
9
use ieee.std_logic_1164.all;
10
library commonlib;
11
use commonlib.types_common.all;
12
--! RIVER CPU specific library.
13
library riverlib;
14
--! RIVER CPU configuration constants.
15
use riverlib.river_cfg.all;
16
 
17
 
18
entity RegIntBank is
19
  port (
20
    i_clk : in std_logic;                                   -- CPU clock
21
    i_nrst : in std_logic;                                  -- Reset. Active LOW.
22
 
23
    i_radr1 : in std_logic_vector(4 downto 0);              -- Port 1 read address
24
    o_rdata1 : out std_logic_vector(RISCV_ARCH-1 downto 0); -- Port 1 read value
25
 
26
    i_radr2 : in std_logic_vector(4 downto 0);              -- Port 2 read address
27
    o_rdata2 : out std_logic_vector(RISCV_ARCH-1 downto 0); -- Port 2 read value
28
 
29
    i_waddr : in std_logic_vector(4 downto 0);              -- Writing value
30
    i_wena : in std_logic;                                  -- Writing is enabled
31
    i_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);   -- Writing value
32
 
33
    i_dport_addr : in std_logic_vector(4 downto 0);         -- Debug port address
34
    i_dport_ena : in std_logic;                             -- Debug port is enabled
35
    i_dport_write : in std_logic;                           -- Debug port write is enabled
36
    i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0); -- Debug port write value
37
    o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0);-- Debug port read value
38
 
39
    o_ra : out std_logic_vector(RISCV_ARCH-1 downto 0)      -- Return address for branch predictor
40
  );
41
end;
42
 
43
architecture arch_RegIntBank of RegIntBank is
44
 
45
  type MemoryType is array (0 to Reg_Total-1)
46
         of std_logic_vector(RISCV_ARCH-1 downto 0);
47
 
48
  type RegistersType is record
49
      mem : MemoryType;
50
  end record;
51
 
52
  signal r, rin : RegistersType;
53
 
54
begin
55
 
56
  comb : process(i_nrst, i_radr1, i_radr2, i_waddr, i_wena, i_wdata,
57
                 i_dport_ena, i_dport_write, i_dport_addr, i_dport_wdata, r)
58
    variable v : RegistersType;
59
  begin
60
 
61
    v := r;
62
    --! Debug port has higher priority. Collision must be controlled by SW
63
    if (i_dport_ena and i_dport_write) = '1' then
64
        if i_dport_addr /= "00000" then
65
            v.mem(conv_integer(i_dport_addr)) := i_dport_wdata;
66
        end if;
67
    elsif i_wena = '1'  then
68
        if i_waddr /= "00000" then
69
            v.mem(conv_integer(i_waddr)) := i_wdata;
70
        end if;
71
    end if;
72
 
73
    if i_nrst = '0' then
74
        v.mem(Reg_Zero) := (others => '0');
75
        for i in 1 to Reg_Total-1 loop
76
            v.mem(i) := X"00000000FEEDFACE";
77
        end loop;
78
    end if;
79
 
80
    rin <= v;
81
  end process;
82
 
83
  o_rdata1 <= r.mem(conv_integer(i_radr1));
84
  o_rdata2 <= r.mem(conv_integer(i_radr2));
85
  o_dport_rdata <= r.mem(conv_integer(i_dport_addr));
86
  o_ra <= r.mem(Reg_ra);
87
 
88
  -- registers:
89
  regs : process(i_clk)
90
  begin
91
     if rising_edge(i_clk) then
92
        r <= rin;
93
     end if;
94
  end process;
95
 
96
end;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.