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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [cache_controller.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 robfinch
// Cache controller
2
// Also takes care of loading the instruction buffer for non-cached access
3
//
4
case(cstate)
5
IDLE:
6
        begin
7
                if (!cyc_o) begin
8
                        // A write to a cacheable address does not cause a cache load
9
                        if (dmiss) begin
10
                                isDataCacheLoad <= `TRUE;
11
                                if (isRMW)
12
                                        lock_o <= 1'b1;
13
                                cti_o <= 3'b001;
14
                                bl_o <= 6'd3;
15
                                cyc_o <= 1'b1;
16
                                stb_o <= 1'b1;
17
                                sel_o <= 4'hF;
18
                                adr_o <= {radr[31:2],4'h0};
19
                                cstate <= LOAD_DCACHE;
20
                        end
21
                        else if (!unCachedInsn && imiss && !hit0) begin
22
                                isInsnCacheLoad <= `TRUE;
23
                                bte_o <= 2'b00;
24
                                cti_o <= 3'd001;
25
                                bl_o <= 6'd3;
26
                                cyc_o <= 1'b1;
27
                                stb_o <= 1'b1;
28
                                sel_o <= 4'hF;
29
                                adr_o <= {pc[31:4],4'h0};
30
                                cstate <= LOAD_ICACHE;
31
                        end
32
                        else if (!unCachedInsn && imiss && !hit1) begin
33
                                isInsnCacheLoad <= `TRUE;
34
                                bte_o <= 2'b00;
35
                                cti_o <= 3'd001;
36
                                bl_o <= 6'd3;
37
                                cyc_o <= 1'b1;
38
                                stb_o <= 1'b1;
39
                                sel_o <= 4'hF;
40
                                adr_o <= {pcp8[31:4],4'h0};
41
                                cstate <= LOAD_ICACHE;
42
                        end
43
                        else if (unCachedInsn && imiss) begin
44
                                bte_o <= 2'b00;
45
                                cti_o <= 3'b001;
46
                                bl_o <= 6'd2;
47
                                cyc_o <= 1'b1;
48
                                stb_o <= 1'b1;
49
                                sel_o <= 4'hf;
50
                                adr_o <= {pc[31:2],2'b00};
51
                                cstate <= LOAD_IBUF1;
52
                        end
53
                end
54
        end
55
LOAD_DCACHE:
56
        if (ack_i) begin
57
                if (adr_o[3:2]==2'b11) begin
58
                        dmiss <= `FALSE;
59
                        isDataCacheLoad <= `FALSE;
60
                        cti_o <= 3'b000;
61
                        bl_o <= 6'd0;
62
                        cyc_o <= 1'b0;
63
                        stb_o <= 1'b0;
64
                        sel_o <= 4'h0;
65
                        adr_o <= 34'h0;
66
                        cstate <= IDLE;
67
                end
68
                adr_o <= adr_o + 34'd4;
69
        end
70
LOAD_ICACHE:
71
        if (ack_i) begin
72
                if (adr_o[3:2]==2'b11) begin
73
                        imiss <= `FALSE;
74
                        isInsnCacheLoad <= `FALSE;
75
                        cti_o <= 3'b000;
76
                        bl_o <= 6'd0;
77
                        cyc_o <= 1'b0;
78
                        stb_o <= 1'b0;
79
                        sel_o <= 4'h0;
80
                        adr_o <= 34'd0;
81
                        cstate <= IDLE;
82
                end
83
                adr_o <= adr_o + 34'd4;
84
        end
85
LOAD_IBUF1:
86
        if (ack_i) begin
87
                case(pc[1:0])
88
                2'd0:   ibuf <= dat_i;
89
                2'd1:   ibuf <= dat_i[31:8];
90
                2'd2:   ibuf <= dat_i[31:16];
91
                2'd3:   ibuf <= dat_i[31:24];
92
                endcase
93
                cstate <= LOAD_IBUF2;
94
                adr_o <= adr_o + 34'd4;
95
        end
96
LOAD_IBUF2:
97
        if (ack_i) begin
98
                case(pc[1:0])
99
                2'd0:   ibuf[55:32] <= dat_i[23:0];
100
                2'd1:   ibuf[55:24] <= dat_i[31:0];
101
                2'd2:   ibuf[47:16] <= dat_i[23:0];
102
                2'd3:   ibuf[39:8] <= dat_i;
103
                endcase
104
                cstate <= LOAD_IBUF3;
105
                adr_o <= adr_o + 34'd4;
106
        end
107
LOAD_IBUF3:
108
        if (ack_i) begin
109
                case(pc[1:0])
110
                2'd0:   ;
111
                2'd1:   ;
112
                2'd2:   ibuf[55:48] <= dat_i[7:0];
113
                2'd3:   ibuf[55:40] <= dat_i[15:0];
114
                endcase
115
                cti_o <= 3'd0;
116
                bl_o <= 6'd0;
117
                cyc_o <= 1'b0;
118
                stb_o <= 1'b0;
119
                sel_o <= 4'h0;
120
                adr_o <= 34'd0;
121
                cstate <= IDLE;
122
                imiss <= `FALSE;
123
                bufadr <= pc;   // clears the miss
124
        end
125
endcase

powered by: WebSVN 2.1.0

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