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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [branches/] [beta_2.0/] [rtl/] [Module_InstructionIssue.v] - Blame information for rev 226

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

Line No. Rev Author Line
1 213 diegovalve
`include "aDefinitions.v"
2
 
3
/**********************************************************************************
4
Theia, Ray Cast Programable graphic Processing Unit.
5
Copyright (C) 2012  Diego Valverde (diego.valverde.g@gmail.com)
6
 
7
This program is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License
9
as published by the Free Software Foundation; either version 2
10
of the License, or (at your option) any later version.
11
 
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20
 
21
***********************************************************************************/
22
 
23
//`define ADDRESSING_MODES_DISABLED 1
24
//`define NO_STALL_ON_BRANCH_DEPS 1
25
 
26
`define II_STATE_AFTER_RESET             0
27
`define II_FETCH_INSTRUCTION             1
28
`define II_ISSUE_REQUEST_WITH_DATA_FWD   2
29
`define II_ISSUE_REQUEST                 3
30
`define II_FIFO_UPDATE                   4
31
`define II_ISSUE_BRANCH_OPERATION        5
32
`define II_UPDATE_PC_BRANCH_OPERATION    6
33
 
34
`define TAGMEM_OWNER_ISSUE      1'b0
35
`define TAGMEM_OWNER_FIFO       1'b1
36
 
37
module InstructionIssue
38
(
39
   input wire                                   Clock,
40
        input wire                                   Reset,
41
        input wire                                   iEnable,
42
        input wire [`INSTRUCTION_WIDTH-1:0]          iInstruction0,        //Instruction fetched from IM
43
        input wire [`INSTRUCTION_WIDTH-1:0]          iInstruction1,                       //Branch taken instruction prefetch
44
        input wire [`DATA_ROW_WIDTH-1:0]             iSourceData0,         //Source0 value from RF
45
        input wire [`DATA_ROW_WIDTH-1:0]             iSourceData1,         //Source1 value from RF
46
        input wire [`NUMBER_OF_RSVR_STATIONS-1:0]    iRStationBusy,
47
        input wire [`COMMIT_PACKET_SIZE-1:0]         iResultBcast,         //Contains DST and RsId from last commited operation
48
        input wire                                   iSignFlag,
49
        input wire                                   iZeroFlag,
50
        input wire                                   iMtEnabled,
51
        input wire                                   iIgnoreResultBcast,
52
        output wire [`DATA_ADDRESS_WIDTH-1:0]        oSourceAddress0,
53
        output wire [`DATA_ADDRESS_WIDTH-1:0]        oSourceAddress1,
54
        output wire  [`ISSUE_PACKET_SIZE-1:0]        oIssueBcast,
55
   input wire [`DATA_ADDRESS_WIDTH -1:0]        iFrameOffset,iIndexRegister,
56
        input wire [`INSTRUCTION_ADDR_WIDTH-1:0]     iCodeOffset,
57
        output wire  [`INSTRUCTION_ADDR_WIDTH -1:0]  oIP0,
58
        output wire  [`INSTRUCTION_ADDR_WIDTH -1:0]  oIP1
59
 
60
);
61
 
62
 
63
parameter  SB_ENTRY_WIDTH = 4;
64
 
65
wire[SB_ENTRY_WIDTH-1:0]                wSource0_Station;     //Reservation Station that is currently calculationg Source0, zero means none
66
wire[SB_ENTRY_WIDTH-1:0]                wSource1_Station;     //Reservation Station that is currently calculationg Source1, zero means none
67
wire[SB_ENTRY_WIDTH-1:0]                wSource0_RsSb;
68
wire[`DATA_ADDRESS_WIDTH-1:0]           wSBWriteAddress;
69
wire [SB_ENTRY_WIDTH-1:0]               wSBWriteData;
70
wire                                    wStall;
71
wire [`DATA_ROW_WIDTH-1:0]              wSourceData0;
72
wire [`DATA_ROW_WIDTH-1:0]              wSourceData1;
73
wire                                    wFIFO_ReadEnable;
74
wire [`DATA_ADDRESS_WIDTH-1:0]          wFIFO_Dst;
75
wire [`DATA_ADDRESS_WIDTH-1:0]          wIssue_Dst;
76
wire [`DATA_ADDRESS_WIDTH-1:0]          wSource0Addr_Displaced,wSourceAddress0_Imm,wSource0Addr_Displaced_plus_Index;
77
wire [`DATA_ADDRESS_WIDTH-1:0]          wSource1Addr_Displaced,wSourceAddress1_Imm,wSource1Addr_Displaced_plus_Index;
78
wire                                    wSBWriteEnable;
79
wire[`DATA_ROW_WIDTH-1:0]               wSignedSourceData0;
80
wire[`DATA_ROW_WIDTH-1:0]               wSignedSourceData1;
81
wire[`DATA_ROW_WIDTH-1:0]               wSwizzledSourceData0;
82
wire[`DATA_ROW_WIDTH-1:0]               wSwizzledSourceData1;
83
wire [`DATA_ROW_WIDTH-1:0]              wResultData;
84
wire [`DATA_ROW_WIDTH-1:0]              wSourceData1Temp;
85
wire [`DATA_ROW_WIDTH-1:0]              wScaledSourceData0;
86
wire [`DATA_ROW_WIDTH-1:0]              wScaledSourceData1;
87
wire [`DATA_ROW_WIDTH-1:0]              wScaledSourceData0_Pre;
88
wire [`DATA_ROW_WIDTH-1:0]              wScaledSourceData1_Pre;
89
wire [`DATA_ROW_WIDTH-1:0]              wUnscaleSourceData0_Pre;
90
wire [`DATA_ROW_WIDTH-1:0]              wUnscaleSourceData1_Pre;
91
wire [6:0] wOp;
92
wire wBranchTaken;
93
wire wCommitBusInputFifo_Empty;
94
wire wCommitBusDataAvailabe;
95
wire wReservationStationBusy;
96
wire [`COMMIT_PACKET_SIZE-1:0] wResultFifoData;
97
reg rTagMemoryWE,rTagMemOwner,rIssueNow,rIncrementPC,rPopFifo,rBypassFifo,rUseForwardedData;
98
reg rSetPCBranchTaken;
99
wire wBranchWithDependency;
100
 
