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

Subversion Repositories ion

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

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

powered by: WebSVN 2.1.0

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