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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [twoway/] [FT64_BTB.v] - Blame information for rev 60

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2017-2018  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//      FT64_BTB.v
9
//              
10
// This source file is free software: you can redistribute it and/or modify 
11
// it under the terms of the GNU Lesser General Public License as published 
12
// by the Free Software Foundation, either version 3 of the License, or     
13
// (at your option) any later version.                                      
14
//                                                                          
15
// This source file is distributed in the hope that it will be useful,      
16
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
18
// GNU General Public License for more details.                             
19
//                                                                          
20
// You should have received a copy of the GNU General Public License        
21
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
22
//
23
// ============================================================================
24
//
25
module FT64_BTB(rst, wclk,
26
                wr0, wadr0, wdat0, valid0,
27
                wr1, wadr1, wdat1, valid1,
28
                wr2, wadr2, wdat2, valid2,
29
                rclk, pcA, btgtA, pcB, btgtB,
30
                pcC, btgtC, pcD, btgtD, pcE, btgtE, pcF, btgtF,
31
                hitA, hitB, hitC, hitD, hitE, hitF,
32
    npcA, npcB, npcC, npcD, npcE, npcF);
33
parameter AMSB = 63;
34
parameter RSTPC = 64'hFFFFFFFFFFFC0100;
35
input rst;
36
input wclk;
37
input wr0;
38
input [AMSB:0] wadr0;
39
input [AMSB:0] wdat0;
40
input valid0;
41
input wr1;
42
input [AMSB:0] wadr1;
43
input [AMSB:0] wdat1;
44
input valid1;
45
input wr2;
46
input [AMSB:0] wadr2;
47
input [AMSB:0] wdat2;
48
input valid2;
49
input rclk;
50
input [AMSB:0] pcA;
51
output [AMSB:0] btgtA;
52
input [AMSB:0] pcB;
53
output [AMSB:0] btgtB;
54
input [AMSB:0] pcC;
55
output [AMSB:0] btgtC;
56
input [AMSB:0] pcD;
57
output [AMSB:0] btgtD;
58
input [AMSB:0] pcE;
59
output [AMSB:0] btgtE;
60
input [AMSB:0] pcF;
61
output [AMSB:0] btgtF;
62
output hitA;
63
output hitB;
64
output hitC;
65
output hitD;
66
output hitE;
67
output hitF;
68
input [AMSB:0] npcA;
69
input [AMSB:0] npcB;
70
input [AMSB:0] npcC;
71
input [AMSB:0] npcD;
72
input [AMSB:0] npcE;
73
input [AMSB:0] npcF;
74
 
75
integer n;
76
reg [AMSB:0] pcs [0:31];
77
reg [AMSB:0] wdats [0:31];
78
reg [AMSB:0] wdat;
79
reg [4:0] pcstail,pcshead;
80
reg [AMSB:0] pc;
81
reg takb;
82
reg wrhist;
83
 
84
reg [(AMSB+1)*2+1:0] mem [0:1023];
85
reg [9:0] radrA, radrB, radrC, radrD, radrE, radrF;
86
initial begin
87
    for (n = 0; n < 1024; n = n + 1)
88
        mem[n] <= RSTPC;
89
end
90
 
91
always @(posedge wclk)
92
if (rst)
93
        pcstail <= 5'd0;
94
else begin
95
        case({wr0,wr1,wr2})
96
        3'b000: ;
97
        3'b001:
98
                begin
99
                pcs[pcstail] <= {wadr2[31:1],valid2};
100
                wdats[pcstail] <= wdat2;
101
                pcstail <= pcstail + 5'd1;
102
                end
103
        3'b010:
104
                begin
105
                pcs[pcstail] <= {wadr1[31:1],valid1};
106
                wdats[pcstail] <= wdat1;
107
                pcstail <= pcstail + 5'd1;
108
                end
109
        3'b011:
110
                begin
111
                pcs[pcstail] <= {wadr1[31:1],valid1};
112
                pcs[pcstail+1] <= {wadr2[31:1],valid2};
113
                wdats[pcstail] <= wdat1;
114
                wdats[pcstail+1] <= wdat2;
115
                pcstail <= pcstail + 5'd2;
116
                end
117
        3'b100:
118
                begin