101
wire wMtHasOnceMoreTimeSlot,wEnabled_Delay;
102
wire wIO_Operation;
103
assign wIO_Operation = (~wOp[0] &  wOp[1] & wOp[2] & ~wOp[3]);
104
 
105
FFD_POSEDGE_SYNCRONOUS_RESET # ( 1 ) FFD123
106
(       Clock, Reset, 1'b1 , iEnable , wEnabled_Delay  );
107
 
108
assign wMtHasOnceMoreTimeSlot = ~wEnabled_Delay;
109
 
110
assign wStall = iInstruction0[`INST_EOF_RNG];
111
 
112
reg [4:0]  rCurrentState, rNextState;
113
//Next states logic and Reset sequence
114
always @(posedge Clock )
115
  begin
116
 
117
    if (Reset )
118
                rCurrentState <= `II_STATE_AFTER_RESET;
119
    else
120
                rCurrentState <= rNextState;
121
 
122
end
123
 
124
 
125
 
126
 
127
always @ ( * )
128
begin
129
        case (rCurrentState)
130
        //--------------------------------------
131
        `II_STATE_AFTER_RESET:
132
        begin
133
           rTagMemoryWE   = 1'b0;
134
                rTagMemOwner   = 1'b0;
135
                rIssueNow      = 1'b0;
136
                rIncrementPC   = 1'b0;
137
                rPopFifo       = 1'b0;
138
                rBypassFifo    = 1'b0;
139
                rUseForwardedData  = 1'b0;
140
                rSetPCBranchTaken  = 1'b0;
141
 
142
                rNextState = `II_FETCH_INSTRUCTION;
143
        end
144
        //--------------------------------------
145
        /*The PC will be incremented except for the scenario where we need to wait
146
        for reservation stations to become available. If we increment the PC, then the
147
        value of PC will get update the next clock cycle, and another clock cycle
148
        after that the instruction will get updated.
149
        1- If there is data waiting on the commit bus input port this cycle,
150
        then do not queue this data into the FIFO but instead set
151
        set the score board write enable to 1, set the wSBWriteAddress
152
        to the CommitPacket Destination range   and update the score board
153
        bit to zero, so than in the next state the score board bit associated
154
        to the commit data has been updated.
155
        2 - If there is no data waiting on the commit bus this clock cycle, but there
156
        is data that has been queued into the input FIFO, then go to a state where this
157
        data status on the scoreboard gets updated.
158
        3 - If there are no available reservation stations left to handle this
159
        instruction (structural hazard) then just stay in these same state to wait for
160
        a reservation station to become availabe.
161
        */
162
        `II_FETCH_INSTRUCTION:
163
        begin
164
                rTagMemoryWE   = wCommitBusDataAvailabe;
165
                rTagMemOwner   = `TAGMEM_OWNER_ISSUE;
166
                rIssueNow      = 1'b0;
167
                rIncrementPC   =  (( ~wReservationStationBusy & ~iInstruction0[`INST_BRANCH_BIT] & wCommitBusInputFifo_Empty) | (~wReservationStationBusy & ~iInstruction0[`INST_BRANCH_BIT] & wCommitBusDataAvailabe));
168
                rPopFifo       = 1'b0;
169
                rBypassFifo    = wCommitBusDataAvailabe;                        //Write iCommitBus data directly into tag mem
170
                rUseForwardedData  = 1'b0;
171
                rSetPCBranchTaken  = 1'b0;
172
 
173
                if (wCommitBusDataAvailabe & ~wReservationStationBusy /**/& (iMtEnabled & wMtHasOnceMoreTimeSlot | ~iMtEnabled)/**/)
174
                        rNextState = `II_ISSUE_REQUEST_WITH_DATA_FWD;
175
                else if (~wCommitBusInputFifo_Empty)
176
                        rNextState = `II_FIFO_UPDATE;
177
                else if ( wReservationStationBusy | (iMtEnabled & ~wMtHasOnceMoreTimeSlot))
178
                        rNextState = `II_FETCH_INSTRUCTION;
179
                else
180
                        rNextState = `II_ISSUE_REQUEST;
181
 
182
        end
183
                //--------------------------------------
184
                //TODO: If the reservation station is Busy (static hazard)
185
                //Then we shall stall the machine...
186
        `II_ISSUE_REQUEST:
187
        begin
188
                rTagMemoryWE   = ~iInstruction0[`INST_BRANCH_BIT] & ~wIO_Operation;
189
                rTagMemOwner   = `TAGMEM_OWNER_ISSUE;
190
                rIssueNow      = iEnable;
191
                rIncrementPC   = (iInstruction0[`INST_BRANCH_BIT] & ~wBranchWithDependency & iEnable);
