URL
https://opencores.org/ocsvn/cryptosorter/cryptosorter/trunk
Subversion Repositories cryptosorter
[/] [cryptosorter/] [trunk/] [memocodeDesignContest2008/] [sort/] [VLevelFIFOTester.bsv] - Rev 6
Compare with Previous | Blame | View Log
//----------------------------------------------------------------------//// The MIT License//// Copyright (c) 2008 Alfred Man Cheuk Ng, mcn02@mit.edu//// Permission is hereby granted, free of charge, to any person// obtaining a copy of this software and associated documentation// files (the "Software"), to deal in the Software without// restriction, including without limitation the rights to use,// copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the// Software is furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be// included in all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR// OTHER DEALINGS IN THE SOFTWARE.//----------------------------------------------------------------------//import DReg::*;import FIFO::*;import Vector::*;import VLevelFIFO::*;import BRAMVLevelFIFO::*;import Memocode08Types::*;import LFSR::*;import FIFOF::*;import FIFO::*;import GetPut::*;typedef 2 NumberFifos;typedef 8 DepthFifos;typedef enum {Initialize,Request,Transmit} TesterState deriving(Bits,Eq);(* synthesize *)module mkVLevelFIFOInstance(VLevelFIFO#(NumberFifos,DepthFifos,Record));let mod <- mkBRAMVLevelFIFO();return mod;endmodulemodule mkVLevelFIFOTester (Empty);VLevelFIFO#(NumberFifos,DepthFifos,Record) fifo <- mkVLevelFIFOInstance;Vector#(NumberFifos,FIFOF#(Record)) expectedVals <- replicateM(mkSizedFIFOF(valueof(DepthFifos)));Reg#(Bit#(64)) reqsSent <- mkReg(0);Reg#(Bit#(64)) reqsRxed <- mkReg(0);rule haltAll;Bit#(64) timeCount <- $time;if(timeCount > 1010000)beginif(reqsSent == reqsRxed)begin$display("PASSED");$finish;endelsebegin$display("Expected %d values, got %d", reqsSent, reqsRxed);endendendrulefor(Integer i = 0; i < valueof(NumberFifos); i = i + 1)beginReg#(TesterState) state <- mkReg(Initialize);FIFO#(Bit#(0)) reqQ <- mkFIFO;LFSR#(Bit#(16)) lfsr <- mkLFSR_16;Reg#(Bit#(32)) counter <- mkReg(0);Wire#(Bool) isDeqW <- mkDWire(False);rule countUp;counter <= counter + 1;endrulerule init(state == Initialize);state <= Request;lfsr.seed(fromInteger(i+1+valueof(NumberFifos)));endrulerule firstFifo((state == Request) && !isDeqW && (fifo.used[fromInteger(i)] > 0) && (counter % fromInteger(32*(i+1)) == 0));$display("Calling first fifo %d", i);fifo.firstReq(fromInteger(i));reqQ.enq(?);endrulerule deqFifo(True);isDeqW <= True;reqQ.deq();expectedVals[i].deq;let deqData = fifo.firstResp();fifo.deq(fromInteger(i));if(deqData != zeroExtend(expectedVals[i].first))begin$display("Dequed: [%d] %h != %h", i, expectedVals[i].first, deqData);$finish;endelsebeginreqsRxed <= reqsRxed + 1;$display("Fifo %d had %d values", i, fifo.used[fromInteger(i)]);endendruleend// Send data out to the BRAMfor(Integer i = 0; i < valueof(NumberFifos); i = i + 1)beginLFSR#(Bit#(16)) lfsr <- mkLFSR_16;Reg#(TesterState) state <- mkReg(Initialize);Reg#(Bit#(32)) counter <- mkReg(0);rule countUp;counter <= counter + 1;endrulerule init(state == Initialize);state <= Request;lfsr.seed(fromInteger(i+1+valueof(ReadPortNum)));endrulerule sendRequest((state == Request) && (counter % fromInteger(32*(i+3)) == 0) && fifo.free[fromInteger(i)] > 0);Bit#(64) timeCount <- $time;if(timeCount < 1000000)beginif (fifo.free[fromInteger(i)] > 3)beginfifo.decrFree(fromInteger(i),4);endreqsSent <= reqsSent+1;fifo.enq(fromInteger(i),zeroExtend(lfsr.value));lfsr.next();expectedVals[i].enq(zeroExtend(lfsr.value));endendrulerule haltCheck (expectedVals[i].notEmpty);Bit#(64) timeCount <- $time;if(timeCount > 11000000)begin$display("Writer[%d] stalled out", i);$finish;endendruleendendmodule/************/module mkVLevelFIFOTesterFull (Empty);VLevelFIFO#(NumberFifos,DepthFifos,Record) fifo <- mkBRAMVLevelFIFO;Vector#(NumberFifos,FIFOF#(Record)) expectedVals <- replicateM(mkSizedFIFOF(valueof(DepthFifos)));Reg#(Bit#(64)) reqsSent <- mkReg(0);Reg#(Bit#(64)) reqsRxed <- mkReg(0);rule haltAll;Bit#(64) timeCount <- $time;if(timeCount > 1010000)beginif(reqsSent == reqsRxed)begin$display("PASSED");$finish;endelsebegin$display("Expected %d values, got %d", reqsSent, reqsRxed);endendendrulefor(Integer i = 0; i < valueof(NumberFifos); i = i + 1)beginReg#(TesterState) state <- mkReg(Initialize);FIFO#(Bit#(0)) reqQ <- mkFIFO;LFSR#(Bit#(16)) lfsr <- mkLFSR_16;Reg#(Bit#(32)) counter <- mkReg(0);Reg#(Bool) okayToReq <- mkReg(True);Wire#(Bool) isDeqW <- mkDWire(False);rule countUp;counter <= counter + 1;endrulerule init(state == Initialize);state <= Request;lfsr.seed(fromInteger(i+1+valueof(NumberFifos)));endrulerule firstFifo((state == Request) && !isDeqW && (fifo.used[fromInteger(i)] > 0) && (counter % fromInteger(32*(i+1)) == 0));// rule firstFifo((state == Request) && okayToReq && (fifo.used[fromInteger(i)] > 0) && (counter % fromInteger(32*(i+1)) == 0));fifo.firstReq(fromInteger(i));// okayToReq <= False;reqQ.enq(?);endrulerule deqFifo(True);// rule deqFifo( !okayToReq && (fifo.used[fromInteger(i)] > 0));isDeqW <= True;reqQ.deq();// okayToReq <= True;expectedVals[i].deq;let deqData = fifo.firstResp();fifo.deq(fromInteger(i));if(deqData != zeroExtend(expectedVals[i].first))begin$display("Dequed: [%d] %h != %h", i, expectedVals[i].first, deqData);$finish;endelsebeginreqsRxed <= reqsRxed + 1;$display("Fifo %d had %d values", i, fifo.used[fromInteger(i)]);endendruleend// Send data out to the BRAMfor(Integer i = 0; i < valueof(NumberFifos); i = i + 1)beginLFSR#(Bit#(16)) lfsr <- mkLFSR_16;Reg#(TesterState) state <- mkReg(Initialize);Reg#(Bit#(32)) counter <- mkReg(0);Reg#(Bit#(TLog#(DepthFifos))) toSendCount <- mkReg(0);rule countUp;counter <= counter + 1;endrulerule init(state == Initialize);state <= Request;lfsr.seed(fromInteger(i+1+valueof(ReadPortNum)));endrulerule sendRequestStart((state == Request) && (toSendCount == 0) && (counter % fromInteger(32*(i+3)) == 0) && (fifo.free[fromInteger(i)] > 0));Bit#(64) timeCount <- $time;if(timeCount < 1000000)beginBit#(TLog#(DepthFifos)) extras = truncate(fromInteger(i));toSendCount <= truncate(fromInteger(i));$display("Extra send rule: %d", extras);fifo.enq(fromInteger(i),zeroExtend(lfsr.value));fifo.decrFree(fromInteger(i),1);reqsSent <= reqsSent + 1;expectedVals[i].enq(zeroExtend(lfsr.value));endendrulerule sendRequest(toSendCount > 0);$display("Extra send rule");toSendCount <= toSendCount - 1;if(toSendCount - 1 == 0)beginlfsr.next();endreqsSent <= reqsSent + 1;expectedVals[i].enq(zeroExtend(lfsr.value));fifo.enq(fromInteger(i),zeroExtend(lfsr.value));fifo.decrFree(fromInteger(i),1);endrulerule haltCheck (expectedVals[i].notEmpty);Bit#(64) timeCount <- $time;if(timeCount > 11000000)begin$display("Writer[%d] stalled out", i);$finish;endendruleendendmodule