119
                pcs[pcstail] <= {wadr0[31:1],valid0};
120
                wdats[pcstail] <= wdat0;
121
                pcstail <= pcstail + 5'd1;
122
                end
123
        3'b101:
124
                begin
125
                pcs[pcstail] <= {wadr0[31:1],valid0};
126
                pcs[pcstail+1] <= {wadr2[31:1],valid2};
127
                wdats[pcstail] <= wdat0;
128
                wdats[pcstail+1] <= wdat2;
129
                pcstail <= pcstail + 5'd2;
130
                end
131
        3'b110:
132
                begin
133
                pcs[pcstail] <= {wadr0[31:1],valid0};
134
                pcs[pcstail+1] <= {wadr1[31:1],valid1};
135
                wdats[pcstail] <= wdat0;
136
                wdats[pcstail+1] <= wdat1;
137
                pcstail <= pcstail + 5'd2;
138
                end
139
        3'b111:
140
                begin
141
                pcs[pcstail] <= {wadr0[31:1],valid0};
142
                pcs[pcstail+1] <= {wadr1[31:1],valid1};
143
                pcs[pcstail+2] <= {wadr2[31:1],valid2};
144
                wdats[pcstail] <= wdat0;
145
                wdats[pcstail+1] <= wdat1;
146
                wdats[pcstail+2] <= wdat2;
147
                pcstail <= pcstail + 5'd3;
148
                end
149
        endcase
150
end
151
 
152
always @(posedge wclk)
153
if (rst)
154
        pcshead <= 5'd0;
155
else begin
156
        wrhist <= 1'b0;
157
        if (pcshead != pcstail) begin
158
                pc <= pcs[pcshead];
159
                takb <= pcs[pcshead][0];
160
                wdat <= wdats[pcshead];
161
                wrhist <= 1'b1;
162
                pcshead <= pcshead + 5'd1;
163
        end
164
end
165
 
166
 
167
always @(posedge wclk)
168
begin
169
    if (wrhist) #1 mem[pc[9:0]][AMSB:0] <= wdat;
170
    if (wrhist) #1 mem[pc[9:0]][(AMSB+1)*2:AMSB+1] <= pc;
171
    if (wrhist) #1 mem[pc[9:0]][(AMSB+1)*2+1] <= takb;
172
end
173
 
174
always @(posedge rclk)
175
    #1 radrA <= pcA[11:2];
176
always @(posedge rclk)
177
    #1 radrB <= pcB[11:2];
178
always @(posedge rclk)
179
    #1 radrC <= pcC[11:2];
180
always @(posedge rclk)
181
    #1 radrD <= pcD[11:2];
182
always @(posedge rclk)
183
    #1 radrE <= pcE[11:2];
184
always @(posedge rclk)
185
    #1 radrF <= pcF[11:2];
186
assign hitA = mem[radrA][(AMSB+1)*2:AMSB+1]==pcA && mem[radrA][(AMSB+1)*2+1];
187
assign hitB = mem[radrB][(AMSB+1)*2:AMSB+1]==pcB && mem[radrB][(AMSB+1)*2+1];
188
assign hitC = mem[radrC][(AMSB+1)*2:AMSB+1]==pcC && mem[radrC][(AMSB+1)*2+1];
189
assign hitD = mem[radrD][(AMSB+1)*2:AMSB+1]==pcD && mem[radrD][(AMSB+1)*2+1];
190
assign hitE = mem[radrE][(AMSB+1)*2:AMSB+1]==pcE && mem[radrE][(AMSB+1)*2+1];
191
assign hitF = mem[radrF][(AMSB+1)*2:AMSB+1]==pcF && mem[radrF][(AMSB+1)*2+1];
192
assign btgtA = hitA ? mem[radrA][AMSB:0] : npcA;
193
assign btgtB = hitB ? mem[radrB][AMSB:0] : npcB;
194
assign btgtC = hitC ? mem[radrC][AMSB:0] : npcC;
195
assign btgtD = hitD ? mem[radrD][AMSB:0] : npcD;
196
assign btgtE = hitE ? mem[radrE][AMSB:0] : npcE;
197
assign btgtF = hitF ? mem[radrF][AMSB:0] : npcF;
198
 
199
endmodule

powered by: WebSVN 2.1.0

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