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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [arm/] [armiu.vhd] - Blame information for rev 2

Go to most recent revision | 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.corelib.all;
8
use work.config.all;
9
use work.memdef.all;
10
use work.arm_comp.all;
11
use work.armpctrl.all;
12
use work.armcoproc.all;
13
use work.armcp_comp.all;
14
use work.cache_comp.all;
15
 
16
entity armiu is
17
  port (
18
    rst     : in  std_logic;
19
    clk     : in  std_logic;
20
    clkn    : in  std_logic;
21
    hold    : in cli_hold;
22
    ici     : out genic_type_in;
23
    ico     : in genic_type_out;
24
    dci     : out gendc_type_in;
25
    dco     : in gendc_type_out;
26
    i       : in  armiu_typ_in;
27
    o       : out armiu_typ_out
28
    );
29
end armiu;
30
 
31
architecture rtl of armiu is
32
 
33
  type armiu_tmp_type is record
34
    o       : armiu_typ_out;
35
    pstate  : apc_pstate;
36
    armiu_imstgi : armiu_imstg_typ_in;
37
    armiu_festgi : armiu_festg_typ_in;
38
    armiu_destgi : armiu_destg_typ_in;
39
    armiu_drstgi : armiu_drstg_typ_in;
40
    armiu_rrstgi : armiu_rrstg_typ_in;
41
    armiu_rsstgi : armiu_rsstg_typ_in;
42
    armiu_exstgi : armiu_exstg_typ_in;
43
    armiu_dmstgi : armiu_dmstg_typ_in;
44
    armiu_mestgi : armiu_mestg_typ_in;
45
    armiu_wrstgi : armiu_wrstg_typ_in;
46
    drid : std_logic_vector(2 downto 0);
47
    rrid : std_logic_vector(2 downto 0);
48
    rsid : std_logic_vector(2 downto 0);
49
    exid : std_logic_vector(2 downto 0);
50
    dmid : std_logic_vector(2 downto 0);
51
    meid : std_logic_vector(2 downto 0);
52
    wrid : std_logic_vector(2 downto 0);
53
    exclear : std_logic;
54
    wrclear : std_logic;
55
    addrvir : std_logic_vector(31 downto 0);
56
    branch : std_logic;
57
 
58
    ici : genic_type_in;
59
    dci : gendc_type_in;
60
 
61
    cpsyci  : aco_in;
62
  end record;
63
  type armiu_reg_type is record
64
    dummy      : std_logic;
65
  end record;
66
  type armiu_dbg_type is record
67
     dummy : std_logic;
68
     -- pragma translate_off
69
     dbg : armiu_tmp_type;
70
     -- pragma translate_on
71
  end record;
72
  signal r, c       : armiu_reg_type;
73
  signal rdbg, cdbg : armiu_dbg_type;
74
 
75
  -- iu
76
  signal armiu_imstgi : armiu_imstg_typ_in;
77
  signal armiu_imstgo : armiu_imstg_typ_out;
78
  signal armiu_festgi : armiu_festg_typ_in;
79
  signal armiu_festgo : armiu_festg_typ_out;
80
  signal armiu_destgi : armiu_destg_typ_in;
81
  signal armiu_destgo : armiu_destg_typ_out;
82
  signal armiu_drstgi : armiu_drstg_typ_in;
83
  signal armiu_drstgo : armiu_drstg_typ_out;
84
  signal armiu_rrstgi : armiu_rrstg_typ_in;
85
  signal armiu_rrstgo : armiu_rrstg_typ_out;
86
  signal armiu_rsstgi : armiu_rsstg_typ_in;
87
  signal armiu_rsstgo : armiu_rsstg_typ_out;
88
  signal armiu_exstgi : armiu_exstg_typ_in;
89
  signal armiu_exstgo : armiu_exstg_typ_out;
90
  signal armiu_dmstgi : armiu_dmstg_typ_in;
91
  signal armiu_dmstgo : armiu_dmstg_typ_out;
92
  signal armiu_mestgi : armiu_mestg_typ_in;
93
  signal armiu_mestgo : armiu_mestg_typ_out;
94
  signal armiu_wrstgi : armiu_wrstg_typ_in;
95
  signal armiu_wrstgo : armiu_wrstg_typ_out;
96
 
97
  -- coprocessors
