Line 8... |
Line 8... |
|
|
import H264Types::*;
|
import H264Types::*;
|
|
|
import IDeblockFilter::*;
|
import IDeblockFilter::*;
|
import FIFO::*;
|
import FIFO::*;
|
|
import FIFOF::*;
|
import Vector::*;
|
import Vector::*;
|
|
|
import Connectable::*;
|
import Connectable::*;
|
import GetPut::*;
|
import GetPut::*;
|
import ClientServer::*;
|
import ClientServer::*;
|
import RegFile::*;
|
import RegFile::*;
|
import RWire::*;
|
import RWire::*;
|
|
|
|
|
//-----------------------------------------------------------
|
//-----------------------------------------------------------
|
// Local Datatypes
|
// Local Datatypes
|
//-----------------------------------------------------------
|
//-----------------------------------------------------------
|
|
|
|
|
Line 280... |
Line 280... |
|
|
|
|
(* synthesize *)
|
(* synthesize *)
|
module mkDeblockFilter( IDeblockFilter );
|
module mkDeblockFilter( IDeblockFilter );
|
|
|
FIFO#(EntropyDecOT) infifo <- mkSizedFIFO(deblockFilter_infifo_size);
|
FIFOF#(EntropyDecOT) infifo <- mkSizedFIFOF(deblockFilter_infifo_size);
|
FIFO#(DeblockFilterOT) outfifo <- mkFIFO();
|
FIFO#(DeblockFilterOT) outfifo <- mkFIFO();
|
|
FIFO#(DeblockFilterOT) outfifoVertical <- mkFIFO();
|
|
|
FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) dataMemReqQ <- mkFIFO;
|
FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) dataMemReqQ <- mkFIFO;
|
|
FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqRowToColumnConversion <- mkFIFO();
|
|
FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqVertical <- mkFIFO();
|
|
FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqDataSendReq <- mkFIFO();
|
|
|
FIFO#(MemReq#(PicWidthSz,13)) parameterMemReqQ <- mkFIFO;
|
FIFO#(MemReq#(PicWidthSz,13)) parameterMemReqQ <- mkFIFO;
|
FIFO#(MemResp#(32)) dataMemRespQ <- mkFIFO;
|
FIFO#(MemResp#(32)) dataMemRespQ <- mkFIFO;
|
FIFO#(MemResp#(13)) parameterMemRespQ <- mkFIFO;
|
FIFO#(MemResp#(13)) parameterMemRespQ <- mkFIFO;
|
|
|
Reg#(Process) process <- mkReg(Passing);
|
Reg#(Process) process <- mkReg(Passing);
|
Line 373... |
Line 378... |
Reg#(Bit#(2)) columnToRowState <- mkReg(0);
|
Reg#(Bit#(2)) columnToRowState <- mkReg(0);
|
FIFO#(Tuple2#(Bit#(4), Bit#(1))) columnToRowStoreBlock <- mkFIFO();
|
FIFO#(Tuple2#(Bit#(4), Bit#(1))) columnToRowStoreBlock <- mkFIFO();
|
|
|
Reg#(Bit#(2)) columnNumber <- mkReg(0);
|
Reg#(Bit#(2)) columnNumber <- mkReg(0);
|
|
|
|
// Debugging register
|
|
Reg#(Bit#(32)) fifo_full_count <- mkReg(0);
|
|
Reg#(Bit#(32)) total_cycles <- mkReg(0);
|
|
|
//-----------------------------------------------------------
|
//-----------------------------------------------------------
|
// Rules
|
// Rules
|
|
|
|
rule incr;
|
|
total_cycles <= total_cycles + 1;
|
|
endrule
|
|
|
|
|
rule checkFIFO ( True );
|
rule checkFIFO ( True );
|
$display( "Trace DeblockFilter: checkFIFO %h", infifo.first() );
|
$display( "Trace DeblockFilter: checkFIFO %h cycle: %d", infifo.first(), total_cycles );
|
$display( "TRACE DeblockFilter: checkFIFO %h", infifo.first() );
|
$display( "TRACE DeblockFilter: checkFIFO %h", infifo.first() );
|
|
if(!infifo.notFull)
|
|
begin
|
|
fifo_full_count <= fifo_full_count + 1;
|
|
$display("DEBLOCK FIFO FULL: %d of %d",fifo_full_count, total_cycles);
|
|
end
|
|
endrule
|
|
|
|
rule memReqMergeRowToColumnConversion;
|
|
memReqRowToColumnConversion.deq();
|
|
dataMemReqQ.enq(memReqRowToColumnConversion.first());
|
|
endrule
|
|
|
|
rule memReqMergeVertical;
|
|
memReqVertical.deq();
|
|
dataMemReqQ.enq(memReqVertical.first());
|
endrule
|
endrule
|
|
|
|
rule memReqMergeDataSendReq;
|
|
memReqDataSendReq.deq();
|
|
dataMemReqQ.enq(memReqDataSendReq.first());
|
|
endrule
|
|
|
|
rule outfifoVerticalSplit;
|
|
outfifoVertical.deq();
|
|
outfifo.enq(outfifoVertical.first());
|
|
endrule
|
|
|
rule passing ( process matches Passing );
|
rule passing ( process matches Passing );
|
case (infifo.first()) matches
|
case (infifo.first()) matches
|
tagged NewUnit . xdata :
|
tagged NewUnit . xdata :
|
begin
|
begin
|
Line 510... |
Line 546... |
begin
|
begin
|
if(dataReqCount==1)
|
if(dataReqCount==1)
|
parameterMemReqQ.enq(LoadReq (temp));
|
parameterMemReqQ.enq(LoadReq (temp));
|
Bit#(4) temp2 = truncate(dataReqCount-1);
|
Bit#(4) temp2 = truncate(dataReqCount-1);
|
let temp3 = {temp,chromaFlag,temp2};
|
let temp3 = {temp,chromaFlag,temp2};
|
dataMemReqQ.enq(LoadReq (temp3));
|
memReqDataSendReq.enq(LoadReq (temp3));
|
if(dataReqCount==16)
|
if(dataReqCount==16)
|
dataReqCount <= 0;
|
dataReqCount <= 0;
|
else
|
else
|
dataReqCount <= dataReqCount+1;
|
dataReqCount <= dataReqCount+1;
|
end
|
end
|
Line 565... |
Line 601... |
begin
|
begin
|
$display( "TRACE Deblocking Filter: rowToColumnRotate rotating block (%0d, %0d) rowtoColumnState: %d bottomRightBlock: %d, data: %h", blockHor, blockVer, rowToColumnState, storeBottomRightBlock, data_out);
|
$display( "TRACE Deblocking Filter: rowToColumnRotate rotating block (%0d, %0d) rowtoColumnState: %d bottomRightBlock: %d, data: %h", blockHor, blockVer, rowToColumnState, storeBottomRightBlock, data_out);
|
// The block hor calculation may be questionable... between U and V.
|
// The block hor calculation may be questionable... between U and V.
|
if(chromaFlag == 0)
|
if(chromaFlag == 0)
|
begin
|
begin
|
dataMemReqQ.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,2'b11,rowToColumnState},data:data_out});
|
memReqRowToColumnConversion.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,2'b11,rowToColumnState},data:data_out});
|
end
|
end
|
else
|
else
|
begin //differentiate between u and v
|
begin //differentiate between u and v
|
dataMemReqQ.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,blockHor[1],1'b1,rowToColumnState},data:data_out});
|
memReqRowToColumnConversion.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,blockHor[1],1'b1,rowToColumnState},data:data_out});
|
end
|
end
|
|
|
end
|
end
|
else // pass data along to vertical filter
|
else // pass data along to vertical filter
|
begin
|
begin
|
Line 819... |
Line 855... |
end
|
end
|
// these outputs occur in the past, so we must use the adjusted Mb numbers
|
// these outputs occur in the past, so we must use the adjusted Mb numbers
|
else if(chromaFlag==0)
|
else if(chromaFlag==0)
|
begin
|
begin
|
$display("TRACE mkDeblockFilter: (Left Vector) Outputting Luma ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",{adjustedMbVer,blockVer,pixelNum},{adjustedMbHor,2'b11} ,result[31:0] );
|
$display("TRACE mkDeblockFilter: (Left Vector) Outputting Luma ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",{adjustedMbVer,blockVer,pixelNum},{adjustedMbHor,2'b11} ,result[31:0] );
|
outfifo.enq(DFBLuma {ver:{adjustedMbVer,blockVer,pixelVer},
|
outfifoVertical.enq(DFBLuma {ver:{adjustedMbVer,blockVer,pixelVer},
|
hor:{adjustedMbHor,2'b11},
|
hor:{adjustedMbHor,2'b11},
|
data:result[31:0]});
|
data:result[31:0]});
|
end
|
end
|
else
|
else
|
begin
|
begin
|
$display("TRACE mkDeblockFilter: (Left Vector) Outputting Chroma %d ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",blockHor[1],{adjustedMbVer,blockVer[0],pixelNum},{adjustedMbHor,1'b1} ,result[31:0]);
|
$display("TRACE mkDeblockFilter: (Left Vector) Outputting Chroma %d ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",blockHor[1],{adjustedMbVer,blockVer[0],pixelNum},{adjustedMbHor,1'b1} ,result[31:0]);
|
outfifo.enq(DFBChroma {uv:blockHor[1],
|
outfifoVertical.enq(DFBChroma {uv:blockHor[1],
|
ver:{adjustedMbVer,blockVer[0],pixelVer},
|
ver:{adjustedMbVer,blockVer[0],pixelVer},
|
hor:{adjustedMbHor,1'b1},
|
hor:{adjustedMbHor,1'b1},
|
data:result[31:0]});
|
data:result[31:0]});
|
end
|
end
|
end
|
end
|
Line 1012... |
Line 1048... |
// roll through the block clean up.
|
// roll through the block clean up.
|
begin
|
begin
|
blockHorVerticalCleanup <= blockHor;
|
blockHorVerticalCleanup <= blockHor;
|
verticalState <= VerticalCleanup;
|
verticalState <= VerticalCleanup;
|
end
|
end
|
dataMemReqQ.enq(StoreReq {addr:{currMbHorT,chromaFlag,blockHor,columnNumber},data:resultV[63:32]});
|
memReqVertical.enq(StoreReq {addr:{currMbHorT,chromaFlag,blockHor,columnNumber},data:resultV[63:32]});
|
end
|
end
|
columnToRowStore[columnNumber].enq(resultV[31:0]);
|
columnToRowStore[columnNumber].enq(resultV[31:0]);
|
if(columnNumber == 0)
|
if(columnNumber == 0)
|
begin
|
begin
|
columnToRowStoreBlock.enq(tuple2(blockNumCols,1'b0));
|
columnToRowStoreBlock.enq(tuple2(blockNumCols,1'b0));
|
Line 1100... |
Line 1136... |
interface Client mem_client_parameter;
|
interface Client mem_client_parameter;
|
interface Get request = fifoToGet(parameterMemReqQ);
|
interface Get request = fifoToGet(parameterMemReqQ);
|
interface Put response = fifoToPut(parameterMemRespQ);
|
interface Put response = fifoToPut(parameterMemRespQ);
|
endinterface
|
endinterface
|
|
|
interface Put ioin = fifoToPut(infifo);
|
interface Put ioin = fifoToPut(fifofToFifo(infifo));
|
interface Get ioout = fifoToGet(outfifo);
|
interface Get ioout = fifoToGet(outfifo);
|
|
|
endmodule
|
endmodule
|
|
|
endpackage
|
endpackage
|