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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [arm/] [cp/] [armcp_sctrl.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tarookumic
-- $(lic)
2
-- $(help_generic)
3
-- $(help_local)
4
 
5
library ieee;
6
use ieee.std_logic_1164.all;
7
use work.int.all;
8
use work.armcoproc.all;
9
use work.armsctrl.all;
10
use work.armcp_comp.all;
11
 
12
entity armcp_sctrl is
13
  port (
14
    rst     : in  std_logic;
15
    clk     : in  std_logic;
16
    i       : in  aco_in;
17
    o       : out aco_out
18
    );
19
end armcp_sctrl;
20
 
21
architecture rtl of armcp_sctrl is
22
 
23
  type armcp_sctrl_insn_type is record
24
    decinsn : aco_decinsn;
25
    cr1, cr2 : std_logic_vector(ACO_CREG_U downto ACO_CREG_D);
26
    opc : std_logic_vector(ACO_COPC_U downto ACO_COPC_D);
27
    valid : std_logic;
28
  end record;
29
  type armcp_sctrl_dereg_type is record
30
    insn : armcp_sctrl_insn_type;
31
    CPDE_PRDR : aco_CPDE_PRDR_out;
32
  end record;
33
  type armcp_sctrl_exreg_type is record
34
    insn : armcp_sctrl_insn_type;
35
    CPEX_PRRR : aco_CPEX_PRRR_out;
36
  end record;
37
  type armcp_sctrl_wrreg_type is record
38
    insn : armcp_sctrl_insn_type;
39
  end record;
40
  type armcp_sctrl_wrreg_type_a is array (natural range <>) of armcp_sctrl_wrreg_type;
41
  type armcp_sctrl_reg_type is record
42
    de : armcp_sctrl_dereg_type;
43
    ex : armcp_sctrl_exreg_type;
44
    wr : armcp_sctrl_wrreg_type_a(4 downto 0);
45
    regs : acpsc_regs;
46
    regslock : std_logic_vector (3 downto 0);
47
  end record;
48
  type armcp_sctrl_tmp_type is record
49
    fe_de : armcp_sctrl_dereg_type;
50
    de_de : armcp_sctrl_dereg_type;
51
    de_ex : armcp_sctrl_exreg_type;
52
    ex_wr : armcp_sctrl_wrreg_type;
53
 
54
    regs : acpsc_regs;
55
    o : aco_out;
56
  end record;
57
 
58
  type armcp_sctrl_dbg_type is record
59
     dummy : std_logic;
60
     -- pragma translate_off
61
     dbg : armcp_sctrl_tmp_type;
62
     -- pragma translate_on
63
  end record;
64
  signal r, c       : armcp_sctrl_reg_type;
65
  signal rdbg, cdbg : armcp_sctrl_dbg_type;
66
 
67
begin
68
 
69
  p0: process (clk, rst, r, i  )
70
    variable v    : armcp_sctrl_reg_type;
71
    variable t    : armcp_sctrl_tmp_type;
72
    variable vdbg : armcp_sctrl_dbg_type;
73
  begin
74
 
75
--                                            locking>|<
76
--  +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
77
--  |IMSTG    |FESTG    |DESTG    |DRSTG    |RRSTG    |RSSTG    |EXSTG    |DMSTG    |MESTG    |WRSTG    |
78
--  |         |         |         |         |         |         |take     |         |         |         |
79
--  |         |         |         |[undef]  |         |         |[undef]  |         |         |         |
80
--  |         |         |         |         |         |         |         |         |         |         |
81
--  |         |         |[insn]   |         |         |         |         |         |         |         |
82
--  +---------+---------++--------++--------+-+-------+---------+---------+---------+---------+-------+-+
83
--                       V         /\         /\                                                      V   
84
--                      ++--------++--------+-+-------+---------+---------+---------+---------+-------+-+           
85
--                      |         | ldc/stc | reg/lock|                                       |ldc/mrc| |         
86
--                      |         | ctrl    | stc/mcr |                                       |[reg] <+ |         
87
--                      |         | busy    |         |                                       |commit   |                 
88
--                      |         |         |         |                                       |use id   | 
89
--                      +---------+---------+---------+                                       +---------+           
90
--                         CPFE      CPDEC     CPEX                                                                   
91
--                      |<  DRSTG.netxinsn controled >|
92
--
93
--
94
 
95
    -- $(init(t:armcp_sctrl_tmp_type))
96
 
97
    v := r;
98
 
99
    t.o.CPDE_PRDR := r.de.CPDE_PRDR;
100
    t.o.CPEX_PRRR := r.ex.CPEX_PRRR;
101
 
102
-------------------------------------------------------------------------------
103
    -- CPFESTG
104
    t.fe_de.insn.decinsn := aco_decodev4(i.fromPRDE_insn);
105
    t.fe_de.CPDE_PRDR.active := '1';              -- udef trap
106
    t.fe_de.CPDE_PRDR.busy := '0';              -- drive ctrlo.hold
107
    t.fe_de.CPDE_PRDR.last := '1';              -- drive cmd_cl/cmd_cs issue
108
    t.fe_de.CPDE_PRDR.accept := '1';              -- udef trap
109
    t.fe_de.insn.cr1 := i.fromPRDE_insn(ACO_MCRMRC_CRN_U downto ACO_MCRMRC_CRN_D);
110
    t.fe_de.insn.cr2 := i.fromPRDE_insn(ACO_MCRMRC_CRM_U downto ACO_MCRMRC_CRM_D);
111
    t.fe_de.insn.opc := i.fromPRDE_insn(ACO_MCRMRC_OPCODE1_U downto ACO_MCRMRC_OPCODE1_D);
112
    t.fe_de.insn.valid := i.fromPRDE_valid;
113
    case t.fe_de.insn.decinsn is
114
      when ACO_type_none =>
115
      when ACO_type_cdp =>
116
      when ACO_type_mrc =>
117
      when ACO_type_mcr =>
118
      when ACO_type_stc =>
119
      when ACO_type_ldc =>
120
      when others =>
121
    end case;
122
 
123
-------------------------------------------------------------------------------
124
    -- CPDESTG
125
    t.de_de := r.de;
126
    t.de_ex.insn := r.de.insn;
127
    t.de_ex.insn.valid := t.de_ex.insn.valid and i.fromPRDR_valid;
128
    t.de_ex.CPEX_PRRR.lock := '0';
129
    t.de_ex.CPEX_PRRR.data := (others => '0');
130
    case r.de.insn.decinsn is
131
      when ACO_type_none =>
132
      when ACO_type_cdp =>
133
      when ACO_type_mrc |
134
           ACO_type_stc =>
135
      when ACO_type_mcr |
136
           ACO_type_ldc =>
137
        v.regslock(lin_convint(r.de.insn.cr1(1 downto 0))) := '1';
138
      when others =>
139
    end case;
140
 
141
-------------------------------------------------------------------------------
142
    -- CPEXSTG
143
    t.ex_wr.insn := r.ex.insn;
144
    t.ex_wr.insn.valid := t.ex_wr.insn.valid and i.fromPRRR_valid;
145
    case r.ex.insn.decinsn is
146
      when ACO_type_mrc =>
147
        t.o.CPEX_PRRR.lock := r.regslock(lin_convint(r.ex.insn.cr1(1 downto 0)));
148
        case r.ex.insn.cr1  is
149
          when "0000" =>
150
            case r.ex.insn.opc is
151
              when "000" => t.o.CPEX_PRRR.data := ACPSC_R0_OP0;
152
              when "001" => t.o.CPEX_PRRR.data := ACPSC_R0_OP1;
153
              when others => null;
154
            end case;
155
          when "0001" =>
156
            t.o.CPEX_PRRR.data := acpsc_r1tostd(r.regs.r1);
157
          when "0010" =>
158
            t.o.CPEX_PRRR.data := r.regs.r2;
159
          when others =>
160
        end case;
161
      when others =>
162
    end case;
163
 
164
-------------------------------------------------------------------------------
165
    -- CPWRSTG
166
    t.regs := r.regs;
167
    if r.wr(0).insn.valid = '1' and i.fromPRWR_valid = '1' then
168
      case r.wr(0).insn.decinsn is
169
        when ACO_type_none =>
170
        when ACO_type_cdp =>
171
        when ACO_type_mrc =>
172
        when ACO_type_mcr |
173
             ACO_type_ldc =>
174
          v.regslock(lin_convint(r.wr(0).insn.cr1(1 downto 0))) := '0';
175
          case r.wr(0).insn.cr1  is
176
            when "0001" =>
177
              acpsc_stdtor1( i.fromPRWR_data_v, t.regs.r1);
178
            when "0010" =>
179
              t.regs.r2 := i.fromPRWR_data_v;
180
            when others =>
181
          end case;
182
        when ACO_type_stc =>
183
        when others =>
184
      end case;
185
    end if;
186
 
187
-------------------------------------------------------------------------------
188
 
189
    t.ex_wr.insn.valid := i.fromPRDR_nextinsn_v;
190
    if i.hold_r.hold = '0' then
191
      if i.fromPRDR_nextinsn_v = '1' then
192
        -- CPFESTG -> CPDESTG
193
        v.de := t.fe_de;
194
        -- CPDESTG -> CPEXSTG
195
        v.ex := t.de_ex;
196
      end if;
197
 
198
      -- CPEXSTG ->...-> CPWRSTG
199
      for i in 3 downto 0 loop
200
        v.wr(i) := r.wr(i+1);
201
      end loop;
202
      v.wr(4) := t.ex_wr;
203
 
204
      v.regs := t.regs;
205
    end if;
206
 
207
    -- reset
208
    if ( rst = '0' ) then
209
      v.regs.r1.mmu := '0';
210
      v.regslock := (others => '0');
211
    end if;
212
 
213
 
214
    c <= v;
215
 
216
    o <= t.o;
217
 
218
    -- pragma translate_off
219
    vdbg := rdbg;
220
    vdbg.dbg := t;
221
    cdbg <= vdbg;
222
    -- pragma translate_on  
223
 
224
  end process p0;
225
 
226
  pregs : process (clk, c)
227
  begin
228
    if rising_edge(clk) then
229
      r <= c;
230
      -- pragma translate_off
231
      rdbg <= cdbg;
232
      -- pragma translate_on
233
    end if;
234
  end process;
235
 
236
end rtl;

powered by: WebSVN 2.1.0

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