192
                rPopFifo       = 1'b0;
193
                rBypassFifo    = 1'b0;
194
                rUseForwardedData  = 1'b0;
195
                rSetPCBranchTaken  = 1'b0;
196
 
197
                if (~iEnable & ~wCommitBusInputFifo_Empty)
198
                        rNextState = `II_FIFO_UPDATE;
199
                else if (~iEnable & wCommitBusInputFifo_Empty)
200
                        rNextState = `II_ISSUE_REQUEST;///////////////////
201
                else
202
                if (iInstruction0[`INST_BRANCH_BIT])
203
                        rNextState = `II_UPDATE_PC_BRANCH_OPERATION;
204
                else
205
                   rNextState = `II_FETCH_INSTRUCTION;
206
        end
207
        //--------------------------------------
208
        /*
209
        Here the instruction remains the same as in the
210
        previous clock cycle.
211
        */
212
        `II_ISSUE_REQUEST_WITH_DATA_FWD:
213
        begin
214
                rTagMemoryWE   = ~iInstruction0[`INST_BRANCH_BIT] & ~wIO_Operation;
215
                rTagMemOwner   = `TAGMEM_OWNER_ISSUE;
216
                rIssueNow      = iEnable;
217
                rIncrementPC   = (iInstruction0[`INST_BRANCH_BIT] & ~wBranchWithDependency & iEnable);
218
                rPopFifo       = 1'b1;
219
                rBypassFifo    = 1'b0;
220
                rUseForwardedData  = 1'b1;
221
                rSetPCBranchTaken  = 1'b0;//wBranchTaken;
222
 
223
                if (~iEnable & ~wCommitBusInputFifo_Empty)
224
                        rNextState = `II_FIFO_UPDATE;
225
                else if (~iEnable & wCommitBusInputFifo_Empty)
226
                        rNextState = `II_ISSUE_REQUEST_WITH_DATA_FWD;
227
                else
228
                if (iInstruction0[`INST_BRANCH_BIT])
229
                        rNextState = `II_UPDATE_PC_BRANCH_OPERATION;
230
                else
231
                   rNextState = `II_FETCH_INSTRUCTION;
232
        end
233
        //--------------------------------------
234
        `II_FIFO_UPDATE:
235
        begin
236
                rTagMemoryWE   = 1'b1;
237
                rTagMemOwner   = `TAGMEM_OWNER_FIFO;
238
                rIssueNow      = 1'b0;
239
                rIncrementPC   = (iMtEnabled & wMtHasOnceMoreTimeSlot /*| ~iMtEnabled*/) & ~wBranchWithDependency & (( ~wReservationStationBusy & ~iInstruction0[`INST_BRANCH_BIT]));//1'b0;
240
                rPopFifo       = 1'b1;
241
                rBypassFifo    = 1'b0;
242
                rUseForwardedData  = 1'b0;
243
                rSetPCBranchTaken  = 1'b0;
244
 
245
                if (wBranchWithDependency & ~iMtEnabled)
246
                        rNextState = `II_UPDATE_PC_BRANCH_OPERATION;
247
                else if ((~iMtEnabled | (iMtEnabled & wMtHasOnceMoreTimeSlot)) & ~wBranchWithDependency & (( ~wReservationStationBusy & ~iInstruction0[`INST_BRANCH_BIT])))
248
                        rNextState = `II_ISSUE_REQUEST;
249
                else
250
                        rNextState = `II_FETCH_INSTRUCTION;
251
        end
252
        //--------------------------------------
253
        //FIXME: You are assuming that the branch takes 1 cycle.
254
        //This may noy always be the case..
255
        `II_UPDATE_PC_BRANCH_OPERATION:
256
        begin
257
                rTagMemoryWE   = 1'b0;
258
                rTagMemOwner   = `TAGMEM_OWNER_FIFO;
259
                rIssueNow      = 1'b0;
260
                rIncrementPC   = 1'b0;
261
                rPopFifo       = 1'b1;
262
                rBypassFifo    = 1'b0;
263
                rUseForwardedData  = 1'b0;
264
                rSetPCBranchTaken  = wBranchTaken;
265
 
266
`ifdef NO_STALL_ON_BRANCH_DEPS
267
                rNextState = `II_FETCH_INSTRUCTION;
268
`else
269
                if (~wBranchWithDependency)
270
                        rNextState = `II_FETCH_INSTRUCTION;
271
                else if (~wCommitBusInputFifo_Empty)
272
                        rNextState = `II_FIFO_UPDATE;
273
                else
274
                        rNextState = `II_UPDATE_PC_BRANCH_OPERATION;
275
`endif
276
 
277
 
278
        end
279
        //--------------------------------------
280
        default:
281
        begin
282
                rTagMemOwner   = `TAGMEM_OWNER_ISSUE;
283
           rTagMemoryWE   = 1'b0;
284
                rIssueNow      = 1'b0;
285
                rIncrementPC   = 1'b0;
286
                rPopFifo       = 1'b0;
287
                rBypassFifo    = 1'b0;
288
                rUseForwardedData  = 1'b0;
289
                rSetPCBranchTaken  = 1'b0;
290
 
291
                rNextState = `II_STATE_AFTER_RESET;
292
        end
293
        //--------------------------------------
294
        endcase
295
 
296
 
297
end
298
 
299
wire [2:0] wInstructionBranchSelection;
300
assign wInstructionBranchSelection = iInstruction0[`INST_BRANCH_OP_RNG];
301
wire wCommitFromPendingStation;
302
assign wCommitFromPendingStation = (iResultBcast[`COMMIT_RSID_RNG] == wReservationStation) ? 1'b1 : 1'b0;
303
 
304
assign wBranchTaken =
305
wCommitFromPendingStation &
306
iInstruction0[`INST_BRANCH_BIT] &
307
(
308
~wInstructionBranchSelection[2] & ~wInstructionBranchSelection[1] & ~wInstructionBranchSelection[0] |                          //inconditional BRANCH  
309
~wInstructionBranchSelection[2] & ~wInstructionBranchSelection[1] & wInstructionBranchSelection[0] & iZeroFlag |                 //==
310
~wInstructionBranchSelection[2] & wInstructionBranchSelection[1] & ~wInstructionBranchSelection[0] & ~iZeroFlag |                //!=
311
~wInstructionBranchSelection[2] & wInstructionBranchSelection[1] & wInstructionBranchSelection[0] & iSignFlag |                  //<
312
wInstructionBranchSelection[2] & ~wInstructionBranchSelection[1] & ~wInstructionBranchSelection[0] & (~iSignFlag & ~iZeroFlag)|  //>
313
wInstructionBranchSelection[2] & ~wInstructionBranchSelection[1] & wInstructionBranchSelection[0] & (iSignFlag | iZeroFlag) |    //<=
314
wInstructionBranchSelection[2] & wInstructionBranchSelection[1] & ~wInstructionBranchSelection[0] & (~iSignFlag | iZeroFlag)     //>=
315
);
316
 
317
wire [`COMMIT_PACKET_SIZE-1:0] wCommitData_Latched;
318
FFD_POSEDGE_SYNCRONOUS_RESET # ( `COMMIT_PACKET_SIZE ) ICOMMIT_BYPASS_FFD
319
(       Clock, Reset, 1'b1 ,iResultBcast  , wCommitData_Latched  );
320
 
321
 
322
//The Reservation Station scoreboard
323
wire [SB_ENTRY_WIDTH-1:0] wSBDataPort0;
324
wire [SB_ENTRY_WIDTH-1:0] wSBDataPort1;
325
wire[3:0] wReservationStation;
326
 
327
 `ifdef ADDRESSING_MODES_DISABLED
328
 
329
assign wSBWriteAddress
330
 = (rTagMemOwner == `TAGMEM_OWNER_ISSUE) ? ((rBypassFifo)?iResultBcast[`COMMIT_DST_RNG]:iInstruction0[`INST_DST_RNG])
331
 : wResultFifoData[`COMMIT_DST_RNG];
332
 
333
 `else
334
 
335
 assign wSBWriteAddress
336
 = (rTagMemOwner == `TAGMEM_OWNER_ISSUE) ? ((rBypassFifo)?iResultBcast[`COMMIT_DST_RNG]:wDestinationIndex)
337
 : wResultFifoData[`COMMIT_DST_RNG];
338
`endif
339
 
340
assign wSBWriteData
341
= (rTagMemOwner == `TAGMEM_OWNER_ISSUE) ? ((rBypassFifo)?1'b0:wReservationStation) : 4'b0;
342
 
343
wire wTagMemoryWE;
344
assign wTagMemoryWE = rTagMemoryWE;//(rTagMemoryWE && (iInstruction0[`INST_CODE_RNG] != `OPERATION_OUT));       //Dont store dependencies for IO operations
345
 
346
RAM_DUAL_READ_PORT # ( SB_ENTRY_WIDTH, `DATA_ADDRESS_WIDTH ) SB
347
(
348
 .Clock(             Clock                          ),
349
 .iWriteEnable(      wTagMemoryWE                   ),
350
 .iReadAddress0(     oSourceAddress0                ),
351
 .iReadAddress1(     oSourceAddress1                ),
352
 .iWriteAddress(     wSBWriteAddress                ),
353
 .iDataIn(           wSBWriteData                   ),
354
 .oDataOut0(         wSBDataPort0                   ),
355
 .oDataOut1(         wSBDataPort1                   )
356
);
357
 
358
 
359
wire [`INSTRUCTION_ADDR_WIDTH-1:0]  wPCInitialValue;
360
wire [`INSTRUCTION_ADDR_WIDTH-1:0] wPCInitialTmp;
361
assign wPCInitialTmp = (iInstruction0[`INST_IMM])? wSourceData0[`SRC_RET_ADDR_RNG] : {2'b0,iInstruction0[`INST_DST_RNG]};
362
 
363
 
364
 
365
assign wPCInitialValue =  (rSetPCBranchTaken & ~Reset) ? wPCInitialTmp :  iCodeOffset;
366
 
367
 
368
 
369
//The program counter
370
UPCOUNTER_POSEDGE # (`INSTRUCTION_ADDR_WIDTH ) PC
371
(
372
        .Clock(    Clock                       ),
373
        .Reset(    Reset | rSetPCBranchTaken   ),
374
        .Enable(   rIncrementPC  & ~wStall     ),
375
        .Initial(  wPCInitialValue             ),
376
        .Q(        oIP0                        )
377
);
378
 
379
assign oIP1 = iInstruction0[`INST_DST_RNG];
380
 
381
 
382
`ifdef ADDRESSING_MODES_DISABLED
383
assign oSourceAddress1     = iInstruction0[`INST_SCR1_ADDR_RNG];
384
 
385
 
386
`else
387
 
388
assign oSourceAddress1 = (iInstruction0[`INST_IMM]) ? wSourceAddress1_Imm :
389
((iInstruction0[`INST_SRC1_DISPLACED]) ? wSource1Addr_Displaced: iInstruction0[`INST_SCR1_ADDR_RNG]);
390
 
391
assign wSource1Addr_Displaced = iInstruction0[`INST_SCR1_ADDR_RNG] + iFrameOffset;
392
assign wSource1Addr_Displaced_plus_Index = wSource1Addr_Displaced + iIndexRegister;
393
 
394
 MUXFULLPARALELL_3SEL_GENERIC # ( `DATA_ADDRESS_WIDTH ) SRC1ADDRMUX
395
 (
396
 .Sel(iInstruction0[`INST_ADDRMODE_RNG]),
397
 .I1(`DATA_ADDRESS_WIDTH'b0),
398
 .I2(`DATA_ADDRESS_WIDTH'b0),
399
 .I3(iInstruction0[`INST_SCR1_ADDR_RNG]),
400
 .I4(iInstruction0[`INST_SCR1_ADDR_RNG]),
401
 .I5(`DATA_ADDRESS_WIDTH'b0),
402
 .I6(`DATA_ADDRESS_WIDTH'b0),
403
 .I7(wSource1Addr_Displaced_plus_Index),
404
 .I8(wSource1Addr_Displaced_plus_Index),
405
 .O1(wSourceAddress1_Imm)
406
 );
407
`endif
408
 
409
 
410
`ifdef ADDRESSING_MODES_DISABLED
411
assign oSourceAddress0     = (iInstruction0[`INST_IMM] ) ? iInstruction0[`INST_DST_RNG] : iInstruction0[`INST_SRC0_ADDR_RNG];
412
`else
413
 
414
assign oSourceAddress0 = (iInstruction0[`INST_IMM]) ? wSourceAddress0_Imm :
415
((iInstruction0[`INST_SRC0_DISPLACED]) ? wSource0Addr_Displaced: iInstruction0[`INST_SRC0_ADDR_RNG]);
416
 
417
assign wSource0Addr_Displaced = iInstruction0[`INST_SRC0_ADDR_RNG] + iFrameOffset;
418
assign wSource0Addr_Displaced_plus_Index = wSource0Addr_Displaced + iIndexRegister;
419
 
420
MUXFULLPARALELL_2SEL_GENERIC # ( `DATA_ADDRESS_WIDTH ) SRC0ADDRMUX
421
 (
422
 .Sel({iInstruction0[`INST_SRC1_DISPLACED],iInstruction0[`INST_SRC0_DISPLACED]}),
423
 .I1(iInstruction0[`INST_DST_RNG]),
424
 .I2(iInstruction0[`INST_DST_RNG]),
425
 .I3(wSource0Addr_Displaced_plus_Index),
426
 .I4(wSource0Addr_Displaced),
427
 .O1(wSourceAddress0_Imm)
428
 );
429
 
430
`endif
431
 
432
 
433
assign wCommitBusDataAvailabe = ((iResultBcast[`COMMIT_RSID_RNG] != `OPERATION_NOP) && (~iIgnoreResultBcast));
434
 
435
 
436
sync_fifo  # (`COMMIT_PACKET_SIZE,2 ) RESULT_IN_FIFO
437
(
438
 .clk(    Clock              ),
439
 .reset(  Reset              ),
440
 .din(    iResultBcast       ),
441
 .wr_en(  wCommitBusDataAvailabe  ),
442
 .rd_en(  rPopFifo           ),
443
 .dout(   wResultFifoData    ),
444
 .empty(  wCommitBusInputFifo_Empty   )
445
 
446
);
447
 
448
 
449
 
450
 
451
 
452
//Source 1 for IMM values is really DST
453
 
454
//Reservation station for SRC0 when handling IMM values is zero
455
 
456
wire wSB0FromInCommit,wSB0ForwardDetected;
457
wire wSB1FromInCommit,wSB1ForwardDetected;
458
 
459
assign wSB0FromInCommit = 1'b0;//(rIssueNow && (iResultBcast[`COMMIT_DST_RNG] == oSourceAddress0)) ? 1'b1 : 1'b0;
460
assign wSB1FromInCommit = 1'b0;//(rIssueNow && (iResultBcast[`COMMIT_DST_RNG] == oSourceAddress1)) ? 1'b1 : 1'b0;
461
 
462
`ifdef ADDRESSING_MODES_DISABLED
463
wire [`DATA_ADDRESS_WIDTH-1:0] wTmpAddr0;
464
assign wTmpAddr0 = (iInstruction0[`INST_IMM])  ? iInstruction0[`INST_DST_RNG] : iInstruction0[`INST_SRC0_ADDR_RNG];
465
 
466
assign wSB0ForwardDetected = (rUseForwardedData && (wCommitData_Latched[`COMMIT_DST_RNG] == wTmpAddr0) ) ? 1'b1 : 1'b0;
467
assign wSB1ForwardDetected = (rUseForwardedData && (wCommitData_Latched[`COMMIT_DST_RNG] == iInstruction0[`INST_SCR1_ADDR_RNG]) ) ? 1'b1 : 1'b0;
468
`else
469
wire [`DATA_ADDRESS_WIDTH-1:0] wTmpAddr0,wTmpAddr1;
470
assign wTmpAddr0 = oSourceAddress0;
471
assign wTmpAddr1 = oSourceAddress1;
472
 
473
assign wSB0ForwardDetected = (rUseForwardedData && (wCommitData_Latched[`COMMIT_DST_RNG] == wTmpAddr0) /*&& ( wSource0_Station == iResultBcast[`COMMIT_RSID_RNG])*/ ) ? 1'b1 : 1'b0;
474
assign wSB1ForwardDetected = (rUseForwardedData && (wCommitData_Latched[`COMMIT_DST_RNG] == wTmpAddr1) /*&& ( wSource1_Station == iResultBcast[`COMMIT_RSID_RNG])*/ ) ? 1'b1 : 1'b0;
475
`endif
476
 
477
//FIX!!! FIX!!! Use the table to know when dependencies for SRC0 and SRC1 are don't care
478
//Fix this should not be (iInstruction0[`INST_IMM] & iInstruction0[`INST_DEST_ZERO]) but isntead should use the table
479
assign wSource0_Station = (wSB0FromInCommit | wSB0ForwardDetected | (iInstruction0[`INST_IMM] & iInstruction0[`INST_DEST_ZERO])) ? 4'b0    : wSBDataPort0;
480
assign wSource1_Station = (iInstruction0[`INST_IMM] | wSB1FromInCommit | wSB1ForwardDetected) ? 4'b0: wSBDataPort1;
481
 
482
 
483
//Handle literal values for IMM. IMM is stored in SRC1.X
484
 
485
 
486
wire [`DATA_ROW_WIDTH-1:0]  wImmValue,wSource1_Temp,wSource0_Temp,wSourceData1_Imm,wSourceData0_Imm;
487
assign wImmValue[`X_RNG] = (iInstruction0[`INST_WE_X]) ? iInstruction0[`INST_IMM_RNG] : `WIDTH'b0;
488
assign wImmValue[`Y_RNG] = (iInstruction0[`INST_WE_Y]) ? iInstruction0[`INST_IMM_RNG] : `WIDTH'b0;
489
assign wImmValue[`Z_RNG] = (iInstruction0[`INST_WE_Z]) ? iInstruction0[`INST_IMM_RNG] : `WIDTH'b0;
490
 
491
 
492
 
493
assign wSource1_Temp[`X_RNG] = (wSB1FromInCommit & iResultBcast[`COMMIT_WE_X]) ? iResultBcast[`COMMIT_X_RNG] :
494
( (wSB1ForwardDetected & wCommitData_Latched[`COMMIT_WE_X])? wCommitData_Latched[`X_RNG] : iSourceData1[`X_RNG]);
495
 
496
assign wSource1_Temp[`Y_RNG] = (wSB1FromInCommit & iResultBcast[`COMMIT_WE_Y]) ? iResultBcast[`COMMIT_Y_RNG] :
497
( (wSB1ForwardDetected & wCommitData_Latched[`COMMIT_WE_Y]) ? wCommitData_Latched[`Y_RNG] : iSourceData1[`Y_RNG]);
498
 
499
 
500
assign wSource1_Temp[`Z_RNG] = (wSB1FromInCommit & iResultBcast[`COMMIT_WE_Z]) ? iResultBcast[`COMMIT_Z_RNG] :
501
( (wSB1ForwardDetected & wCommitData_Latched[`COMMIT_WE_Z]) ?  wCommitData_Latched[`Z_RNG] : iSourceData1[`Z_RNG]);
502
 
503
assign wSource0_Temp[`X_RNG] =  (wSB0FromInCommit & iResultBcast[`COMMIT_WE_X]) ? iResultBcast[`COMMIT_X_RNG]:
504
( (wSB0ForwardDetected & & wCommitData_Latched[`COMMIT_WE_X] )? wCommitData_Latched[`X_RNG]:iSourceData0[`X_RNG]);
505
 
506
 
507
assign wSource0_Temp[`Y_RNG] =  (wSB0FromInCommit & iResultBcast[`COMMIT_WE_Y]) ? iResultBcast[`COMMIT_Y_RNG]:
508
( (wSB0ForwardDetected & & wCommitData_Latched[`COMMIT_WE_Y])? wCommitData_Latched[`Y_RNG] : iSourceData0[`Y_RNG]);
509
 
510
assign wSource0_Temp[`Z_RNG] =  (wSB0FromInCommit & iResultBcast[`COMMIT_WE_Z]) ? iResultBcast[`COMMIT_Z_RNG]:
511
( (wSB0ForwardDetected & & wCommitData_Latched[`COMMIT_WE_Z])? wCommitData_Latched[`Z_RNG] : iSourceData0[`Z_RNG]);
512
 
513
 
514
 
515
//If the data we are looking for just arrived at iResultBcast the use that
516
//other wise used the data from the Register file or the Immediate values
517
//assign wSourceData1 = (iInstruction0[`INST_IMM]) ? wImmValue : wSource1_Temp;
518
//assign wSourceData0 = (iInstruction0[`INST_IMM] && iInstruction0[`INST_DEST_ZERO]) ? `DATA_ROW_WIDTH'd0 : wSource0_Temp;
519
 
520
 
521
assign wSourceData1 = (iInstruction0[`INST_IMM]) ? wSourceData1_Imm : wSource1_Temp;
522
assign wSourceData0 = (iInstruction0[`INST_IMM]) ? wSourceData0_Imm : wSource0_Temp;
523
//assign wSourceData0 = (iInstruction0[`INST_IMM] && iInstruction0[`INST_DEST_ZERO]) ? `DATA_ROW_WIDTH'd0 : wSource0_Temp;
524
 
525
MUXFULLPARALELL_3SEL_GENERIC # ( `DATA_ROW_WIDTH ) SRC1MUX
526
 (
527
 .Sel({iInstruction0[`INST_DEST_ZERO],iInstruction0[`INST_SRC1_DISPLACED],iInstruction0[`INST_SRC0_DISPLACED]}),
528
 .I1(wImmValue),
529
 .I2(wImmValue),
530
 .I3(wSource1_Temp),
531
 .I4( `DATA_ROW_WIDTH'b0),
532
 .I5( wImmValue ),
533
 .I6( wImmValue ),
534
 .I7( wSource1_Temp ),
535
 .I8( wSource1_Temp ),
536
 .O1(wSourceData1_Imm)
537
 );
538
 
539
 
540
MUXFULLPARALELL_3SEL_GENERIC # ( `DATA_ROW_WIDTH ) SRC0MUX
541
 (
542
 .Sel({iInstruction0[`INST_DEST_ZERO],iInstruction0[`INST_SRC1_DISPLACED],iInstruction0[`INST_SRC0_DISPLACED]}),
543
 .I1(   wSource0_Temp      ),
544
 .I2(   wSource0_Temp      ),
545
 .I3(   wSource0_Temp      ),
546
 .I4(   wSource0_Temp      ),
547
 .I5(  `DATA_ROW_WIDTH'b0  ),
548
 .I6(  `DATA_ROW_WIDTH'b0  ),
549
 .I7(  `DATA_ROW_WIDTH'b0  ),
550
 .I8(   wSource0_Temp      ),
551
 .O1(   wSourceData0_Imm      )
552
 );
553
 
554
 
555
assign wReservationStationBusy = (~iEnable) |
556
(
557
((iInstruction0[`INST_CODE_RNG] == `OPERATION_ADD ) && (iRStationBusy[ 0  ] && iRStationBusy[ 1  ])) ||
558
((iInstruction0[`INST_CODE_RNG] == `OPERATION_DIV ) &&  iRStationBusy[ 2  ]) ||
559
((iInstruction0[`INST_CODE_RNG] == `OPERATION_MUL ) &&  iRStationBusy[ 3  ]) ||
560
((iInstruction0[`INST_CODE_RNG] == `OPERATION_OUT ) &&  iRStationBusy[ 6  ])
561
);
562
 
563
assign wBranchWithDependency = (iInstruction0[`INST_BRANCH_BIT] && (wSource0_Station != 0 || wSource1_Station != 0));
564
 
565
 
566
assign wOp = iInstruction0[`INST_CODE_RNG];
567
 
568
assign wReservationStation[0] =
569
(wOp[0]  & ~wOp[1] & ~wOp[2] & ~wOp[3] & ~iRStationBusy[ 0  ]) |
570
(~wOp[0] &  wOp[1] & ~wOp[2] & ~wOp[3] & ~iRStationBusy[ 2  ]) |
571
(~wOp[0] & ~wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[ 4  ]) |
572
(~wOp[0] &  wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[ 6  ]);
573
 
574
assign wReservationStation[1] =
575
(~wOp[0] &  wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[ 6  ]) |
576
(wOp[0] & ~wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[5]   ) |
577
(wOp[0] & ~wOp[1] & ~wOp[2] & ~wOp[3] & iRStationBusy[ 0  ] & ~iRStationBusy[1]) |
578
(~wOp[0] & wOp[1] & ~wOp[2] & ~wOp[3] & ~iRStationBusy[ 2  ]);
579
 
580
 
581
assign wReservationStation[2] =
582
(~wOp[0] &  wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[ 6  ]) |
583
(wOp[0] & ~wOp[1] & wOp[2] & ~wOp[3]  & ~iRStationBusy[5]) |
584
(wOp[0] & wOp[1] & ~wOp[2] & ~wOp[3]  & ~iRStationBusy[3]) |
585
(~wOp[0] & ~wOp[1] & wOp[2] & ~wOp[3] & ~iRStationBusy[ 4  ]);
586
 
587
assign wReservationStation[3] = 1'b0;
588
 
589
//Sign control logic.
590
//Only works for non literal opeations (INST_IMM == 0)
591
wire [`ISSUE_SRCTAG_SIZE-1:0]  wIssueTag0,wIssueTag1;
592
 
593
 assign wIssueTag0 = (iInstruction0[`INST_IMM]) ? `ISSUE_SRCTAG_SIZE'b0 : {iInstruction0[`INST_SRC0_SIGN_RNG],iInstruction0[`INST_SRC0_SWZL_RNG] };
594
 assign wIssueTag1 = (iInstruction0[`INST_IMM]) ? `ISSUE_SRCTAG_SIZE'b0 : {iInstruction0[`INST_SRC1_SIGN_RNG],iInstruction0[`INST_SCR1_SWZL_RNG] };
595
 
596
wire [`DATA_ADDRESS_WIDTH -1:0] wDestinationIndex;
597
 
598
 
599
`ifdef ADDRESSING_MODES_DISABLED
600
assign wDestinationIndex = iInstruction0[`INST_DST_RNG];
601
`else
602
 
603
wire [`DATA_ADDRESS_WIDTH -1:0] wDestIndexDisplaced,wDestinationIndex_NoIMM,wDestinationIndex_IMM;
604
 
605
assign wDestIndexDisplaced     = (iInstruction0[`INST_DST_RNG] + iFrameOffset);
606
assign wDestinationIndex_NoIMM = (iInstruction0[`INST_DEST_ZERO])               ? wDestIndexDisplaced : iInstruction0[`INST_DST_RNG];
607
 
608
 
609
MUXFULLPARALELL_3SEL_GENERIC # ( `DATA_ADDRESS_WIDTH ) DSTMUX
610
 (
611
 .Sel({iInstruction0[`INST_DEST_ZERO],iInstruction0[`INST_SRC1_DISPLACED],iInstruction0[`INST_SRC0_DISPLACED]}),
612
 .I1(iInstruction0[`INST_DST_RNG]),
613
 .I2(wDestIndexDisplaced),
614
 .I3(wDestIndexDisplaced),
615
 .I4(wDestIndexDisplaced + wSource1_Temp[`X_RNG]),
616
 .I5(iInstruction0[`INST_DST_RNG]),
617
 .I6(wDestIndexDisplaced),
618
 .I7(iInstruction0[`INST_DST_RNG]),
619
 .I8(wDestIndexDisplaced),
620
 .O1(wDestinationIndex_IMM)
621
 );
622
 
623
 
624
assign wDestinationIndex = (iInstruction0[`INST_IMM]) ? wDestinationIndex_IMM : wDestinationIndex_NoIMM;
625
`endif
626
 
627
assign oIssueBcast = (Reset | ~rIssueNow | wStall ) ? `ISSUE_PACKET_SIZE'b0 :
628
{
629
wReservationStation,
630
wDestinationIndex,
631
iInstruction0[`INST_WE_RNG],
632
iInstruction0[`INST_SCOP_RNG],
633
wSource1_Station,
634
wIssueTag1,
635
wSourceData1,
636
wSource0_Station,
637
wIssueTag0,
638
wSourceData0
639
 
640
};
641
 
642
endmodule

powered by: WebSVN 2.1.0

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