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

Subversion Repositories ion

[/] [ion/] [trunk/] [vhdl/] [mips_cpu.vhdl] - Blame information for rev 23

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ja_rd
--------------------------------------------------------------------------------
2
-- ion_cpu.vhdl -- MIPS-I(tm) compatible CPU core
3
--------------------------------------------------------------------------------
4
-- project:       ION (http://www.opencores.org/project,ion_cpu)
5
-- author:        Jose A. Ruiz (ja_rd@hotmail.com)
6
-- created:       Jan/11/2011
7
-- last modified: Jan/25/2011 (ja_rd@hotmail.com)
8
--------------------------------------------------------------------------------
9
-- Software placed into the public domain by the author. Use under the terms of
10
-- the GPL.
11
-- Software 'as is' without warranty.  Author liable for nothing.
12
--------------------------------------------------------------------------------
13
-- NOTE: exceptions only partially implemented; jumps, loads and stores are
14
-- not aborted.
15
-- 
16
--
17
--------------------------------------------------------------------------------
18
--### PLASMA features not implemented yet
19
--  # MUL/DIV
20
--
21
--### MIPS-I things not implemented
22
--  # Invalid instruction detection
23
--  # Kernel/user status
24
--  # RTE instruction
25
--  # Most of the CP0 registers and of course all of the CP1
26
--  # External interrupts
27
--
28
--### Things implemented but not tested
29
--  # Syscall instruction (does a jal to 0x3c and that's it)
30
--  # Memory pause input
31
--
32
--### Things with provisional implementation
33
-- 
34
-- 1.- Load interlocks: the pipeline is stalled for every load instruction, even
35
--     if the target register is not used in the following instruction. So that
36
--     every load takes two cycles.
37
--     The interlock logic should check register indices.
38
--
39
-- 2.- Invalid instructions are not detected as such. Their behaviour is
40
--     undefined and inpredictable.
41
--     Invalid instructions should trigger an exception or at least just NOP.
42
--     This is closely related to privilege level so it will have to wait.
43
--------------------------------------------------------------------------------
44
 
45
library ieee;
46
use ieee.std_logic_1164.all;
47
use ieee.std_logic_arith.all;
48
use ieee.std_logic_unsigned.all;
49
use work.mips_pkg.all;
50
 
51
entity mips_cpu is
52
    generic(
53
        XILINX_REGBANK  : string  := "distributed" -- {distributed|block}
54
    );
55
    port(
56
        clk             : in std_logic;
57
        reset           : in std_logic;
58
        interrupt       : in std_logic;
59
 
60
        data_rd_addr    : out std_logic_vector(31 downto 0);
61
        data_rd         : in std_logic_vector(31 downto 0);
62
        data_rd_vma     : out std_logic;
63
 
64
        code_rd_addr    : out std_logic_vector(31 downto 2);
65
        code_rd         : in std_logic_vector(31 downto 0);
66
        code_rd_vma     : out std_logic;
67
 
68
        data_wr_addr    : out std_logic_vector(31 downto 2);
69
        byte_we         : out std_logic_vector(3 downto 0);
70
        data_wr         : out std_logic_vector(31 downto 0);
71 23 ja_rd
 
72 2 ja_rd
        mem_wait        : in std_logic
73
    );
74
end; --entity mips_cpu
75
 
76
architecture rtl of mips_cpu is
77
 
78
--------------------------------------------------------------------------------
79
-- Pipeline stage 0
80
 
81
signal p0_pc_reg :          t_pc;
82 8 ja_rd
signal p0_pc_restart :      t_pc;
83 2 ja_rd
signal p0_pc_incremented :  t_pc;
84
signal p0_pc_jump :         t_pc;
85
signal p0_pc_branch :       t_pc;
86
signal p0_pc_target :       t_pc;
87
signal p0_pc_next :         t_pc;
88
signal p0_rs_num :          t_regnum;
89
signal p0_rt_num :          t_regnum;
90
signal p0_jump_cond_value : std_logic;
91
signal p0_rbank_rs_hazard : std_logic;
92
signal p0_rbank_rt_hazard : std_logic;
93
 
94
--------------------------------------------------------------------------------
95
-- Pipeline stage 1
96
 
97
 
98
signal p1_rbank :           t_rbank := (others => X"00000000");
99
 
100
-- IMPORTANT: This attribute is used by Xilinx tools to select how to implement
101
-- the register bank. If we don't use it, by default XST would infer 2 BRAMs for
102
-- the 1024-bit 3-port reg bank, which you probably don't want.
103
-- This can take the values {distributed|block}.
104
attribute ram_style :       string;
105
attribute ram_style of p1_rbank : signal is "distributed";
106
 
107
signal p1_rs, p1_rt :       t_word;
108
signal p1_rs_rbank :        t_word;
109
signal p1_rt_rbank :        t_word;
110
signal p1_rbank_forward :   t_word;
111
signal p1_rd_num :          t_regnum;
112
signal p1_rbank_wr_addr :   t_regnum;
113
signal p1_rbank_we :        std_logic;
114
signal p1_rbank_wr_data :   t_word;
115
signal p1_alu_inp1 :        t_word;
116
signal p1_alu_inp2 :        t_word;
117
signal p1_alu_outp :        t_word;
118
-- ALU control inputs (shortened name for brevity in expressions)
119
signal p1_ac :              t_alu_control;
120
-- ALU flag outputs (comparison results)
121
signal p1_alu_flags :       t_alu_flags;
122
-- immediate data, sign- or zero-extended as required by IR
123
signal p1_data_imm :        t_word;
124
signal p1_branch_offset :   t_pc;
125
signal p1_branch_offset_sex:std_logic_vector(31 downto 18);
126
signal p1_rbank_rs_hazard : std_logic;
127
signal p1_rbank_rt_hazard : std_logic;
128
signal p1_jump_type_set0 :  std_logic_vector(1 downto 0);
129
signal p1_jump_type_set1 :  std_logic_vector(1 downto 0);
130
signal p1_ir_reg :          std_logic_vector(31 downto 0);
131
signal p1_ir_op :           std_logic_vector(31 downto 26);
132
signal p1_ir_fn :           std_logic_vector(5 downto 0);
133
signal p1_op_special :      std_logic;
134
signal p1_exception :       std_logic;
135
signal p1_do_reg_jump :     std_logic;
136
signal p1_do_zero_ext_imm : std_logic;
137
signal p1_set_cp0 :         std_logic;
138
signal p1_get_cp0 :         std_logic;
139
signal p1_load_hi :         std_logic;
140
signal p1_load_lo :         std_logic;
141
signal p1_alu_op2_sel :     std_logic_vector(1 downto 0);
142
signal p1_alu_op2_sel_set0: std_logic_vector(1 downto 0);
143
signal p1_alu_op2_sel_set1: std_logic_vector(1 downto 0);
144
signal p1_do_load :         std_logic;
145
signal p1_do_store :        std_logic;
146
signal p1_store_size :      std_logic_vector(1 downto 0);
147
signal p1_we_control :      std_logic_vector(5 downto 0);
148
signal p1_load_alu :        std_logic;
149
signal p1_load_alu_set0 :   std_logic;
150
signal p1_load_alu_set1 :   std_logic;
151
signal p1_ld_upper_hword :  std_logic;
152
signal p1_ld_upper_byte :   std_logic;
153
signal p1_ld_unsigned :     std_logic;
154
signal p1_jump_type :       std_logic_vector(1 downto 0);
155
signal p1_link :            std_logic;
156
signal p1_jump_cond_sel :   std_logic_vector(2 downto 0);
157
signal p1_data_addr :       t_addr;
158
signal p1_data_offset :     t_addr;
159
 
160 12 ja_rd
signal p1_muldiv_result :   t_word;
161
signal p1_muldiv_func :     t_mult_function;
162
signal p1_muldiv_running :  std_logic;
163
signal p1_muldiv_started :  std_logic;
164
signal p1_muldiv_stall :    std_logic;
165
 
166 23 ja_rd
signal p1_unknown_opcode :  std_logic;
167 12 ja_rd
 
168 2 ja_rd
--------------------------------------------------------------------------------
169
-- Pipeline stage 2
170
 
171 12 ja_rd
signal p2_muldiv_started :  std_logic;
172 2 ja_rd
signal p2_exception :       std_logic;
173
signal p2_rd_addr :         std_logic_vector(1 downto 0);
174
signal p2_rd_mux_control :  std_logic_vector(3 downto 0);
175
signal p2_load_target :     t_regnum;
176
signal p2_do_load :         std_logic;
177
signal p2_ld_upper_hword :  std_logic;
178
signal p2_ld_upper_byte :   std_logic;
179
signal p2_ld_unsigned :     std_logic;
180
signal p2_wback_mux_sel :   std_logic_vector(1 downto 0);
181
signal p2_data_word_rd :    t_word;
182
signal p2_data_word_ext :   std_logic;
183
 
184
--------------------------------------------------------------------------------
185
-- Global control signals 
186
 
187
signal load_interlock :     std_logic;
188
signal stall_pipeline :     std_logic;
189
-- pipeline is stalled for any reason
190
signal pipeline_stalled :   std_logic;
191
-- pipeline is stalled because of a load instruction interlock
192
signal pipeline_interlocked:std_logic;
193
 
194
--------------------------------------------------------------------------------
195
-- CP0 registers and signals
196
 
197
-- CP0[12]: status register 
198
-- FIXME status flags unimplemented
199
signal cp0_status :         std_logic_vector(1 downto 0);
200
-- Output of CP0 register bank (only a few regs are implemented)
201
signal cp0_reg_read :       t_word;
202
-- CP0[14]: EPC register (PC value saved at exceptions)
203
signal cp0_epc :            t_pc;
204
 
205
begin
206
 
207
--##############################################################################
208
-- Register bank & datapath
209
 
210
-- Register indices are 'decoded' out of the instruction word BEFORE loading IR
211
p0_rs_num <= std_logic_vector(code_rd(25 downto 21));
212
with p1_ir_reg(31 downto 26) select p1_rd_num <=
213
    p1_ir_reg(15 downto 11)    when "000000",
214
    p1_ir_reg(20 downto 16)    when others;
215
 
216
p0_rt_num <= std_logic_vector(code_rd(20 downto 16)); -- also called rs2 in the docs
217
 
218
--------------------------------------------------------------------------------
219
-- Data input shifter & masker (LB,LBU,LH,LHU,LW)
220
 
221
p2_rd_mux_control <= p2_ld_upper_hword & p2_ld_upper_byte & p2_rd_addr;
222
 
223
-- Extension for unused bits will be zero or the sign (bit 7 or bit 15)
224
p2_data_word_ext <= '0'         when p2_ld_unsigned='1' else
225
                    data_rd(15)  when p2_ld_upper_byte='1' else
226
                    data_rd(7)   when p2_rd_addr="11" else
227
                    data_rd(15)  when p2_rd_addr="10" else
228
                    data_rd(23);
229
 
230
-- byte 0 may come from any of the 4 bytes of the input word
231
with p2_rd_mux_control select p2_data_word_rd(7 downto 0) <=
232
    data_rd(31 downto 24)        when "0000",
233
    data_rd(23 downto 16)        when "0001",
234
    data_rd(23 downto 16)        when "0100",
235
    data_rd(15 downto  8)        when "0010",
236
    data_rd( 7 downto  0)        when others;
237
 
238
-- byte 1 may come from input bytes 1 or 3 or may be extended for LB, LBU
239
with p2_rd_mux_control select p2_data_word_rd(15 downto 8) <=
240
    data_rd(31 downto 24)        when "0100",
241
    data_rd(15 downto  8)        when "0110",
242
    data_rd(15 downto  8)        when "1100",
243
    data_rd(15 downto  8)        when "1101",
244
    data_rd(15 downto  8)        when "1110",
245
    data_rd(15 downto  8)        when "1111",
246
    (others => p2_data_word_ext) when others;
247
 
248
-- bytes 2,3 come straight from input or are extended for LH,LHU
249
with p2_ld_upper_hword select p2_data_word_rd(31 downto 16) <=
250
    (others => p2_data_word_ext)    when '0',
251
    data_rd(31 downto 16)            when others;
252
 
253
-- Select which data is to be written back to the reg bank and where
254
p1_rbank_wr_addr <= p1_rd_num   when p2_do_load='0' and p1_link='0' else
255
                    "11111"     when p2_do_load='0' and p1_link='1' else
256
                    p2_load_target;
257
 
258
p2_wback_mux_sel <=
259
    "00" when p2_do_load='0' and p1_get_cp0='0' and p1_link='0' else
260
    "01" when p2_do_load='1' and p1_get_cp0='0' and p1_link='0' else
261
    "10" when p2_do_load='0' and p1_get_cp0='1' and p1_link='0' else
262
    "11";
263
 
264
with (p2_wback_mux_sel) select p1_rbank_wr_data <=
265
    p1_alu_outp                when "00",
266
    p2_data_word_rd            when "01",
267
    p0_pc_incremented & "00"   when "11",
268
    cp0_reg_read               when others;
269
 
270
p1_rbank_we <= '1' when (p2_do_load='1' or p1_load_alu='1' or
271
                        p1_link='1' or p1_get_cp0='1') and
272
                        p1_rbank_wr_addr/="00000" and
273
                        -- on exception, abort next instruction (by preventing 
274
                        -- regbank writeback).
275
                        p2_exception='0'
276
                else '0';
277
 
278
-- Register bank as triple-port RAM. Should synth to 2 BRAMs unless you use
279
-- synth attributes to prevent it (see 'ram_style' attribute above) or your
280
-- FPGA has 3-port BRAMS, or has none.
281
synchronous_reg_bank:
282
process(clk)
283
begin
284
    if clk'event and clk='1' then
285
        if p1_rbank_we='1' and
286
           (pipeline_stalled='0' or pipeline_interlocked='1') then -- @note1
287
            p1_rbank(conv_integer(p1_rbank_wr_addr)) <= p1_rbank_wr_data;
288
        end if;
289
        p1_rt_rbank <= p1_rbank(conv_integer(p0_rt_num));
290
        p1_rs_rbank <= p1_rbank(conv_integer(p0_rs_num));
291
    end if;
292
end process synchronous_reg_bank;
293
 
294
-- Register writeback data in case it needs to be forwarded.
295
data_forward_register:
296
process(clk)
297
begin
298
    if clk'event and clk='1' then
299
        if p1_rbank_we='1' then -- no need to check for stall cycles
300
            p1_rbank_forward <= p1_rbank_wr_data;
301
        end if;
302
    end if;
303
end process data_forward_register;
304
 
305
-- Bypass sync RAM if we're reading and writing to the same address. This saves
306
-- 1 stall cycle and fixes the data hazard.
307
p0_rbank_rs_hazard <= '1' when p1_rbank_wr_addr=p0_rs_num and p1_rbank_we='1'
308
                      else '0';
309
p0_rbank_rt_hazard <= '1' when p1_rbank_wr_addr=p0_rt_num and p1_rbank_we='1'
310
                      else '0';
311
 
312
p1_rs <= p1_rs_rbank when p1_rbank_rs_hazard='0' else p1_rbank_forward;
313
p1_rt <= p1_rt_rbank when p1_rbank_rt_hazard='0' else p1_rbank_forward;
314
 
315
-- Zero extension/Sign extension for instruction immediate data
316
p1_data_imm(15 downto 0)  <= p1_ir_reg(15 downto 0);
317
 
318
with p1_do_zero_ext_imm select p1_data_imm(31 downto 16) <=
319
    (others => '0')             when '1',
320
    (others => p1_ir_reg(15))   when others;
321
 
322
 
323
--------------------------------------------------------------------------------
324
-- ALU & ALU input multiplexors
325
 
326
p1_alu_inp1 <= p1_rs;
327
 
328
with p1_alu_op2_sel select p1_alu_inp2 <=
329 12 ja_rd
    p1_data_imm         when "11",
330 23 ja_rd
    p1_muldiv_result    when "01",
331
    --p1_muldiv_result    when "10", -- FIXME mux input wasted!
332 12 ja_rd
    p1_rt               when others;
333 2 ja_rd
 
334
alu_inst : entity work.mips_alu
335
    port map (
336
        clk             => clk,
337
        reset           => reset,
338
        ac              => p1_ac,
339
        flags           => p1_alu_flags,
340
 
341
        inp1            => p1_alu_inp1,
342
        inp2            => p1_alu_inp2,
343
        outp            => p1_alu_outp
344
    );
345
 
346
 
347
--------------------------------------------------------------------------------
348
-- Mul/Div block interface
349
 
350 12 ja_rd
-- Compute the mdiv block function word. If p1_muldiv_func has any value other
351
-- than MULT_NOTHING a new mdiv operation will start, truncating whatever other
352
-- operation that may have been in course.
353
-- So we encode here the function to be performed and make sure the value stays
354
-- there for only one cycle (the first ALU cycle of the mul/div instruction).
355 2 ja_rd
 
356 12 ja_rd
-- This will be '1' for all mul/div operations other than NOP...
357
p1_muldiv_func(3) <= '1' when p1_op_special='1' and
358
                              p1_ir_fn(5 downto 4)="01" and
359
                              -- ...but only if the mdiv is not already running
360
                              p2_muldiv_started = '0' and
361
                              p1_muldiv_running ='0'
362
                      else '0';
363 2 ja_rd
 
364 12 ja_rd
-- When bit(3) is zero, the rest are zeroed too. Otherwise, they come from IR
365
p1_muldiv_func(2 downto 0) <=
366
    p1_ir_fn(3) & p1_ir_fn(1 downto 0) when p1_muldiv_func(3)='1'
367
    else "000";
368 2 ja_rd
 
369 12 ja_rd
mult_div: entity work.mips_mult
370
    port map (
371
        a           => p1_rs,
372
        b           => p1_rt,
373
        c_mult      => p1_muldiv_result,
374
        pause_out   => p1_muldiv_running,
375
        mult_func   => p1_muldiv_func,
376
        clk         => clk,
377
        reset_in    => reset
378
    );
379
 
380
-- Active only for the 1st ALU cycle of any mul/div instruction
381
p1_muldiv_started <= '1' when p1_op_special='1' and
382
                              p1_ir_fn(5 downto 3)="011" and
383
                              -- 
384
                              p1_muldiv_running='0'
385
                      else '0';
386
 
387
-- Stall the pipeline to enable mdiv operation completion.
388
-- We need p2_muldiv_started to distinguish the cycle before p1_muldiv_running
389
-- is asserted and the cycle after it deasserts.
390
-- Otherwise we would reexecute the same muldiv endlessly instruction after 
391
-- deassertion of p1_muldiv_running, since the IR was stalled and still contains 
392
-- the mul opcode...
393
p1_muldiv_stall <= '1' when
394
        -- Active for the cycle immediately before p1_muldiv_running asserts
395
        -- and NOT for the cycle after it deasserts
396
        (p1_muldiv_started='1' and p2_muldiv_started='0') or
397
        -- Active until operation is complete
398
        p1_muldiv_running = '1'
399
        else '0';
400
 
401
 
402 2 ja_rd
--##############################################################################
403
-- PC register and branch logic
404
 
405
-- p0_pc_reg will not be incremented on stall cycles
406
p0_pc_incremented <= p0_pc_reg + (not stall_pipeline);
407
 
408
-- main pc mux: jump or continue
409
p0_pc_next <=
410
    p0_pc_target when
411
        -- We jump on jump instructions whose condition is met...
412 6 ja_rd
        ((p1_jump_type(1)='1' and p0_jump_cond_value='1' and
413
        -- ...except we abort any jump that follows the victim of an exception
414
          p2_exception='0') or
415
        -- We jump on exceptions too...
416 2 ja_rd
        p1_exception='1')
417 6 ja_rd
        -- ... but we only jump at all if the pipeline is not stalled
418 2 ja_rd
        and stall_pipeline='0'
419
    else p0_pc_incremented;
420
 
421
pc_register:
422
process(clk)
423
begin
424
    if clk'event and clk='1' then
425
        if reset='1' then
426
            -- reset to 0xffffffff so that 1st fetch addr is 0x00000000
427
            p0_pc_reg <= (others => '1');
428
        else
429
            -- p0_pc_reg holds the same value as external sync ram addr register
430
            p0_pc_reg <= p0_pc_next;
431 8 ja_rd
            -- p0_pc_restart = addr saved to EPC on interrupts (@note2)
432
            -- It's the addr of the instruction triggering the exception
433
            -- FIXME handle delay slot case
434
            if (p1_jump_type="00" or p0_jump_cond_value='0') then
435
                p0_pc_restart <= p0_pc_reg;
436
            end if;
437 2 ja_rd
        end if;
438
    end if;
439
end process pc_register;
440
 
441
-- p0_pc_reg holds the same addr as the addr register of the external synchronous 
442
-- memory; what we put on the addr bus is p0_pc_next.
443
data_rd_addr <= p1_data_addr(31 downto 0);
444
 
445
-- FIXME these two need to pushed behind a register, they are glitch-prone
446
data_rd_vma <= p1_do_load and not pipeline_stalled; -- FIXME register
447
code_rd_vma <= not stall_pipeline; -- FIXME registe
448
 
449
code_rd_addr <= p0_pc_next;
450
 
451
data_wr_addr <= p1_data_addr(31 downto 2);
452
 
453
-- compute target of J/JR instructions
454
p0_pc_jump <=   p1_rs(31 downto 2) when p1_do_reg_jump='1' else
455
                p0_pc_reg(31 downto 28) & p1_ir_reg(25 downto 0);
456
 
457
-- compute target of relative branch instructions
458
p1_branch_offset_sex <= (others => p1_ir_reg(15));
459
p1_branch_offset <= p1_branch_offset_sex & p1_ir_reg(15 downto 0);
460
-- p0_pc_reg is the addr of the instruction in delay slot
461
p0_pc_branch <= p0_pc_reg + p1_branch_offset;
462
 
463
-- decide which jump target is to be used
464
p0_pc_target <= X"0000003"&"11"     when p1_exception='1' else
465
             p0_pc_jump             when p1_jump_type(0)='1' else
466
             p0_pc_branch;
467
 
468
 
469
--##############################################################################
470
-- Instruction decoding and IR
471
 
472
instruction_register:
473
process(clk)
474
begin
475
    if clk'event and clk='1' then
476
        if reset='1' then
477
            p1_ir_reg <= (others => '0');
478
        elsif stall_pipeline='0' then
479
            p1_ir_reg <= code_rd;
480
        end if;
481
    end if;
482
end process instruction_register;
483
 
484
-- 'Extract' main fields from IR, for convenience
485
p1_ir_op <= p1_ir_reg(31 downto 26);
486
p1_ir_fn <= p1_ir_reg(5 downto 0);
487
 
488
-- Decode jump type, if any, for instructions with op/=0
489
with p1_ir_op select p1_jump_type_set0 <=
490
    -- FIXME weed out invalid instructions
491
    "10" when "000001", -- BLTZ, BGEZ, BLTZAL, BGTZAL
492
    "11" when "000010", -- J
493
    "11" when "000011", -- JAL
494
    "10" when "000100", -- BEQ
495
    "10" when "000101", -- BNE
496
    "10" when "000110", -- BLEZ
497
    "10" when "000111", -- BGTZ
498
    "00" when others;   -- no jump
499
 
500
-- Decode jump type, if any, for instructions with op=0
501
p1_jump_type_set1 <= "11" when p1_op_special='1' and
502
                               p1_ir_reg(5 downto 1)="00100"
503
                     else "00";
504
 
505
-- Decode jump type for the instruction in IR (composite of two formats)
506
p1_jump_type <= p1_jump_type_set0 or p1_jump_type_set1;
507
 
508
p1_link <= '1' when (p1_ir_op="000000" and p1_ir_reg(5 downto 0)="001001") or
509
                    (p1_ir_op="000001" and p1_ir_reg(20)='1') or
510
                    (p1_ir_op="000011")
511
           else '0';
512
 
513
-- Decode jump condition: encode a mux control signal from IR...
514
p1_jump_cond_sel <=
515
    "001" when p1_ir_op="000001" and p1_ir_reg(16)='0' else --   op1 < 0   BLTZ*
516
    "101" when p1_ir_op="000001" and p1_ir_reg(16)='1' else -- !(op1 < 0) BNLTZ*
517
    "010" when p1_ir_op="000100" else                       --   op1 == op2  BEQ
518
    "110" when p1_ir_op="000101" else                       -- !(op1 == op2) BNE
519
    "011" when p1_ir_op="000110" else                       --   op1 <= 0   BLEZ
520
    "111" when p1_ir_op="000111" else                       -- !(op1 <= 0)  BGTZ
521
    "000";                                                  -- always
522
 
523
-- ... and use mux control signal to select the condition value
524
with p1_jump_cond_sel select p0_jump_cond_value <=
525
        p1_alu_flags.inp1_lt_zero       when "001",
526
    not p1_alu_flags.inp1_lt_zero       when "101",
527
        p1_alu_flags.inp1_eq_inp2       when "010",
528
    not p1_alu_flags.inp1_eq_inp2       when "110",
529
        (p1_alu_flags.inp1_lt_inp2 or
530
         p1_alu_flags.inp1_eq_inp2)     when "011",
531
    not (p1_alu_flags.inp1_lt_inp2 or
532
         p1_alu_flags.inp1_eq_inp2)     when "111",
533
    '1'                                 when others;
534
 
535
-- Decode instructions that launch exceptions
536 23 ja_rd
p1_exception <= '1' when
537
    (p1_op_special='1' and p1_ir_reg(5 downto 1)="00110") or
538
    p1_unknown_opcode='1'
539
    else '0';
540 2 ja_rd
 
541
-- Decode MTC0/MFC0 instructions
542
p1_set_cp0 <= '1' when p1_ir_reg(31 downto 21)="01000000100" else '0';
543
p1_get_cp0 <= '1' when p1_ir_reg(31 downto 21)="01000000000" else '0';
544
 
545
-- FIXME elaborate and explain this
546
 
547
p1_op_special <= '1' when p1_ir_op="000000" else '0';
548
 
549
p1_do_reg_jump <= '1' when p1_op_special='1' and p1_ir_fn(5 downto 1)="00100" else '0';
550
p1_do_zero_ext_imm <= '1' when (p1_ir_op(31 downto 28)="0011") else '0';
551
 
552
-- Decode input data mux control (LW, LH, LB, LBU, LHU) and load enable
553 6 ja_rd
p1_do_load <= '1' when p1_ir_op(31 downto 29)="100" and
554
                       p2_exception='0'
555
              else '0';
556 2 ja_rd
 
557
p1_load_alu_set0 <= '1'
558
    when p1_op_special='1' and
559
        ((p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="00") or
560
         (p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="10") or
561
         (p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="11") or
562
         (p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="00") or
563
         (p1_ir_op(31 downto 28)="0100" and p1_ir_op(27 downto 26)="00") or
564
         (p1_ir_op(31 downto 28)="0100" and p1_ir_op(27 downto 26)="10") or
565
         (p1_ir_op(31 downto 28)="1000") or
566
         (p1_ir_op(31 downto 28)="1001") or
567
         (p1_ir_op(31 downto 28)="1010" and p1_ir_op(27 downto 26)="10") or
568
         (p1_ir_op(31 downto 28)="1010" and p1_ir_op(27 downto 26)="11") or
569
         (p1_ir_op(31 downto 28)="0010" and p1_ir_op(27 downto 26)="01"))
570
    else '0';
571
 
572
with p1_ir_op select p1_load_alu_set1 <=
573
    '1' when "001000",
574
    '1' when "001001",
575
    '1' when "001010",
576
    '1' when "001011",
577
    '1' when "001100",
578
    '1' when "001101",
579
    '1' when "001110",
580
    '1' when "001111",
581
    -- FIXME a few others missing: MFC0, etc
582
    '0' when others;
583
p1_load_alu <= p1_load_alu_set0 or p1_load_alu_set1;
584
 
585
p1_ld_upper_hword <= p1_ir_op(27); -- use input upper hword vs. sign extend/zero
586
p1_ld_upper_byte <= p1_ir_op(26);  -- use input upper byte vs. sign extend/zero
587
p1_ld_unsigned <= p1_ir_op(28);    -- sign extend vs. zero extend
588
 
589
-- ALU input-2 selection: use external data for 2x opcodes (loads)
590
p1_alu_op2_sel_set0 <=
591
    "11" when    p1_ir_op(31 downto 30)="10" or p1_ir_op(29)='1' else
592
    "00";
593
 
594
-- ALU input-2 selection: use registers Hi and Lo for MFHI, MFLO
595 22 ja_rd
p1_alu_op2_sel_set1 <=
596
    "01" when p1_op_special='1' and (p1_ir_fn="010000" or p1_ir_fn="010010")
597
    else "00";
598 2 ja_rd
 
599
-- ALU input-2 final selection
600
p1_alu_op2_sel <= p1_alu_op2_sel_set0 or p1_alu_op2_sel_set1;
601
 
602
-- Decode store operations
603
p1_do_store <= '1' when p1_ir_op(31 downto 29)="101" else '0';
604
p1_store_size <= p1_ir_op(27 downto 26);
605
 
606
 
607
-- Decode load enables for Hi and Lo registers (MTHI and MTLO)
608
p1_load_hi <= '1' when p1_op_special='1' and p1_ir_fn="010001" else '0';
609
p1_load_lo <= '1' when p1_op_special='1' and p1_ir_fn="010011" else '0';
610
 
611
-- Decode ALU control dignals
612
 
613
p1_ac.use_slt <= '1' when (p1_ir_op="000001" and p1_ir_reg(20 downto 17)="01000") or
614
                        (p1_ir_op="000000" and p1_ir_reg(5 downto 1)="10101") or
615
                        p1_ir_op="001010" or p1_ir_op="001011"
616
               else '0';
617
p1_ac.arith_unsigned <= p1_ac.use_slt and p1_ir_reg(0);
618
 
619
p1_ac.use_logic(0) <= '1' when (p1_op_special='1' and p1_ir_fn(5 downto 3)/="000") or
620
                    -- all immediate arith and logic
621
                    p1_ir_op(31 downto 29)="001"
622
                 else '0';
623
p1_ac.use_logic(1) <= '1' when (p1_op_special='1' and p1_ir_fn="100111") else '0';
624
 
625
p1_ac.use_arith <= '1' when p1_ir_op(31 downto 28)="0010" or
626
                            (p1_op_special='1' and
627
                                (p1_ir_fn(5 downto 2)="1000" or
628
                                p1_ir_fn(5 downto 2)="1010"))
629
                 else '0';
630
 
631
-- selection of 2nd internal alu operand: {i2, /i2, i2<<16, 0x0}
632
p1_ac.neg_sel(1)<= '1' when p1_ir_op(29 downto 26) = "1111" else '0';
633
p1_ac.neg_sel(0)<= '1' when   p1_ir_op="001010" or
634
                            p1_ir_op="001011" or
635
                            p1_ir_op(31 downto 28)="0001" or
636
                            (p1_op_special='1' and
637
                                (p1_ir_fn="100010" or
638
                                 p1_ir_fn="100011" or
639
                                 p1_ir_fn(5 downto 2)="1010"))
640
                 else '0';
641
p1_ac.cy_in <= p1_ac.neg_sel(0);
642
 
643
p1_ac.shift_sel <= p1_ir_fn(1 downto 0);
644
 
645
p1_ac.logic_sel <= "00" when (p1_op_special='1' and p1_ir_fn="100100") else
646
                 "01" when (p1_op_special='1' and p1_ir_fn="100101") else
647
                 "10" when (p1_op_special='1' and p1_ir_fn="100110") else
648
                 "01" when (p1_op_special='1' and p1_ir_fn="100111") else
649
                 "00" when (p1_ir_op="001100") else
650
                 "01" when (p1_ir_op="001101") else
651
                 "10" when (p1_ir_op="001110") else
652
                 "11";
653
 
654
p1_ac.shift_amount <= p1_ir_reg(10 downto 6) when p1_ir_fn(2)='0' else p1_rs(4 downto 0);
655
 
656 23 ja_rd
 
657 2 ja_rd
--------------------------------------------------------------------------------
658 23 ja_rd
-- Decoding of unimplemented and privileged instructions
659 2 ja_rd
 
660 23 ja_rd
-- Unimplemented instructions include:
661
--  1.- All instructions above architecture MIPS-I except:
662
--      1.1.- eret
663
--  2.- Unaligned stores and loads (LWL,LWR,SWL,SWR)
664
--  3.- All CP0 instructions other than mfc0 and mtc0
665
--  4.- All CPi instructions
666
--  5.- All cache instructions
667
-- For the time being, we'll decode them all together.
668
 
669
-- FIXME: some of these should trap but others should just NOP (e.g. EHB)
670
 
671
p1_unknown_opcode <= '1' when
672
    -- decode by 'opcode' field
673
    p1_ir_op(31 downto 29)="011" or
674
    p1_ir_op(31 downto 29)="110" or
675
    p1_ir_op(31 downto 29)="111" or
676
    (p1_ir_op(31 downto 29)="010" and p1_ir_op(28 downto 26)/="000") or
677
    p1_ir_op="101111" or    -- CACHE
678
    p1_ir_op="100010" or    -- LWL
679
    p1_ir_op="100110" or    -- LWR
680
    p1_ir_op="101010" or    -- SWL
681
    p1_ir_op="101110" or    -- SWR
682
    p1_ir_op="100111" or
683
    p1_ir_op="101100" or
684
    p1_ir_op="101101" or
685
    -- decode instructions in the 'special' opcode group
686
    (p1_ir_op="000000" and
687
                (p1_ir_fn(5 downto 4)="11" or
688
                 p1_ir_fn="000001" or
689
                 p1_ir_fn="000101" or
690
                 p1_ir_fn="001010" or
691
                 p1_ir_fn="001011" or
692
                 p1_ir_fn="001110" or
693
                 p1_ir_fn(5 downto 2)="0101" or
694
                 p1_ir_fn(5 downto 2)="0111" or
695
                 p1_ir_fn(5 downto 2)="1011")) or
696
    -- decode instructions in the 'regimm' opcode group
697
    (p1_ir_op="000001" and
698
                (p1_ir_reg(20 downto 16)/="00000" and -- BLTZ is valid
699
                 p1_ir_reg(20 downto 16)/="00001" and -- BGEZ is valid
700
                 p1_ir_reg(20 downto 16)/="10000" and -- BLTZAL is valid 
701
                 p1_ir_reg(20 downto 16)/="10001")) -- BGEZAL is valid
702
 
703
    else '0';
704
 
705
--------------------------------------------------------------------------------
706
 
707 2 ja_rd
-- Stage 1 pipeline register. Involved in ALU control.
708
pipeline_stage1_register:
709
process(clk)
710
begin
711
    if clk'event and clk='1' then
712
        if reset='1' then
713
            p1_rbank_rs_hazard <= '0';
714
            p1_rbank_rt_hazard <= '0';
715
        elsif stall_pipeline='0' then
716
            p1_rbank_rs_hazard <= p0_rbank_rs_hazard;
717
            p1_rbank_rt_hazard <= p0_rbank_rt_hazard;
718
        end if;
719
    end if;
720
end process pipeline_stage1_register;
721
 
722 12 ja_rd
pipeline_stage1_register2:
723
process(clk)
724
begin
725
    if clk'event and clk='1' then
726
        if reset='1' then
727
            p2_muldiv_started <= '0';
728
        else
729
            p2_muldiv_started <= p1_muldiv_running;
730
        end if;
731
    end if;
732
end process pipeline_stage1_register2;
733 6 ja_rd
 
734 12 ja_rd
 
735 6 ja_rd
-- Stage 2 pipeline register. Split in two for convenience.
736 2 ja_rd
-- This register deals with two kinds of stalls:
737
-- * When the pipeline stalls because of a load interlock, this register is 
738
--   allowed to update so that the load operation can complete while the rest of
739
--   the pipeline is frozen.
740
-- * When the stall is caused by any other reason, this register freezes with 
741
--   the rest of the machine.
742 6 ja_rd
 
743
-- Part of stage 2 register that controls load operation
744
pipeline_stage2_register_load_control:
745 2 ja_rd
process(clk)
746
begin
747
    if clk'event and clk='1' then
748 6 ja_rd
        -- Clear load control, effectively preventing load, at reset or if
749
        -- the previous instruction raised an exception.
750
        if reset='1' or p2_exception='1' then
751 2 ja_rd
            p2_do_load <= '0';
752
            p2_ld_upper_hword <= '0';
753
            p2_ld_upper_byte <= '0';
754
            p2_ld_unsigned <= '0';
755
            p2_load_target <= "00000";
756 6 ja_rd
 
757
        -- Load signals from previous stage only if there is no pipeline stall
758
        -- unless the stall is caused by interlock (@note1).
759
        elsif (stall_pipeline='0' or load_interlock='1') then
760
            -- Disable reg bank writeback if pipeline is stalled; this prevents
761
            -- duplicate writes in case the stall is a mem_wait.
762 2 ja_rd
            if pipeline_stalled='0' then
763
                p2_do_load <= p1_do_load;
764
            else
765
                p2_do_load <= '0';
766
            end if;
767
            p2_load_target <= p1_rd_num;
768
            p2_ld_upper_hword <= p1_ld_upper_hword;
769
            p2_ld_upper_byte <= p1_ld_upper_byte;
770
            p2_ld_unsigned <= p1_ld_unsigned;
771 6 ja_rd
        end if;
772
    end if;
773
end process pipeline_stage2_register_load_control;
774
 
775
-- All the rest of the stage 2 register
776
pipeline_stage2_register_others:
777
process(clk)
778
begin
779
    if clk'event and clk='1' then
780
        if reset='1' then
781
            p2_exception <= '0';
782
 
783
        -- Load signals from previous stage only if there is no pipeline stall
784
        -- unless the stall is caused by interlock (@note1).
785
        elsif (stall_pipeline='0' or load_interlock='1') then
786 2 ja_rd
            p2_rd_addr <= p1_data_addr(1 downto 0);
787 6 ja_rd
            p2_exception <= p1_exception;
788 2 ja_rd
        end if;
789
    end if;
790 6 ja_rd
end process pipeline_stage2_register_others;
791 2 ja_rd
 
792
--------------------------------------------------------------------------------
793
 
794
-- FIXME stall when needed: mem pause, mdiv pause and load interlock
795
 
796
pipeline_stall_registers:
797
process(clk)
798
begin
799
    if clk'event and clk='1' then
800
        if reset='1' then
801
            pipeline_stalled <= '0';
802
            pipeline_interlocked <= '0';
803
        else
804
            if stall_pipeline='1' then
805
                pipeline_stalled <= '1';
806
            else
807
                pipeline_stalled <= '0';
808
            end if;
809
            if load_interlock='1' then
810
                pipeline_interlocked <= '1';
811
            else
812
                pipeline_interlocked <= '0';
813
            end if;
814
        end if;
815
    end if;
816
end process pipeline_stall_registers;
817
 
818
-- FIXME make sure this combinational will not have bad glitches
819 12 ja_rd
stall_pipeline <= mem_wait or load_interlock or p1_muldiv_stall;
820 2 ja_rd
 
821
 
822
-- FIXME load interlock should happen only if the instruction following 
823
-- the load actually uses the load target register. Something like this:
824
-- (p1_do_load='1' and (p1_rd_num=p0_rs_num or p1_rd_num=p0_rt_num))
825
load_interlock <= '1' when (p1_do_load='1' and pipeline_stalled='0') else '0';
826
 
827
--------------------------------------------------------------------------------
828
 
829
p1_data_offset(31 downto 16) <= (others => p1_data_imm(15));
830
p1_data_offset(15 downto 0) <= p1_data_imm(15 downto 0);
831
 
832
p1_data_addr <= p1_rs + p1_data_offset;
833
 
834
--------------------------------------------------------------------------------
835
 
836
-- byte_we is a function of the write size and alignment
837
-- size = {00=1,01=2,11=4}; we 3 is MSB, 0 is LSB; big endian => 00 is msb
838
p1_we_control <= pipeline_stalled & p1_do_store & p1_store_size & p1_data_addr(1 downto 0);
839
 
840
with p1_we_control select byte_we <=
841
    "1000"  when "010000",    -- SB %0
842
    "0100"  when "010001",    -- SB %1
843
    "0010"  when "010010",    -- SB %2
844
    "0001"  when "010011",    -- SB %3
845
    "1100"  when "010100",    -- SH %0
846
    "0011"  when "010110",    -- SH %2
847
    "1111"  when "011100",    -- SW %4
848
    "0000"  when others; -- all other combinations are spurious so don't write
849
 
850
-- Data to be stored always comes straight from the reg bank, but it needs to 
851
-- be shifted so that the LSB is aligned to the write address:
852
 
853
data_wr(7 downto 0) <= p1_rt(7 downto 0);
854
 
855
with p1_we_control select data_wr(15 downto 8) <=
856
    p1_rt( 7 downto  0) when "010010",  -- SB %2
857
    p1_rt(15 downto  8) when others;
858
 
859
with p1_we_control select data_wr(23 downto 16) <=
860
    p1_rt( 7 downto  0) when "010001",  -- SB %1
861
    p1_rt( 7 downto  0) when "010100",  -- SH %0
862
    p1_rt(23 downto 16) when others;
863
 
864
with p1_we_control select data_wr(31 downto 24) <=
865
    p1_rt( 7 downto  0) when "010000",  -- SB %0
866
    p1_rt(15 downto  8) when "010100",  -- SH %0
867
    p1_rt(31 downto 24) when others;
868
 
869
 
870
--##############################################################################
871
-- CP0 (what little is implemented of it)
872
 
873
process(clk)
874
begin
875
    if clk'event and clk='1' then
876
        if reset='1' then
877
            -- "10" => mode=kernel; ints=disabled
878
            cp0_status <= "10";
879
        else
880
            -- no need to check for stall cycles when loading these
881
            if p1_set_cp0='1' then
882
                -- FIXME check for CP0 reg index
883
                cp0_status <= p1_rs(cp0_status'high downto 0);
884
            end if;
885
            if p1_exception='1' then
886 8 ja_rd
                cp0_epc <= p0_pc_restart;
887 2 ja_rd
            end if;
888
        end if;
889
    end if;
890
end process;
891
 
892
-- FIXME the mux should mask to zero for any unused reg index
893
cp0_reg_read <= X"0000000" & "00" & cp0_status when p1_rd_num="01100" else
894
                cp0_epc & "00";
895
 
896
end architecture rtl;
897
 
898
--------------------------------------------------------------------------------
899
-- Implementation notes
900
--------------------------------------------------------------------------------
901
-- @note1 : 
902
--
903
-- This is the meaning of these two signals:
904
-- pipeline_stalled & pipeline_interlocked =>
905
--  "00" => normal state
906
--  "01" => normal state (makes for easier decoding)
907
--  "10" => all stages of pipeline stalled, including rbank
908
--  "11" => all stages of pipeline stalled, except reg bank write port
909
-- 
910
-- Just to clarify, 'stage X stalled' here means that the registers named 
911
-- pX_* don't load.
912
--
913
-- The register bank WE is enabled when the pipeline is not stalled and when 
914
-- it is stalled because of a load interlock; so that in case of interlock the
915
-- load operation can complete while the rest of the pipeline is frozen.
916
--------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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