98
  signal cpsyci  : aco_in;
99
  signal cpsyco  : aco_out;
100
 
101
begin
102
 
103
  p0: process (clk, clkn, rst, r, hold, i, ico, dco,
104
               armiu_imstgo, armiu_festgo, armiu_destgo, armiu_drstgo,
105
               armiu_rrstgo, armiu_rsstgo, armiu_exstgo, armiu_dmstgo,
106
               armiu_mestgo, armiu_wrstgo,
107
               cpsyco )
108
    variable v    : armiu_reg_type;
109
    variable t    : armiu_tmp_type;
110
    variable vdbg : armiu_dbg_type;
111
  begin
112
 
113
    -- $(init(t:armiu_tmp_type))
114
 
115
    v := r;
116
 
117
    t.pstate.hold_r := hold;
118
    t.pstate.nextinsn_v := armiu_drstgo.nextinsn_v;
119
    t.pstate.fromEX_cpsr_r := armiu_exstgo.cpsr_r;
120
 
121
    t.pstate.fromRR_pctrl_r := armiu_rrstgo.pctrl_r;
122
    t.pstate.fromRS_pctrl_r := armiu_rsstgo.pctrl_r;
123
    t.pstate.fromEX_pctrl_r := armiu_exstgo.pctrl_r;
124
    t.pstate.fromDM_pctrl_r := armiu_dmstgo.pctrl_r;
125
    t.pstate.fromME_pctrl_r := armiu_mestgo.pctrl_r;
126
    t.pstate.fromWR_pctrl_r := armiu_wrstgo.pctrl_r;
127
 
128
    t.armiu_imstgi.pstate := t.pstate;
129
    t.armiu_festgi.pstate := t.pstate;
130
    t.armiu_destgi.pstate := t.pstate;
131
    t.armiu_drstgi.pstate := t.pstate;
132
    t.armiu_rrstgi.pstate := t.pstate;
133
    t.armiu_rsstgi.pstate := t.pstate;
134
    t.armiu_exstgi.pstate := t.pstate;
135
    t.armiu_dmstgi.pstate := t.pstate;
136
    t.armiu_mestgi.pstate := t.pstate;
137
    t.armiu_wrstgi.pstate := t.pstate;
138
 
139
    -- festg:
140
    t.armiu_festgi.ico := ico;
141
    t.armiu_festgi.fromIM_addrphy_v   := armiu_imstgo.toFE_addrphy_v;
142
    t.armiu_festgi.fromIM_addrvir_v   := armiu_imstgo.toFE_addrvir_v;
143
    t.armiu_festgi.fromIM_addrvalid_v := armiu_imstgo.toFE_addrvalid_v;
144
    t.armiu_festgi.fromIM_branch_v    := armiu_imstgo.toFE_branch_v;
145
    t.armiu_festgi.fromIM_trap_v      := armiu_imstgo.toFE_trap_v;
146
    t.ici := armiu_festgo.ici;
147
 
148
    -- destg:
149
    t.armiu_destgi.fromFE_insn_v := armiu_festgo.toDE_insn_v;
150
    t.armiu_destgi.fromFE_insn_r := armiu_festgo.toDE_insn_r;
151
 
152
    -- drstg:
153
    t.armiu_drstgi.fromDE_insn_v := armiu_destgo.toDR_insn_v;
154
    t.armiu_drstgi.fromDE_insn_r := armiu_destgo.toDR_insn_r;
155
    t.armiu_drstgi.fromRR_nextmicro_v := armiu_rrstgo.toDR_nextmicro_v;
156
    t.armiu_drstgi.fromWR_dabort_v := armiu_wrstgo.toDR_dabort_v;
157
 
158
    -- rrstg:
159
    t.armiu_rrstgi.fromDR_micro_v := armiu_drstgo.toRR_micro_v;
160
    t.armiu_rrstgi.fromEX_alures_v := armiu_exstgo.alures_v;
161
    t.armiu_rrstgi.fromWR_rd_v       := armiu_wrstgo.toRR_rd_v;
162
    t.armiu_rrstgi.fromWR_rd_valid_v := armiu_wrstgo.toRR_rd_valid_v;
163
    t.armiu_rrstgi.fromWR_rd_data_v  := armiu_wrstgo.toRR_rd_data_v;
164
 
165
    -- rsstg:
