Line 179... |
Line 179... |
Reg#(MemReq#(TAdd#(PicWidthSz,2),32)) interMemReqQdelay <- mkRegU();
|
Reg#(MemReq#(TAdd#(PicWidthSz,2),32)) interMemReqQdelay <- mkRegU();
|
FIFO#(MemResp#(32)) interMemRespQ <- mkFIFO;
|
FIFO#(MemResp#(32)) interMemRespQ <- mkFIFO;
|
Reg#(Bit#(3)) interReqCount <- mkReg(0);
|
Reg#(Bit#(3)) interReqCount <- mkReg(0);
|
Reg#(Bit#(3)) interRespCount <- mkReg(0);
|
Reg#(Bit#(3)) interRespCount <- mkReg(0);
|
|
|
Reg#(Bit#(1)) interStepCount <- mkReg(0);
|
Reg#(Bit#(2)) interStepCount <- mkReg(0);
|
Reg#(Bit#(2)) interMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interSubMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interSubMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interPassingCount <- mkReg(0);
|
Reg#(Bit#(2)) interPassingCount <- mkReg(0);
|
Reg#(Vector#(4,Bit#(4))) interRefIdxVector <- mkRegU();
|
Reg#(Vector#(4,Bit#(4))) interRefIdxVector <- mkRegU();
|
Reg#(Vector#(4,Bit#(2))) interSubMbTypeVector <- mkRegU();
|
Reg#(Vector#(4,Bit#(2))) interSubMbTypeVector <- mkRegU();
|
RFile1#(Bit#(4),Tuple2#(Bit#(14),Bit#(12))) interMvFile <- mkRFile1Full();
|
RFile1#(Bit#(4),Tuple2#(Bit#(14),Bit#(12))) interMvFile <- mkRFile1Full();
|
Reg#(Bit#(15)) interMvDiffTemp <- mkReg(0);
|
Reg#(Bit#(15)) interMvDiffTemp <- mkReg(0);
|
FIFO#(Tuple2#(Bit#(15),Bit#(13))) interMvDiff <- mkFIFO;
|
FIFO#(Tuple2#(Bit#(15),Bit#(13))) interMvDiff <- mkFIFO;
|
Reg#(Bit#(5)) interNewestMv <- mkReg(0);
|
Reg#(Bit#(5)) interNewestMv <- mkReg(0);
|
|
|
|
// Registers for pipelining the interStage rule
|
|
|
|
Reg#(Bit#(3)) partWidthR <- mkRegU();
|
|
Reg#(Bit#(3)) partHeightR <- mkRegU();
|
|
Reg#(Bit#(3)) numPartR <- mkRegU();
|
|
Reg#(Bit#(3)) numSubPartR <- mkRegU();
|
|
Reg#(Bit#(2)) subMbTypeR <- mkRegU();
|
|
Reg#(Bool) calcmvR <- mkRegU();
|
|
Reg#(Bool) leftmvR <- mkRegU();
|
|
Reg#(Bit#(4)) refIndexR <- mkRegU();
|
|
Reg#(Vector#(3,InterBlockMv)) blockABCR <- mkRegU();
|
|
Reg#(Bit#(14)) mvhorfinalR <- mkRegU();
|
|
Reg#(Bit#(12)) mvverfinalR <- mkRegU();
|
|
Reg#(Bit#(5)) interNewestMvNextR <- mkRegU();
|
|
|
|
|
Reg#(Bit#(2)) interIPStepCount <- mkReg(0);
|
Reg#(Bit#(2)) interIPStepCount <- mkReg(0);
|
Reg#(Bit#(2)) interIPMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interIPMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interIPSubMbPartNum <- mkReg(0);
|
Reg#(Bit#(2)) interIPSubMbPartNum <- mkReg(0);
|
|
|
Reg#(Bit#(PicWidthSz)) interCurrMbDiff <- mkReg(0);
|
Reg#(Bit#(PicWidthSz)) interCurrMbDiff <- mkReg(0);
|
Line 233... |
Line 249... |
Reg#(Bit#(4)) intraStepCount <- mkReg(0);
|
Reg#(Bit#(4)) intraStepCount <- mkReg(0);
|
Reg#(Bit#(13)) intraSumA <- mkReg(0);
|
Reg#(Bit#(13)) intraSumA <- mkReg(0);
|
Reg#(Bit#(15)) intraSumB <- mkReg(0);
|
Reg#(Bit#(15)) intraSumB <- mkReg(0);
|
Reg#(Bit#(15)) intraSumC <- mkReg(0);
|
Reg#(Bit#(15)) intraSumC <- mkReg(0);
|
|
|
|
Reg#(Vector#(4,Bit#(8))) intraPredVector <- mkRegU();
|
|
|
//-----------------------------------------------------------
|
//-----------------------------------------------------------
|
// Rules
|
// Rules
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
Line 249... |
Line 265... |
// if(infifo.first() matches tagged ITBresidual .xdata)
|
// if(infifo.first() matches tagged ITBresidual .xdata)
|
// $display( "TRACE Prediction: stateMonitor outBlockNum outPixelNum outChromaFlag %0d %0d", outBlockNum, outPixelNum, outChromaFlag);////////////////////
|
// $display( "TRACE Prediction: stateMonitor outBlockNum outPixelNum outChromaFlag %0d %0d", outBlockNum, outPixelNum, outChromaFlag);////////////////////
|
// endrule
|
// endrule
|
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
rule checkFIFO ( True );
|
rule checkFIFO ( True );
|
$display( "Trace Prediction: checkFIFO %h", infifo_ITB.first() );
|
$display( "Trace Prediction: checkFIFO %h", infifo.first() );
|
|
endrule
|
|
rule checkFIFO_ITB ( True );
|
|
$display( "Trace Prediction: checkFIFO_ITB %h", infifo_ITB.first() );
|
|
endrule
|
|
rule checkFIFO_predicted ( True );
|
|
$display( "Trace Prediction: checkFIFO_predicted %h", predictedfifo.first() );
|
endrule
|
endrule
|
|
|
|
|
rule passing ( passFlag && !outstatefifo.notEmpty() && currMbHor
|
rule passing ( passFlag && !outstatefifo.notEmpty() && currMbHor
|
$display( "Trace Prediction: passing infifo packed %h", pack(infifo.first()));
|
$display( "Trace Prediction: passing infifo packed %h", pack(infifo.first()));
|
case (infifo.first()) matches
|
case (infifo.first()) matches
|
tagged NewUnit . xdata :
|
tagged NewUnit . xdata :
|
begin
|
begin
|
Line 934... |
Line 956... |
|
|
rule interProcessStep ( interStepCount>0 && currMbHor
|
rule interProcessStep ( interStepCount>0 && currMbHor
|
Bit#(PicAreaSz) currMbTemp = currMb+zeroExtend(interCurrMbDiff)-1;
|
Bit#(PicAreaSz) currMbTemp = currMb+zeroExtend(interCurrMbDiff)-1;
|
Bit#(2) blockHor = {interMbPartNum[0],interSubMbPartNum[0]};
|
Bit#(2) blockHor = {interMbPartNum[0],interSubMbPartNum[0]};
|
Bit#(2) blockVer = {interMbPartNum[1],interSubMbPartNum[1]};
|
Bit#(2) blockVer = {interMbPartNum[1],interSubMbPartNum[1]};
|
|
|
|
if(interStepCount == 1)
|
|
begin
|
Bit#(3) partWidth = 0;
|
Bit#(3) partWidth = 0;
|
Bit#(3) partHeight = 0;
|
Bit#(3) partHeight = 0;
|
Bit#(3) numPart = 1;
|
Bit#(3) numPart = 1;
|
Bit#(3) numSubPart = 1;
|
Bit#(3) numSubPart = 1;
|
Bit#(2) subMbType = 0;
|
Bit#(2) subMbType = 0;
|
Line 1011... |
Line 1036... |
end
|
end
|
endcase
|
endcase
|
end
|
end
|
else
|
else
|
$display( "ERROR Prediction: interProcessStep unexpected interstate");
|
$display( "ERROR Prediction: interProcessStep unexpected interstate");
|
|
|
Bit#(4) refIndex = ((interstate==InterPskip||interstate==InterP8x8ref0) ? 0 : interRefIdxVector[interMbPartNum]);
|
Bit#(4) refIndex = ((interstate==InterPskip||interstate==InterP8x8ref0) ? 0 : interRefIdxVector[interMbPartNum]);
|
Vector#(3,InterBlockMv) blockABC = replicate(NotInter 0);
|
Vector#(3,InterBlockMv) blockABC = replicate(NotInter 0);
|
if( currMbTemp-firstMb==0 && blockHor==0 )
|
if( currMbTemp-firstMb==0 && blockHor==0 )
|
blockABC[0] = (NotInter 0);
|
blockABC[0] = (NotInter 0);
|
else
|
else
|
Line 1024... |
Line 1050... |
else
|
else
|
blockABC[1] = interTopVal[blockHor];
|
blockABC[1] = interTopVal[blockHor];
|
blockABC[2] = interTopVal[{1'b0,blockHor}+partWidth];
|
blockABC[2] = interTopVal[{1'b0,blockHor}+partWidth];
|
if(noBlockC || blockABC[2]==(NotInter 0))
|
if(noBlockC || blockABC[2]==(NotInter 0))
|
blockABC[2] = interTopLeftVal[blockVer];
|
blockABC[2] = interTopLeftVal[blockVer];
|
|
partWidthR <= partWidth;
|
|
partHeightR <= partHeight;
|
|
numPartR <= numPart;
|
|
numSubPartR <= numSubPart;
|
|
subMbTypeR <= subMbType;
|
|
calcmvR <= calcmv;
|
|
leftmvR <= leftmv;
|
|
refIndexR <= refIndex;
|
|
blockABCR <= blockABC;
|
|
interStepCount <= 2;
|
|
end
|
|
else if(interStepCount==2)
|
|
begin
|
|
Bit#(3) partWidth = partWidthR;
|
|
Bit#(3) partHeight = partHeightR;
|
|
Bit#(3) numPart = numPartR;
|
|
Bit#(3) numSubPart = numSubPartR;
|
|
Bit#(2) subMbType = subMbTypeR;
|
|
Bool calcmv = calcmvR;
|
|
Bool leftmv = leftmvR;
|
|
Bit#(4) refIndex = refIndexR;
|
|
Vector#(3,InterBlockMv) blockABC = blockABCR;
|
Bit#(14) mvhorfinal = 0;
|
Bit#(14) mvhorfinal = 0;
|
Bit#(12) mvverfinal = 0;
|
Bit#(12) mvverfinal = 0;
|
Bit#(5) interNewestMvNext = 0;
|
Bit#(5) interNewestMvNext = 0;
|
if(calcmv)//motion vector caculation
|
if(calcmv)//motion vector caculation
|
begin
|
begin
|
Line 1145... |
Line 1193... |
end
|
end
|
else
|
else
|
$display( "ERROR Prediction: interProcessStep unexpected blockABC[1]");
|
$display( "ERROR Prediction: interProcessStep unexpected blockABC[1]");
|
end
|
end
|
end
|
end
|
|
|
|
mvhorfinalR <= mvhorfinal;
|
|
mvverfinalR <= mvverfinal;
|
|
interNewestMvNextR <= interNewestMvNext;
|
|
interStepCount <= 3;
|
|
|
|
end
|
|
else // stepCount == 3
|
|
begin
|
Bit#(2) tempBShor = 0;//bS calculation
|
Bit#(2) tempBShor = 0;//bS calculation
|
Bit#(2) tempBSver = 0;
|
Bit#(2) tempBSver = 0;
|
|
Bool allDone = False;
|
|
Bit#(4) refIndex = refIndexR;
|
|
Bit#(14) mvhorfinal = mvhorfinalR;
|
|
Bit#(12) mvverfinal = mvverfinalR;
|
|
Bit#(5) interNewestMvNext = interNewestMvNextR;
|
|
|
if(interLeftVal[blockVer] matches tagged BlockMv .xdata)
|
if(interLeftVal[blockVer] matches tagged BlockMv .xdata)
|
begin
|
begin
|
if(xdata.nonZeroTransCoeff == 1)
|
if(xdata.nonZeroTransCoeff == 1)
|
tempBShor = 2;
|
tempBShor = 2;
|
else
|
else
|
Line 1193... |
Line 1256... |
begin
|
begin
|
interSubMbPartNum <= 0;
|
interSubMbPartNum <= 0;
|
if(interMbPartNum == 3)
|
if(interMbPartNum == 3)
|
begin
|
begin
|
interMbPartNum <= 0;
|
interMbPartNum <= 0;
|
interStepCount <= 0;
|
allDone = True;
|
interNewestMvNext = 16;
|
interNewestMvNext = 16;
|
end
|
end
|
else
|
else
|
interMbPartNum <= interMbPartNum+1;
|
interMbPartNum <= interMbPartNum+1;
|
end
|
end
|
else
|
else
|
interSubMbPartNum <= interSubMbPartNum+1;
|
interSubMbPartNum <= interSubMbPartNum+1;
|
if(interNewestMvNext > 0)
|
if(interNewestMvNext > 0)
|
interNewestMv <= interNewestMvNext;
|
interNewestMv <= interNewestMvNext;
|
|
|
|
// Check to see if we are done.
|
|
|
|
if(allDone)
|
|
interStepCount <= 0;
|
|
else
|
|
interStepCount <= 1;
|
|
|
|
$display( "Trace Prediction: interProcessStep final %h %h %h %h %h %h %h",interstate,interStepCount,interMbPartNum,interSubMbPartNum,mvhorfinal,mvverfinal,interNewestMvNext);
|
|
|
|
end
|
endrule
|
endrule
|
|
|
|
|
rule interIPProcessStep ( interIPStepCount>0 && currMbHorzeroExtend({interIPMbPartNum,interIPSubMbPartNum}) );
|
rule interIPProcessStep ( interIPStepCount>0 && currMbHorzeroExtend({interIPMbPartNum,interIPSubMbPartNum}) );
|
Bit#(PicAreaSz) currMbHorTemp = currMbHor+zeroExtend(interCurrMbDiff)-1;
|
Bit#(PicAreaSz) currMbHorTemp = currMbHor+zeroExtend(interCurrMbDiff)-1;
|