166
    t.armiu_rsstgi.fromRR_pctrl_v := armiu_rrstgo.toRS_pctrl_v;
167
    t.armiu_rsstgi.fromEX_alures_v := armiu_exstgo.alures_v;
168
    t.armiu_rsstgi.fromEX_cpsr_v := armiu_exstgo.cpsr_v;
169
 
170
    -- exstg:
171
    t.armiu_exstgi.fromRS_pctrl_v := armiu_rsstgo.toEX_pctrl_v;
172
    t.armiu_exstgi.fromWR_spsr_r    := armiu_wrstgo.spsr_r;
173
    t.armiu_exstgi.fromWR_cpsr_v    := armiu_wrstgo.toEX_cpsr_v;
174
    t.armiu_exstgi.fromWR_cpsrset_v := armiu_wrstgo.toEX_cpsrset_v;
175
 
176
    -- dmstg:
177
    t.armiu_dmstgi.fromEX_pctrl_v := armiu_exstgo.toDM_pctrl_v;
178
 
179
    -- mestg:
180
    t.armiu_mestgi.fromDM_pctrl_v := armiu_dmstgo.toME_pctrl_v;
181
    t.dci := armiu_mestgo.dci;
182
    t.armiu_mestgi.irqo := i.irqo;
183
 
184
    -- wrstg:
185
    t.armiu_wrstgi.fromME_pctrl_v := armiu_mestgo.toWR_pctrl_v;
186
    t.armiu_wrstgi.dco := dco;
187
    t.o.irqi := armiu_wrstgo.irqi;
188
 
189
-- clear on:
190
-- exstgtrap    x         x         x         x         x                                                  
191
-- regbra       x         x         x         x         x                                                  
192
-- wrbra        x         x         x         x         x         x         x         x                      
193
-- wrstgtrap    x         x         x         x         x         x         x         x
194
-- (nextaddr)  (clr)     (clr)     (clr)     (clr)     (clr)     (clr)     (clr)     (clr)
195
--   +----------+---------+---------+---------+---------+---------+-----+---+---------+---------------+
196
--   V          V         V         V         V         V         V     |   V         V               |
197
--  +---------+---------+---------+---------+---------+---------+-------+-+---------+---------+-------+-+
198
--  |IMSTG    |FESTG    |DESTG    |DRSTG    |RRSTG    |RSSTG    |EXSTG  | |DMSTG    |MESTG    |WRSTG  | |
199
--  |         |         |         |         |         |         | regbra+ |         |         |  wrbra+ |
200
--  |         |         |         |tundef-+ |         |         |       | |         |         |       | |
201
--  |         |   mexc+ |         |tswi  -+ |         |         |       | |         |  tdabrt-+tdabrt-+ |
202
--  | tprfch+-+-------+-+---------+-------+-+---------+---------+-------+ |         |         |       | |
203
--  +-------+-+-------+-+---------+-------+-+---------+---------+---------+---------+---------+-------+-+
204
--   / \    |         |                   V                                                           |   
205
--    |     |         |        pctrl.trap:+-----------------------------------------------------------+   
206
--    +-----+---------+-------------------+
207
--    (idle until wrbra)
208
 
209
    t.armiu_imstgi.flush_v := '0';
210
    t.armiu_festgi.flush_v := '0';
211
    t.armiu_destgi.flush_v := '0';
212
    t.armiu_drstgi.flush_v := '0';
213
    t.armiu_rrstgi.flush_v := '0';
214
    t.armiu_rsstgi.flush_v := '0';
215
    t.armiu_exstgi.flush_v := '0';
216
    t.armiu_dmstgi.flush_v := '0';
217
    t.armiu_mestgi.flush_v := '0';
218
 
219
    t.exclear := '0';
220
    t.wrclear := '0';
221
    if armiu_exstgo.flush_v = '1' then
222
      t.exclear := '1';
223
    end if;
224
    if armiu_wrstgo.toIM_branch_v = '1' then
225
      t.wrclear := '1';
226
    end if;
227
 
228
    -- reset
229
    if ( rst = '0' ) then
230
    end if;
231
 
232
    t.drid := armiu_drstgo.id;
233
    t.rrid := armiu_rrstgo.pctrl_r.insn.id;
234
    t.rsid := armiu_rsstgo.pctrl_r.insn.id;
235
    t.exid := armiu_exstgo.pctrl_r.insn.id;
236
    t.dmid := armiu_dmstgo.pctrl_r.insn.id;
237
    t.meid := armiu_mestgo.pctrl_r.insn.id;
238
    t.wrid := armiu_wrstgo.pctrl_r.insn.id;
239
 
240
    if t.exclear = '1' or t.wrclear = '1' then
241
      t.armiu_imstgi.flush_v := '1';
242
      t.armiu_festgi.flush_v := '1';
243
      t.armiu_destgi.flush_v := '1';
244
      if apc_is_flush(t.drid,t.exid) then
245
        t.armiu_drstgi.flush_v := '1';
246
      end if;
247
      if apc_is_flush(t.rrid,t.exid) then
248
        t.armiu_rrstgi.flush_v := '1';
249
      end if;
250
      if apc_is_flush(t.rsid,t.exid) then
251
        t.armiu_rsstgi.flush_v := '1';
252
      end if;
253
    end if;
254
    if t.wrclear = '1' then
255
      if apc_is_flush(t.exid,t.wrid) then
256
        t.armiu_exstgi.flush_v := '1';
257
      end if;
258
      if apc_is_flush(t.dmid,t.wrid) then
259
        t.armiu_dmstgi.flush_v := '1';
260
      end if;
261
      if apc_is_flush(t.meid,t.wrid) then
262
        t.armiu_mestgi.flush_v := '1';
263
      end if;
264
    end if;
265
 
266
    -- branch address
267
    t.addrvir := armiu_exstgo.alures_v;
268
    t.branch := '0';
269
    if armiu_exstgo.toIM_branch_v = '1' then
270
      t.addrvir := armiu_exstgo.alures_v;
271
      t.branch := '1';
272
    end if;
273
    if armiu_wrstgo.toIM_branch_v = '1' then
274
      t.addrvir := armiu_wrstgo.toIM_branchaddr_v;
275
      t.branch := '1';
276
    end if;
277
    t.armiu_imstgi.branch_v := t.branch;
278
    t.armiu_imstgi.addrvir_v := t.addrvir;
279
 
280
 
281
--                                            locking>|<
282
--  +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
283
--  |IMSTG    |FESTG    |DESTG    |DRSTG    |RRSTG    |RSSTG    |EXSTG    |DMSTG    |MESTG    |WRSTG    |
284
--  |         |         |         |         |         |         |take     |         |         |         |
285
--  |         |         |         |[undef]  |         |         |[undef]  |         |         |         |
286
--  |         |         |         |         |         |         |         |         |         |         |
287
--  |         |         |[insn]   |         |         |         |         |         |         |         |
288
--  +---------+---------++--------++--------+-+-------+---------+---------+---------+---------+-------+-+
289
--                       V         /\         /\                                                      V   
290
--                      ++--------++--------+-+-------+---------+---------+---------+---------+-------+-+           
291
--                      |         | ldc/stc | reg/lock|                                       |ldc/mrc| |         
292
--                      |         | ctrl    | stc/mcr |                                       |[reg] <+ |         
293
--                      |         | busy    |cpd-lock |                                       |commit   |                 
294
--                      |         |         |         |                                       |use id   | 
295
--                      +---------+---------+---------+                                       +---------+           
296
--                          FE        DEC       EX                                                                   
297
--                      |<  DRSTG.netxinsn controled >|
298
--  
299
 
300
    -- todo: check valid, not correct
301
    t.cpsyci.hold_r := hold;
302
    -- coprocessor: PR-DESTG -> CP-FESTG
303
    t.cpsyci.fromPRDE_insn := lmd_convert ( armiu_festgo.toDE_insn_r.insn, CFG_BO_INSN, CFG_BO_PROC );
304
    t.cpsyci.fromPRDE_valid := armiu_festgo.toDE_insn_r.valid;
305
    -- PR-DRSTG -> CP-DESTG
306
    t.cpsyci.fromPRDR_nextinsn_v := armiu_drstgo.nextinsn_v;
307
    t.cpsyci.fromPRDR_valid := armiu_destgo.toDR_insn_r.insn.valid;
308
    -- PR-RRSTG -> CP-EXSTG
309
    t.cpsyci.fromPRRR_valid := armiu_rrstgo.pctrl_r.valid;
310
    -- PR-WRSTG -> CP-WRSTG
311
    t.cpsyci.fromPRWR_data_v := armiu_wrstgo.toCPWR_crd_data_v;
312
    t.cpsyci.fromPRWR_valid := armiu_wrstgo.pctrl_r.valid;
313
 
314
    -- PR-DRSTG <- CP-DESTG
315
    t.armiu_drstgi.fromCPDE_busy := '0';
316
    t.armiu_drstgi.fromCPDE_last := '1';
317
    t.armiu_drstgi.fromCPDE_accept := '0';
318
    case armiu_destgo.toDR_insn_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
319
      when "1111" =>                    -- sysctrl coprocessor
320
         -- PR-DRSTG <- CP-DESTG
321
         t.armiu_drstgi.fromCPDE_busy := cpsyco.CPDE_PRDR.busy;
322
         t.armiu_drstgi.fromCPDE_last := cpsyco.CPDE_PRDR.last;
323
         t.armiu_drstgi.fromCPDE_accept := cpsyco.CPDE_PRDR.accept;
324
      when others => null;
325
    end case;
326
    -- PR-RRSTG <- CP-EXSTG
327
    case armiu_rrstgo.pctrl_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
328
      when "1111" =>                    -- sysctrl coprocessor
329
        -- PR-RRSTG <- CP-EXSTG
330
         t.armiu_rrstgi.fromCPEX_data := cpsyco.CPEX_PRRR.data;
331
         t.armiu_rrstgi.fromCPEX_lock := cpsyco.CPEX_PRRR.lock;
332
      when others => null;
333
    end case;
334
 
335
    c <= v;
336
 
337
    o <= t.o;
338
    armiu_imstgi <= t.armiu_imstgi;
339
    armiu_festgi <= t.armiu_festgi;
340
    armiu_destgi <= t.armiu_destgi;
341
    armiu_drstgi <= t.armiu_drstgi;
342
    armiu_rrstgi <= t.armiu_rrstgi;
343
    armiu_rsstgi <= t.armiu_rsstgi;
344
    armiu_exstgi <= t.armiu_exstgi;
345
    armiu_dmstgi <= t.armiu_dmstgi;
346
    armiu_mestgi <= t.armiu_mestgi;
347
    armiu_wrstgi <= t.armiu_wrstgi;
348
    cpsyci <= t.cpsyci;
349
 
350
    ici <= t.ici;
351
    dci <= t.dci;
352
 
353
    -- pragma translate_off
354
    vdbg := rdbg;
355
    vdbg.dbg := t;
356
    cdbg <= vdbg;
357
    -- pragma translate_on  
358
 
359
  end process p0;
360
 
361
  pregs : process (clk, c)
362
  begin
363
    if rising_edge(clk) then
364
      r <= c;
365
      -- pragma translate_off
366
      rdbg <= cdbg;
367
      -- pragma translate_on
368
    end if;
369
  end process;
370
 
371
  imstg0:  armiu_imstg port map ( rst, clk, armiu_imstgi, armiu_imstgo);
372
  festg0:  armiu_festg port map ( rst, clk, armiu_festgi, armiu_festgo);
373
  destg0:  armiu_destg port map ( rst, clk, armiu_destgi, armiu_destgo);
374
  drstg0:  armiu_drstg port map ( rst, clk, armiu_drstgi, armiu_drstgo);
375
  rrstg0:  armiu_rrstg port map ( rst, clk, clkn, armiu_rrstgi, armiu_rrstgo);
376
  rsstg0:  armiu_rsstg port map ( rst, clk, armiu_rsstgi, armiu_rsstgo);
377
  exstg0:  armiu_exstg port map ( rst, clk, armiu_exstgi, armiu_exstgo);
378
  dmstg0:  armiu_dmstg port map ( rst, clk, armiu_dmstgi, armiu_dmstgo);
379
  mestg0:  armiu_mestg port map ( rst, clk, armiu_mestgi, armiu_mestgo);
380
  wrstg0:  armiu_wrstg port map ( rst, clk, armiu_wrstgi, armiu_wrstgo);
381
 
382
  cpsys0:  armcp_sctrl port map ( rst, clk, cpsyci, cpsyco );
383
 
384
end rtl;

powered by: WebSVN 2.1.0

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