LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Mon Jun 30 18:02:14 CEST 2008
    Subject: [cvs-checkins] MODIFIED: cryptosorter ...
    Top
    Date: 00/08/06 30:18:02

    Added: cryptosorter/memocodeDesignContest2008/xup/PLBMaster
    PLBMaster.bsv PLBMasterBackup.bsv
    PLBMasterDummy.bsv PLBMasterMagic.bsv
    PLBMasterTester.bsv PLBMasterWires.bsv
    PLBMaster_backupPPC.bsv PLBModel.bsv PLBSlave.bsv
    mkPLBMaster.sched mkPLBMasterTester.sched
    plbmastertester.v
    Log:
    Initial checkin with actual source




    Revision Changes Path
    1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMaster.bsv

    http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMaster.bsv?rev=1.1&content-type=text/x-cvsweb-markup

    Index: PLBMaster.bsv
    ===================================================================
    /*
    Copyright (c) 2007 MIT

    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.

    Author: Kermin Fleming
    */

    /* This file implements a PLB bus master. The bus master operates on static
    sized bursts. It is written in such a way that read/write bursts may be
    overlapped, if the bus and target slave support such a feature. There's also
    support for pipelining of read and write requests. The master is
    parameterized by BeatsPerBurst (burst length) and BusWord (bus width),
    which allow it to be used for various applications.
    */

    // Global Imports
    import GetPut::*;
    import FIFO::*;
    import RegFile::*;
    import BRAMInitiatorWires::*;
    import RegFile::*;
    import FIFOF::*;
    import Vector::*;

    import Types::*;
    import Interfaces::*;
    import Parameters::*;
    import DebugFlags::*;

    import PLBMasterWires::*;
    import Memocode08Types::*;

    typedef enum {
    Idle,
    Data,
    WaitForBusy
    } StateTransfer
    deriving(Bits, Eq);

    typedef enum {
    Idle,
    RequestingLoad,
    RequestingStore
    } StateRequest
    deriving(Bits, Eq);

    (* synthesize *)
    module mkPLBMaster (PLBMaster);
    Clock plbClock <- exposeCurrentClock();
    Reset plbReset <- exposeCurrentReset();
    // state for the actual magic memory hardware
    FIFO#(Record) recordInfifo <- mkFIFO;
    FIFO#(Record) recordOutfifo <- mkFIFO;
    FIFO#(PLBMasterCommand) plbMasterCommandInfifo <- mkFIFO();


    // Output buffer
    RegFile#(Bit#(TAdd#(1,TLog#(BeatsPerBurst))),BusWord) storeBuffer <- mkRegFileFull();


    // Input buffer RegFile#(Bit#(TAdd#(1,TLog#(BeatsPerBurst))),BusWord) loadBuffer <- mkRegFileFull(); Reg#(Bit#(24)) rowAddrOffsetLoad <- mkReg(0); Reg#(Bit#(24)) rowAddrOffsetStore <- mkReg(0); Reg#(Bool) doingLoad <- mkReg(False); Reg#(Bool) doingStore <- mkReg(False); Bit#(TLog#(TMul#(BeatsPerBurst, WordsPerBeat))) zeroOffset = 0; // Words per Burst Reg#(Bool) requestingStore <- mkReg(False); BlockAddr addressOffset = zeroExtend({(requestingStore)?rowAddrOffsetStore:rowAddrOffsetLoad,zeroOffset}); Reg#(StateRequest) stateRequest <- mkReg(Idle); Reg#(StateTransfer) stateLoad <- mkReg(Idle); Reg#(StateTransfer) stateStore <- mkReg(Idle); Reg#(Bit#(1)) request <- mkReg(0); Reg#(Bit#(1)) rnw <- mkReg(0); Reg#(Bit#(TLog#(BeatsPerBurst))) loadDataCount <- mkReg(0); Reg#(Bit#(TLog#(BeatsPerBurst))) storeDataCount <-mkReg(0);// If you change this examine mWrDBus_o Reg#(Bit#(TAdd#(1,TLog#(BeatsPerBurst)))) loadDataCount_plus2 <- mkReg(2); Reg#(Bit#(TAdd#(1,TLog#(BeatsPerBurst)))) storeDataCount_plus2 <-mkReg(2); Reg#(Bool) doAckinIdle <- mkReg(False); Reg#(Bit#(1)) rdBurst <- mkReg(0); Reg#(Bit#(1)) wrBurst <- mkReg(0); Reg#(Bit#(1)) storeCounter <- mkReg(0); Reg#(Bit#(1)) loadCounter <- mkReg(0); Reg#(Bit#(TAdd#(1,TLog#(BeatsPerBurst)))) storeBufferWritePointer <- mkReg(0); FIFOF#(Bit#(0)) storeValid <- mkUGFIFOF;//XXX: This could be bad Reg#(Bit#(TAdd#(1,TLog#(BeatsPerBurst)))) loadBufferReadPointer <- mkReg(0); FIFOF#(Bit#(0)) loadValid <- mkUGFIFOF;//XXX: This could be bad // Input wires Wire#(Bit#(1)) mRst <- mkBypassWire(); Wire#(Bit#(1)) mAddrAck <- mkBypassWire(); Wire#(Bit#(1)) mBusy <- mkBypassWire(); Wire#(Bit#(1)) mErr <- mkBypassWire(); Wire#(Bit#(1)) mRdBTerm <- mkBypassWire(); Wire#(Bit#(1)) mRdDAck <- mkBypassWire(); Wire#(Bit#(64))mRdDBus <- mkBypassWire(); Wire#(Bit#(3)) mRdWdAddr <- mkBypassWire(); Wire#(Bit#(1)) mRearbitrate <- mkBypassWire(); Wire#(Bit#(1)) mWrBTerm <- mkBypassWire(); Wire#(Bit#(1)) mWrDAck <- mkBypassWire(); Wire#(Bit#(1)) mSSize <- mkBypassWire(); Wire#(Bit#(1)) sMErr <- mkBypassWire(); // on a read, during the data ack Wire#(Bit#(1)) sMBusy <- mkBypassWire(); // Outputs Bit#(PLBAddrSize) mABus_o = {addressOffset,2'b00}; // Our address Address Bus, we extend to compensate for word Bit#(TAdd#(1,TLog#(BeatsPerBurst))) sbuf_addr = {storeCounter,storeDataCount}; Bit#(64)mWrDBus_o = storeBuffer.sub(sbuf_addr); Bit#(1) mRequest_o = request & ~mRst; // Request Bit#(1) mBusLock_o = 1'b0 & ~mRst; // Bus lock Bit#(1) mRdBurst_o = rdBurst & ~mRst; // read burst Bit#(1) mWrBurst_o = wrBurst & ~mRst; // write burst Bit#(1) mRNW_o = rnw; // Read Not Write Bit#(1) mAbort_o = 1'b0; // Abort Bit#(2) mPriority_o = 2'b11;// priority indicator Bit#(1) mCompress_o = 1'b0;// compressed transfer Bit#(1) mGuarded_o = 1'b0;// guarded transfer Bit#(1) mOrdered_o = 1'b0;// synchronize transfer Bit#(1) mLockErr_o = 1'b0;// lock erro Bit#(4) mSize_o = 4'b1011; // Burst double word transfer - see PLB p.24 Bit#(3) mType_o = 3'b000; // Memory Transfer Bit#(8) mBE_o = 8'b00001111; // 16 word burst Bit#(2) mMSize_o = 2'b00; // precompute the next address offset. Sometimes PLBMasterCommand cmd_in_first = plbMasterCommandInfifo.first(); let newloadDataCount = loadDataCount + 1; let newstoreDataCount = storeDataCount + 1; let newloadDataCount_plus2 = loadDataCount_plus2 + 1; let newstoreDataCount_plus2 = storeDataCount_plus2 + 1; rule startPageLoad(cmd_in_first matches tagged LoadPage .ba &&& !doingLoad); $display("Start Page"); plbMasterCommandInfifo.deq(); $display("Load Page"); rowAddrOffsetLoad <= truncate(ba>>(valueof(TLog#(TMul#(BeatsPerBurst, WordsPerBeat))))); // this is the log if (ba[3:0] != 0) $display("ERROR:Address not 64-byte aligned"); doingLoad <= True; endrule rule startPageStore(cmd_in_first matches tagged StorePage .ba &&& !doingStore); $display("Start Page"); plbMasterCommandInfifo.deq(); $display("Store Page"); rowAddrOffsetStore <= truncate(ba>>(valueof(TLog#(TMul#(BeatsPerBurst, WordsPerBeat))))); // this is the log // size of burst addr if (ba[3:0] != 0) $display("ERROR:Address not 64-byte aligned"); doingStore <= True; endrule rule loadPage_Idle(doingLoad && stateRequest == Idle && stateLoad == Idle); // We should not initiate a transfer if the wordOutfifo is not valid //$display("loadPage_Idle"); requestingStore <= False; if(loadValid.notFull())// Check for a spot. begin request <= 1'b1; stateRequest <= RequestingLoad; end else begin request <= 1'b0; // Not Sure this is needed end rnw <= 1'b1; // We're reading endrule rule loadPage_Requesting(doingLoad && stateRequest == RequestingLoad && stateLoad == Idle); // We've just requested the bus and are waiting for an ack //$display("loadPage_Requesting"); if(mAddrAck == 1 ) begin stateRequest <= Idle; // Check for error conditions if(mRearbitrate == 1) begin // Got terminated by the bus $display("Terminated by BUS @ %d",$time); stateLoad <= Idle; rdBurst <= 1'b0; // if we're rearbing this should be off. It may be off anyway? request <= 1'b0; end else begin //Whew! didn't die yet.. wait for acks to come back stateLoad <= Data; // Not permissible to assert burst until after addrAck p. 35 rdBurst <= 1'b1; // Set down request, as we are not request pipelining request <= 1'b0; end end endrule rule loadPage_Data(doingLoad && stateLoad == Data); if(((mRdBTerm == 1) && (loadDataCount_plus2 < (fromInteger(valueof(BeatsPerBurst))))) || (mErr == 1)) begin // We got terminated / Errored rdBurst <= 1'b0; loadDataCount <= 0; loadDataCount_plus2 <= 2; stateLoad <= Idle; end else if(mRdDAck == 1) begin loadDataCount <= newloadDataCount; loadDataCount_plus2 <= newloadDataCount_plus2; loadBuffer.upd({loadCounter,loadDataCount}, mRdDBus); if(newloadDataCount == 0) begin loadCounter <= loadCounter + 1; // Flip the loadCounter //We're now done reading... what should we do? loadValid.enq(0); // This signifies that the data is valid Nirav could probably remove this doingLoad <= False; stateLoad <= Idle; end else if(newloadDataCount == maxBound) // YYY: ndave used to ~0 begin // Last read is upcoming. Need to set down the // rdBurst signal. rdBurst <= 1'b0; end end endrule rule storePage_Idle(doingStore && stateRequest == Idle && stateStore == Idle); requestingStore <= True; if(storeValid.notEmpty()) begin request <= 1'b1; stateRequest <= RequestingStore; end else begin request <= 1'b0; end wrBurst <= 1'b1; // Write burst is asserted with the write request rnw <= 1'b0; // We're writing endrule rule storePage_Requesting(doingStore && stateRequest == RequestingStore && stateStore == Idle); // We've just requested the bus and are waiting for an ack if(mAddrAck == 1 ) begin stateRequest <= Idle; // Check for error conditions if(mRearbitrate == 1) begin // Got terminated by the bus wrBurst <= 1'b0; request <= 1'b0; end else begin // Set down request, as we are not request pipelining request <= 1'b0; // We can be WrDAck'ed at this time p.29 or WrBTerm p.30 if(mWrBTerm == 1) begin wrBurst <= 1'b0; end else if(mWrDAck == 1) begin storeDataCount <= newstoreDataCount; storeDataCount_plus2 <= newstoreDataCount_plus2; stateStore <= Data; end else begin stateStore <= Data; end end end endrule rule storePage_Data(doingStore && stateStore == Data); if((mWrBTerm == 1) && (storeDataCount_plus2 < (fromInteger(valueof(BeatsPerBurst)))) || (mErr == 1)) begin // We got terminated / Errored wrBurst <= 1'b0; storeDataCount <= 0; storeDataCount_plus2 <= 2; stateStore <= Idle; // Can't burst for a cycle p. 30 end else if(mWrDAck == 1) begin storeDataCount <= newstoreDataCount; storeDataCount_plus2 <= newstoreDataCount_plus2; if(newstoreDataCount == 0) begin //We're now done reading... what should we do? // Data transfer complete if(mBusy == 0) begin doingStore <= False; stateStore <= Idle; storeValid.deq(); storeCounter <= storeCounter + 1; end else begin stateStore <= WaitForBusy; end end else if(newstoreDataCount == maxBound) //YYY: used to be ~0 begin // Last read is upcoming. Need to set down the // wrBurst signal. wrBurst <= 1'b0; end end endrule rule storePage_WaitForBusy(doingStore && stateStore == WaitForBusy); if(mErr == 1) begin // We got terminated / Errored wrBurst <= 1'b0; storeDataCount <= 0; // may not be necessary storeDataCount_plus2 <= 2; stateStore <= Idle; // Can't burst for a cycle p. 30 end else if(mBusy == 0) begin storeCounter <= storeCounter + 1; doingStore <= False; stateStore <= Idle; storeValid.deq(); end endrule /******** /* Code For Handling Record Translation /*******/ Reg#(Bit#(DoubleWordWidth)) recordSled <- mkReg(0); rule writeStoreData(storeValid.notFull()); storeBufferWritePointer <= storeBufferWritePointer + 1; case(storeBufferWritePointer[0]) 0: storeBuffer.upd(storeBufferWritePointer, {recordInfifo.first[31:0] ,recordInfifo.first[63:32]}); 1: storeBuffer.upd(storeBufferWritePointer, {recordInfifo.first[95:64],recordInfifo.first[127:96]}); endcase if((storeBufferWritePointer + 1)[0] == 0) begin recordInfifo.deq; end Bit#(TLog#(BeatsPerBurst)) bottomValue = 0; if(truncate(storeBufferWritePointer + 1) == bottomValue) begin $display("Store Data finished a flight"); storeValid.enq(0); end endrule rule wordToRecord(loadValid.notEmpty()); loadBufferReadPointer <= loadBufferReadPointer + 1; Bit#(64) loadValue = loadBuffer.sub(loadBufferReadPointer); Bit#(32) loadHigh = loadValue [63:32]; Bit#(32) loadLow = loadValue [31:0]; Bit#(TLog#(BeatsPerBurst)) bottomValue = 0; if(truncate(loadBufferReadPointer + 1) == bottomValue) begin $display("Load Data finished a flight"); loadValid.deq(); end if((loadBufferReadPointer + 1)[0] == 0) begin recordOutfifo.enq({{loadLow,loadHigh},recordSled}); end else begin recordSled <= {loadLow,loadHigh}; end endrule interface Put wordInput = fifoToPut(recordInfifo); interface Get wordOutput = fifoToGet(recordOutfifo); interface Put plbMasterCommandInput = fifoToPut(plbMasterCommandInfifo); interface PLBMasterWires plbMasterWires; method Bit#(PLBAddrSize) mABus(); // Address Bus return mABus_o; endmethod method Bit#(8) mBE(); // Byte Enable return mBE_o; endmethod method Bit#(1) mRNW(); // Read Not Write return mRNW_o; endmethod method Bit#(1) mAbort(); // Abort return mAbort_o; endmethod method Bit#(1) mBusLock(); // Bus lock return mBusLock_o; endmethod method Bit#(1) mCompress(); // compressed transfer return mCompress_o; endmethod method Bit#(1) mGuarded(); // guarded transfer return mGuarded_o; endmethod method Bit#(1) mLockErr(); // lock error return mLockErr_o; endmethod method Bit#(2) mMSize(); // data bus width? return mMSize_o; endmethod method Bit#(1) mOrdered(); // synchronize transfer return mOrdered_o; endmethod method Bit#(2) mPriority(); // priority indicator return mPriority_o; endmethod method Bit#(1) mRdBurst(); // read burst return mRdBurst_o; endmethod method Bit#(1) mRequest(); // bus request return mRequest_o; endmethod method Bit#(4) mSize(); // transfer size return mSize_o; endmethod method Bit#(3) mType(); // transfer type (dma) return mType_o; endmethod method Bit#(1) mWrBurst(); // write burst return mWrBurst_o; endmethod method Bit#(64) mWrDBus(); // write data bus return mWrDBus_o; endmethod method Action plbIN( Bit#(1) mRst_in, // PLB reset Bit#(1) mAddrAck_in, // Addr Ack Bit#(1) mBusy_in, // Master Busy Bit#(1) mErr_in, // Slave Error Bit#(1) mRdBTerm_in, // Read burst terminate signal Bit#(1) mRdDAck_in, // Read data ack Bit#(64)mRdDBus_in, // Read data bus Bit#(3) mRdWdAddr_in, // Read word address Bit#(1) mRearbitrate_in, // Rearbitrate Bit#(1) mWrBTerm_in, // Write burst terminate Bit#(1) mWrDAck_in, // Write data ack Bit#(1) mSSize_in, // Slave bus size Bit#(1) sMErr_in, // Slave error Bit#(1) sMBusy_in); // Slave busy mRst <= mRst_in; mAddrAck <= mAddrAck_in; mBusy <= mBusy_in; mErr <= mErr_in; mRdBTerm <= mRdBTerm_in; mRdDAck <= mRdDAck_in; mRdDBus <= mRdDBus_in; mRdWdAddr <= mRdWdAddr_in; mRearbitrate <= mRearbitrate_in; mWrBTerm <= mWrBTerm_in; mWrDAck <= mWrDAck_in; mSSize <= mSSize_in; sMErr <= sMErr_in; sMBusy <= sMBusy_in; endmethod endinterface endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterBackup.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterBackup.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMasterBackup.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ import BRAM::*; import BRAMInitiatorWires::*; import GetPut::*; import FIFO::*; import FIFOF::*; import Types::*; import Interfaces::*; import Parameters::*; import DebugFlags::*; import BRAMInitiator::*; typedef 128 DataSize; (* synthesize *) module mkPLBMasterBackup( PLBMasterBackup ); FIFO#(ComplexWord) wordOutfifo <- mkFIFO; FIFO#(ComplexWord) wordInfifo <- mkFIFO; FIFO#(PLBMasterCommand) plbMasterCommandInfifo <- mkFIFO(); let bufferSize = 129; // use extra space for a flag let minLoadPtrA = 0; let maxLoadPtrA = minLoadPtrA + bufferSize; let minLoadPtrB = maxLoadPtrA + bufferSize; let maxLoadPtrB = minLoadPtrB + bufferSize; let minStorePtrA = maxLoadPtrB + bufferSize; let maxStorePtrA = minStorePtrA + bufferSize; let minStorePtrB = maxStorePtrA + bufferSize; let maxStorePtrB = minStorePtrB + bufferSize; let ready = True; let debugF = debug(feederDebug); Reg#(Bit#(14)) readPtr <- mkReg(minLoadPtrA); Reg#(Bit#(14)) writePtr <- mkReg(minStorePtrA); Reg#(FeederState) state <- mkReg(FI_InStartCheckRead); Reg#(Bit#(32)) partialRead <- mkReg(0); Reg#(Bool) doingLoad <- mkReg(False); Reg#(Bool) doingStore <- mkReg(False); Reg#(Bool) loadBufferA <- mkReg(True); Reg#(Bool) storeBufferA <- mkReg(True); Reg#(Bit#(TLog#(DataSize))) count <- mkReg(0); Reg#(Bit#(TSub#(LogBlockElements,(TLog#(DataSize))))) rotations <- mkReg(0); BRAMInitiator#(Bit#(14)) bramInit <- mkBRAMInitiator; let bram = bramInit.bram; rule inWaitCommand(ready && state == FI_command); begin rotations <= 0; case (plbMasterCommandInfifo.first()) matches tagged RowSize .rs: begin plbMasterCommandInfifo.deq(); end tagged LoadPage .ba: begin plbMasterCommandInfifo.deq(); state <= FI_InStartCheckRead; readPtr <= 0; if(loadBufferA) begin bram.read_req(minLoadPtrA); end else begin bram.read_req(minLoadPtrB); end end tagged StorePage .ba: begin plbMasterCommandInfifo.deq(); doingStore <= True; state <= FI_OutStartCheckWrite; writePtr <= 0; if(storeBufferA) begin bram.read_req(minStorePtrA); end else begin bram.read_req(minStorePtrB); end end default: $display("Illegal command for PLB Master"); endcase end endrule rule inStartCheckRead(ready && state == FI_InStartCheckRead); debugF($display("BRAM: StartCheckRead")); let v <- bram.read_resp(); if(v != 0) begin state <= FI_InStartRead; if(loadBufferA) begin readPtr <= 2; bram.read_req(minLoadPtrA + 1); end else begin readPtr <= 2; bram.read_req(minLoadPtrB + 1); end end else begin if(loadBufferA) begin bram.read_req(minLoadPtrA); end else begin bram.read_req(minLoadPtrB); end end endrule rule inStartRead(ready && state == FI_InStartRead); let v <- bram.read_resp(); wordOutfifo.enq(unpack(v)); readPtr <= readPtr + 1; count <= count + 1; if(count+1 == 0) begin rotations <= rotations + 1; if(rotations + 1 == 0) begin state <= FI_command; loadBufferA <= True; end else begin loadBufferA <= !loadBufferA; end if(loadBufferA) begin bram.write(minLoadPtrA,0); end else begin bram.write(minLoadPtrB,0); end end else if(loadBufferA) begin bram.read_req(minLoadPtrA + readPtr); end else begin bram.read_req(minLoadPtrB + readPtr); end debugF($display("BRAM: StartRead %h", v)); endrule rule inStartCheckWrite(ready && state == FI_OutStartCheckWrite); debugF($display("BRAM: StartCheckWrite")); let v <- bram.read_resp(); if(v == 0) begin state <= FI_OutStartWrite; writePtr <= 1; end else begin if(storeBufferA) begin bram.read_req(minStorePtrA); end else begin bram.read_req(minStorePtrB); end end endrule rule inStartWrite(ready && state == FI_OutStartWrite); debugF($display("BRAM: StartWrite")); $display("BRAM: write [%d] = %h",writePtr+1, wordInfifo.first); writePtr <= writePtr + 1; count <= count + 1; if(count+1 == 0) begin rotations <= rotations + 1; if(rotations + 1 == 0) begin state <= FI_OutStartPush; end else begin storeBufferA <= !storeBufferA; end if(storeBufferA) begin bram.write(writePtr+minStorePtrA, truncate(pack(wordInfifo.first()))); end else begin bram.write(writePtr+minStorePtrB, truncate(pack(wordInfifo.first()))); end wordInfifo.deq(); end endrule rule inStartPush(ready && state == FI_OutStartPush); storeBufferA <= True; if(storeBufferA) begin bram.write(minStorePtrA, ~0); end else begin bram.write(minStorePtrB, ~0); end state <= FI_command; endrule interface Put wordInput = interface Put; method Action put(x); wordInfifo.enq(x); //$display("PLB: got val %h", x); endmethod endinterface; interface Get wordOutput = interface Get; method get(); actionvalue //$display("PLB: sending val %h", wordOutfifo.first()); wordOutfifo.deq(); return wordOutfifo.first(); endactionvalue endmethod endinterface; interface Put plbMasterCommandInput = fifoToPut(plbMasterCommandInfifo); interface plbBRAMWires = bramInit.bramInitiatorWires; endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterDummy.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterDummy.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMasterDummy.bsv =================================================================== import RegFile ::*; import Interfaces ::*; import Types ::*; import Memocode08Types ::*; import Parameters ::*; import FIFO ::*; import GetPut ::*; import Connectable ::*; import Memocode08Types ::*; `define DummyDebug False module mkPLBMasterDummy(PLBMaster); Reg#(Bit#(5)) stall <- mkReg(~0); Reg#(Bit#(2)) jitter1 <- mkReg(0); Reg#(Bit#(1)) jitter2 <- mkReg(1); BlockAddr bank_mask = (fromInteger(valueOf(MemBankSelector))>>2); RegFile#(Bit#(18), Record) mem_hi <- mkRegFileFull(); RegFile#(Bit#(18), Record) mem_lo <- mkRegFileFullLoad("unsorted.hex"); Reg#(BlockAddr) plbMasterCount <- mkReg(0); FIFO#(PLBMasterCommand) stall_fifo <- mkFIFO(); FIFO#(PLBMasterCommand) plbMasterCommand <- mkFIFO(); function Tuple2#(Bool,BlockAddr) m(PLBMasterCommand a); if (a matches tagged LoadPage .addr) return tuple2(True,addr); else return tuple2(False,?); endfunction rule toggle (True); jitter1 <= jitter1-1; jitter2 <= jitter2-1; endrule rule decr_stall (stall != 0); stall <= stall-1; endrule rule xfer (stall==0); plbMasterCommand.enq(stall_fifo.first()); stall_fifo.deq(); stall <= maxBound; endrule interface Put wordInput; method Action put(Record wordInput) if(plbMasterCommand.first matches (tagged StorePage .addr) &&& (jitter1==0)); let mem = ((addr&bank_mask)!=0) ? mem_hi : mem_lo; let idx = (addr>>2) + plbMasterCount; mem.upd(truncate(pack(idx)), wordInput); if(`DummyDebug) $display("plbMaster put %d", plbMasterCount); if(plbMasterCount + 1 == fromInteger(valueOf(RecordsPerMemRequest))) begin plbMasterCommand.deq; plbMasterCount <= 0; end else begin plbMasterCount <= plbMasterCount + 1; end if(`DummyDebug) $display("%m call put with addr %x mask %x",addr, addr&bank_mask); endmethod endinterface // using this function m is ugly, but I can't get the damn match syntax to parse // correctly inthe rule predicate... FUCK! interface Get wordOutput; method ActionValue#(Record) get() if(plbMasterCommand.first matches (tagged LoadPage .addr) &&& (jitter2==0)); let mem = ((addr&bank_mask)!=0) ? mem_hi : mem_lo; let idx = (addr>>2) + plbMasterCount; let rv = mem.sub(truncate(pack(idx))); if(`DummyDebug) $display("plbMaster get %d", plbMasterCount); if(`DummyDebug) $display("%m call get with addr %x mask %x",addr, addr&bank_mask); if(plbMasterCount + 1 == fromInteger(valueOf(RecordsPerMemRequest))) begin plbMasterCommand.deq; plbMasterCount <= 0; end else begin plbMasterCount <= plbMasterCount + 1; end return rv; endmethod endinterface interface Put plbMasterCommandInput; method Action put(PLBMasterCommand command); if(command matches tagged LoadPage .addr) begin if(`DummyDebug) $display("plbMasterCommand load %h", addr); end else if(command matches tagged StorePage .addr) begin if(`DummyDebug) $display("plbMasterCommand store %h", addr); end else $error(); stall_fifo.enq(command); endmethod endinterface interface plbMasterWires = ?; endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterMagic.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterMagic.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMasterMagic.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ // Global Imports import GetPut::*; import FIFO::*; import RegFile::*; // Project Imports `include "Common.bsv" import PLBMasterWires::*; typedef enum { Test, Sleep, Finish } TestState deriving(Bits, Eq); (* synthesize *) module mkPLBMasterMagic (PLBMaster); // state for the actual magic memory hardware FIFO#(ComplexWord) wordInfifo <- mkFIFO(); FIFO#(ComplexWord) wordOutfifo <- mkFIFO(); FIFO#(PLBMasterCommand) plbMasterCommandInfifo <- mkFIFO(); RegFile#(Bit#(20), ComplexWord) matrixA <- mkRegFileFullLoad("matrixA.hex"); RegFile#(Bit#(20), ComplexWord) matrixB <- mkRegFileFullLoad("matrixB.hex"); RegFile#(Bit#(20), ComplexWord) matrixC <- mkRegFileFull(); RegFile#(Bit#(20), ComplexWord) scratch <- mkRegFileFull(); Reg#(Bit#(LogBlockElements)) elementCounter <- mkReg(0); Reg#(Bit#(LogBlockSize)) rowCounter <- mkReg(0); // 0 -> blocksize Reg#(Bit#(LogRowSize)) rowOffset <- mkReg(0); Reg#(BlockAddr) addressOffset <- mkReg(0); // State for running the golden test loop RegFile#(Bit#(20), ComplexWord) golden <- mkRegFileFullLoad("golden.hex"); Reg#(Bit#(32)) goldenElementCounter <- mkReg(0); Reg#(Bit#(64)) totalTicks <- mkReg(0); rule tick(True); totalTicks <= totalTicks +1; endrule rule rowSize(plbMasterCommandInfifo.first() matches tagged RowSize .rs); debug(plbMasterDebug, $display("PLBMaster: processing RowSize command %d", rs)); rowOffset <= rs; plbMasterCommandInfifo.deq(); endrule rule loadPage(plbMasterCommandInfifo.first() matches tagged LoadPage .ba); elementCounter <= elementCounter + 1; if(elementCounter == 0) begin debug(plbMasterDebug, $display("PLBMaster: processing LoadPage command")); end if(elementCounter + 1 == 0) begin debug(plbMasterDebug, $display("PLBMaster: finished LoadPage command")); addressOffset <= 0; rowCounter <= 0; plbMasterCommandInfifo.deq(); end else if(rowCounter + 1 == 0) begin //When we get to the end of a row, we need to reset by //shifting the Address Offset to 1 row higher = rowCounter <= 0; addressOffset <= addressOffset + 1 - unpack(fromInteger(1*valueof(BlockSize))) + (1 << rowOffset); end else begin addressOffset <= addressOffset + 1; rowCounter <= rowCounter + 1; end BlockAddr addr = ba + addressOffset; // Now that we're done with calculating the address, // we can case out our memory space //case (addr[23:22]) // 2'b00: begin $display("PLB: reading matA[%h] => %h" ,addr[21:2], matrixA.sub(addr[21:2])); end // 2'b01: begin $display("PLB: reading matB[%h] => %h" ,addr[21:2], matrixB.sub(addr[21:2])); end // 2'b10: begin $display("PLB: reading matC[%h] => %h" ,addr[21:2], matrixC.sub(addr[21:2])); end // 2'b11: begin $display("PLB: reading scratch[%h] => %h",addr[21:2], scratch.sub(addr[21:2])); end //endcase case (addr[21:20]) 2'b00: wordOutfifo.enq(matrixA.sub(addr[19:0])); 2'b01: wordOutfifo.enq(matrixB.sub(addr[19:0])); 2'b10: wordOutfifo.enq(matrixC.sub(addr[19:0])); 2'b11: wordOutfifo.enq(scratch.sub(addr[19:0])); endcase endrule rule storePage(plbMasterCommandInfifo.first() matches tagged StorePage .ba); elementCounter <= elementCounter + 1; if(elementCounter == 0) begin debug(plbMasterDebug, $display("PLBMaster: processing StorePage command")); end if(elementCounter + 1 == 0) begin debug(plbMasterDebug, $display("PLBMaster: finished StorePage command")); addressOffset <= 0; rowCounter <= 0; plbMasterCommandInfifo.deq(); end else if(rowCounter + 1 == 0) begin addressOffset <= addressOffset + 1 - unpack(fromInteger(valueof(BlockSize))) + (1 << rowOffset); rowCounter <= 0; end else begin addressOffset <= addressOffset + 1; rowCounter <= rowCounter + 1; end BlockAddr addr = ba + addressOffset; // Now that we're done with calculating the address, // we can case out our memory space case (addr[21:20]) 2'b00: begin debug(plbMasterDebug,$display("PLB: writing to matA %h",addr[19:0])); matrixA.upd(addr[19:0],wordInfifo.first()); end 2'b01: begin debug(plbMasterDebug,$display("PLB: writing to matB %h",addr[19:0])); matrixB.upd(addr[19:0],wordInfifo.first()); end 2'b10: begin debug(plbMasterDebug,$display("PLB: writing to matC %h",addr[19:0])); matrixC.upd(addr[19:0],wordInfifo.first()); let oldval = matrixC.sub(addr[19:0]); let goldenval = golden.sub(addr[19:0]); if ((goldenval != oldval) && (goldenval == wordInfifo.first())) // a new correct val begin goldenElementCounter <= goldenElementCounter +1; if (truncate(goldenElementCounter) == 16'hFFFF) // time to announce $display("Correct Value Count: %d @ %d", goldenElementCounter+1,totalTicks); if (goldenElementCounter + 1 == (1 << (rowOffset<<1))) begin $display("PASSED @ %d", totalTicks); $finish; end end end 2'b11: begin debug(plbMasterDebug,$display("PLB: writing to scratch %h",addr[19:0])); scratch.upd(addr[19:0],wordInfifo.first()); end endcase wordInfifo.deq(); endrule rule debugRule (True); case (plbMasterCommandInfifo.first()) matches tagged LoadPage .i: noAction; tagged StorePage .i: noAction; tagged RowSize .sz: noAction; default: $display("PLBMaster: illegal command: %h", plbMasterCommandInfifo.first()); endcase endrule interface Put wordInput = interface Put; method Action put(x); wordInfifo.enq(x); //$display("PLB: got val %h", x); endmethod endinterface; interface Get wordOutput = interface Get; method get(); actionvalue //$display("PLB: sending val %h", wordOutfifo.first()); wordOutfifo.deq(); return wordOutfifo.first(); endactionvalue endmethod endinterface; interface Put plbMasterCommandInput = fifoToPut(plbMasterCommandInfifo); interface PLBMasterWires plbMasterWires = ?; endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterTester.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterTester.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMasterTester.bsv =================================================================== /* Copyright (c) 2008 MIT 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. Author: Kermin Fleming */ import PLBMasterWires::*; import BRAMInitiatorWires::*; import PLBMaster::*; import BRAMFeeder::*; import Interfaces::*; import Parameters::*; import FIFO::*; import GetPut::*; import Types::*; import Memocode08Types::*; interface PLBMasterTester; interface PLBMasterWires plbMasterWires; interface BRAMInitiatorWires#(Bit#(14)) bramInitiatorWires; endinterface typedef enum{ Idle, Running, Inputing, Outputing } TesterState deriving (Bits,Eq); module mkPLBMasterTester(PLBMasterTester); Feeder feeder <- mkBRAMFeeder(); PLBMaster plbMaster <- mkPLBMaster; Reg#(TesterState) state <- mkReg(Idle); Reg#(BlockAddr) baseRegLoad <- mkReg(0); Reg#(BlockAddr) baseRegStore <- mkReg(0); Reg#(Bit#(19)) commandCount <- mkReg(0); Reg#(Bit#(32)) commandsComplete <- mkReg(1); FIFO#(Record) dataFIFO <- mkSizedFIFO(32); Reg#(Bool) evenZero <- mkReg(True); rule grabInstruction(state == Idle); PPCMessage inst <- feeder.ppcMessageOutput.get; baseRegLoad <= truncate(pack(inst)); baseRegStore <= truncate(pack(inst)); state <= Running; endrule rule issueCommand(state == Running); commandCount <= commandCount + 1; if(commandCount + 1 == 0) begin state <= Idle; feeder.ppcMessageInput.put(pack(commandsComplete)); commandsComplete <= commandsComplete + 1; end if(commandCount[2] == 0) begin baseRegLoad <= baseRegLoad + fromInteger(valueof(TMul#(BeatsPerBurst,WordsPerBeat))); plbMaster.plbMasterCommandInput.put(tagged LoadPage (baseRegLoad)); end else begin baseRegStore <= baseRegStore + fromInteger(valueof(TMul#(BeatsPerBurst,WordsPerBeat))); plbMaster.plbMasterCommandInput.put(tagged StorePage (baseRegStore)); end endrule rule inputing; Record data <- plbMaster.wordOutput.get; dataFIFO.enq(data); endrule rule outputing; plbMaster.wordInput.put(unpack((~(pack(dataFIFO.first))) & (~1))); dataFIFO.deq; endrule interface plbMasterWires = plbMaster.plbMasterWires; interface bramInitiatorWires = feeder.bramInitiatorWires; endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterWires.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMasterWires.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMasterWires.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ // Global Imports import GetPut::*; // Project Imports import Parameters::*; `define PLB_CLK_NAME "mClk" `define PLB_RST_NAME "mRst" `define PLB_COMPRESS_NAME "mCompress" `define PLB_ABUS_NAME "mABus" `define PLB_BE_NAME "mBE" `define PLB_RNW_NAME "mRNW" `define PLB_ABORT_NAME "mAbort" `define PLB_BUSLOCK_NAME "mBusLock" `define PLB_PRESS_NAME "mpress" `define PLB_GUARDED_NAME "mGuarded" `define PLB_LOCKERR_NAME "mLockErr" `define PLB_MSIZE_NAME "mMSize" `define PLB_ORDERED_NAME "mOrdered" `define PLB_PRIORITY_NAME "mPriority" `define PLB_RDBURST_NAME "mRdBurst" `define PLB_REQUEST_NAME "mRequest" `define PLB_SIZE_NAME "mSize" `define PLB_TYPE_NAME "mType" `define PLB_WRBURST_NAME "mWrBurst" `define PLB_WRDBUS_NAME "mWrDBus" `define PLB_MADDRACK_NAME "mAddrAck" `define PLB_MBUSY_NAME "mBusy" `define PLB_MERR_NAME "mErr" `define PLB_MRDBTERM_NAME "mRdBTerm" `define PLB_MRDDACK_NAME "mRdDAck" `define PLB_MRDDBUS_NAME "mRdDBus" `define PLB_MRDWDADDR_NAME "mRdWdAddr" `define PLB_MREARBITRATE_NAME "mRearbitrate" `define PLB_MWRBTERM_NAME "mWrBTerm" `define PLB_MWRDACK_NAME "mWrDAck" `define PLB_MSSIZE_NAME "mSSize" `define PLB_SMERR_NAME "sMErr" `define PLB_SMBUSY_NAME "sMBusy" interface PLBMasterWires; (* always_ready, prefix="", result=`PLB_ABUS_NAME *) method Bit#(PLBAddrSize) mABus(); // Address Bus (* always_ready, prefix="", result=`PLB_BE_NAME *) method Bit#(8) mBE(); // Byte Enable (* always_ready, prefix="", result=`PLB_RNW_NAME *) method Bit#(1) mRNW(); // Read Not Write (* always_ready, prefix="", result=`PLB_ABORT_NAME *) method Bit#(1) mAbort(); // Abort (* always_ready, prefix="", result=`PLB_BUSLOCK_NAME *) method Bit#(1) mBusLock(); // Bus lock (* always_ready, prefix="", result=`PLB_COMPRESS_NAME *) method Bit#(1) mCompress(); // compressed transfer (* always_ready, prefix="", result=`PLB_GUARDED_NAME *) method Bit#(1) mGuarded(); // guarded transfer (* always_ready, prefix="", result=`PLB_LOCKERR_NAME *) method Bit#(1) mLockErr(); // lock error (* always_ready, prefix="", result=`PLB_MSIZE_NAME *) method Bit#(2) mMSize(); // data bus width? (* always_ready, prefix="", result=`PLB_ORDERED_NAME *) method Bit#(1) mOrdered(); // synchronize transfer (* always_ready, prefix="", result=`PLB_PRIORITY_NAME *) method Bit#(2) mPriority(); // priority indicator (* always_ready, prefix="", result=`PLB_RDBURST_NAME *) method Bit#(1) mRdBurst(); // read burst (* always_ready, prefix="", result=`PLB_REQUEST_NAME *) method Bit#(1) mRequest(); // bus request (* always_ready, prefix="", result=`PLB_SIZE_NAME *) method Bit#(4) mSize(); // transfer size (* always_ready, prefix="", result=`PLB_TYPE_NAME *) method Bit#(3) mType(); // transfer type (dma) (* always_ready, prefix="", result=`PLB_WRBURST_NAME *) method Bit#(1) mWrBurst(); // write burst (* always_ready, prefix="", result=`PLB_WRDBUS_NAME *) method Bit#(64) mWrDBus(); // write data bus (* always_ready, prefix="", always_enabled *) method Action plbIN( (* port=`PLB_RST_NAME *) Bit#(1) mRst, // PLB reset (* port=`PLB_MADDRACK_NAME *) Bit#(1) mAddrAck, // Addr Ack (* port=`PLB_MBUSY_NAME *) Bit#(1) mBusy, // Master Busy (* port=`PLB_MERR_NAME *) Bit#(1) mErr, // Slave Error (* port=`PLB_MRDBTERM_NAME *) Bit#(1) mRdBTerm, // Read burst terminate signal (* port=`PLB_MRDDACK_NAME *) Bit#(1) mRdDAck, // Read data ack (* port=`PLB_MRDDBUS_NAME *) Bit#(64)mRdDBus, // Read data bus (* port=`PLB_MRDWDADDR_NAME *) Bit#(3) mRdWdAddr, // Read word address (* port=`PLB_MREARBITRATE_NAME *) Bit#(1) mRearbitrate, // Rearbitrate (* port=`PLB_MWRBTERM_NAME *) Bit#(1) mWrBTerm, // Write burst terminate (* port=`PLB_MWRDACK_NAME *) Bit#(1) mWrDAck, // Write data ack (* port=`PLB_MSSIZE_NAME *) Bit#(1) mSSize, // Slave bus size (* port=`PLB_SMERR_NAME *) Bit#(1) sMErr, // Slave error (* port=`PLB_SMBUSY_NAME *) Bit#(1) sMBusy); // Slave busy endinterface 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMaster_backupPPC.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBMaster_backupPPC.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBMaster_backupPPC.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ // Global Imports import GetPut::*; import FIFO::*; import RegFile::*; import BRAMInitiatorWires::*; import RegFile::*; import FIFOF::*; import BRAM::*; // Project Imports import Types::*; import Interfaces::*; import Parameters::*; import DebugFlags::*; import BRAMInitiator::*; import PLBMasterWires::*; import StmtFSM::*; (* synthesize *) module mkPLB_backupPPC(BRAMInitiatorWires#(Bit#(14))); RegFile#(Bit#(20), Bit#(32)) matrixA <- mkRegFileFullLoad("matrixA.hex"); RegFile#(Bit#(20), Bit#(32)) matrixB <- mkRegFileFullLoad("matrixB.hex"); RegFile#(Bit#(20), Bit#(32)) matrixC <- mkRegFileFull(); RegFile#(Bit#(20), Bit#(32)) scratch <- mkRegFileFull(); RegFile#(Bit#(20), Bit#(32)) golden <- mkRegFileFullLoad("golden.hex"); Reg#(Bit#(32)) goldenElementCounter <- mkReg(0); RegFile#(Bit#(16), Bit#(64)) prog <- mkRegFileFullLoad("program.hex"); Reg#(Bit#(16)) prog_idx <- mkReg(0); //State BRAMInitiator#(Bit#(14)) bramInit <- mkBRAMInitiator; let bram = bramInit.bram; //BRAM#(Bit#(14), Bit#(32)) bram <- mkBRAM_Full(); FIFOF#(Bit#(32)) outQ <- mkFIFOF(); FIFO#(Bit#(32)) inQ <- mkFIFO(); FIFO#(Bit#(64)) commandQ <- mkFIFO(); Reg#(Bit#(30)) baseAddr <- mkRegU; let minWritePtr = 0; let maxWritePtr = 129*2-1; let minReadPtr = 129*2; let maxReadPtr = 129*4-1; let burstSize = 128; Reg#(Bit#(14)) readPtr <- mkReg(minReadPtr); Reg#(Bit#(14)) writePtr <- mkReg(minWritePtr); let incWritePtr = (writePtr == maxWritePtr) ? minWritePtr : (writePtr + 1); let incReadPtr = (readPtr == maxReadPtr) ? minReadPtr : (readPtr + 1); let ready = True; let debugF = debug(False); Reg#(Bit#(10)) count <- mkReg(0); Reg#(Bit#(32)) value <- mkReg(0); Reg#(Bit#(64)) totalTicks <- mkReg(0); Reg#(Bit#(32)) rowOffset <- mkReg(0); // stored in terms of words function Action readAddr(addr); case (addr[21:20]) 2'b00: return (matrixA.sub(addr[19:0])); 2'b01: return (matrixB.sub(addr[19:0])); 2'b10: return (matrixC.sub(addr[19:0])); 2'b11: return (scratch.sub(addr[19:0])); endcase endfunction function Action writeAddr(addr,val); action case (addr[21:20]) 2'b00: begin debugF($display("PLB: writing to matA %h",addr[19:0])); matrixA.upd(addr[19:0],val); end 2'b01: begin debugF($display("PLB: writing to matB %h",addr[19:0])); matrixB.upd(addr[19:0],val); end 2'b10: begin debugF($display("PLB: writing to matC %h",addr[19:0])); matrixC.upd(addr[19:0],val); let oldval = matrixC.sub(addr[19:0]); let goldenval = golden.sub(addr[19:0]); if ((goldenval != oldval) && (goldenval == val)) // a new correct val begin goldenElementCounter <= goldenElementCounter +1; if (truncate(goldenElementCounter) == 16'hFFFF) // time to announce $display("Correct Value Count: %d @ %d", goldenElementCounter+1,totalTicks); if (goldenElementCounter + 1 == (rowOffset * rowOffset)) begin $display("PASSED @ %d", totalTicks); $finish; end end end 2'b11: begin debugF($display("PLB: writing to scratch %h",addr[19:0])); scratch.upd(addr[19:0],val); end endcase endaction endfunction /////////////////////////////////////////////////////////// // In goes to MEM, Out goes back to FPGA /////////////////////////////////////////////////////////// Stmt doReadStmt = seq bram.read_req(readPtr); action let v <- bram.read_resp(); value <= v; count <= 0; endaction if (value != 0) seq while(count < burstSize) seq action readPtr <= incReadPtr; count <= count + 1; let v <- bram.read_resp(); writeAddr(baseAddr+zeroExtend(count), v); if (count <burstSize) bram.read_req(readPtr+1); // if (count == burstSize) bram.write(readPtr - burstSize, 0); // take endaction endseq endseq endseq; FSM doRead <- mkFSM(doReadStmt); Stmt doWriteStmt = seq bram.read_req(writePtr); action let v <- bram.read_resp(); value <= v; count <= 0; endaction if (value == 0) seq while(count < burstSize) seq action writePtr <= incWritePtr; count <= count + 1; if (count <burstSize) begin let val = readAddr(baseAddr+zeroExtend(count)); bram.write(writePtr+1, val); // end if (count == burstSize) bram.write(writePtr - burstSize, 32'hFFFFFFFF); // take endaction endseq endseq commandQ.deq(); endseq; FSM doWrite <- mkFSM(doWriteStmt); rule doStuff(doRead.done && doWrite.done); let inst = unpack(truncate(commandQ.first)); let mload = translateLoad(inst); let mstore = translateStore(inst); let mrow = translateRowSize(inst); commandQ.deq(); if (isJust(mload)) begin baseAddr <= unJust(mload); doRead.start(); end else if (isJust(mstore)) begin baseAddr <= unJust(mstore); doWrite.start(); end else if (isJust(mrow)) begin rowOffset <= zeroExtend(unJust(mrow)); end endrule rule tick(True); totalTicks <= totalTicks +1; endrule rule doProgRead(prog.sub(prog_idx) != 64'hAAAA_AAAA_AAAA_AAAA); let x = prog.sub(prog_idx); commandQ.enq(x); prog_idx <= prog_idx + 1; endrule return (bramInit.bramInitiatorWires); endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBModel.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBModel.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBModel.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ import Types::*; import Parameters::*; import Interfaces::*; import DebugFlags::*; import PLBMasterWires::*; import RegFile::*; module mkPLBModel#(PLBMasterWires plb) (); RegFile#(Bit#(20), Bit#(32)) matrixA <- mkRegFileFullLoad("invert.hex"); RegFile#(Bit#(20), Bit#(32)) matrixB <- mkRegFileFull(); RegFile#(Bit#(20), Bit#(32)) matrixC <- mkRegFileFull(); RegFile#(Bit#(20), Bit#(32)) scratch <- mkRegFileFull(); Reg#(Bit#(PLBAddrSize)) curAddr <- mkReg(0); Reg#(Bit#(8)) transferSize <- mkReg(0); Reg#(Bit#(32)) wrValue <- mkReg(0); Reg#(Bool) doingRead <- mkReg(False); Reg#(Bool) doingWrite <- mkReg(False); Reg#(Maybe#(Bit#(64))) readValue <- mkReg(Nothing); Reg#(Bit#(PLBAddrSize)) mABus <- mkReg(0); Reg#(Bit#(8)) mBE <- mkReg(0); Reg#(Bool) mRNW <- mkReg(False); Reg#(Bit#(1)) mAbort <- mkReg(0); Reg#(Bit#(1)) mBusLock <- mkReg(0); Reg#(Bit#(1)) mCompress <- mkReg(0); Reg#(Bit#(1)) mGuarded <- mkReg(0); Reg#(Bit#(1)) mLockErr <- mkReg(0); Reg#(Bit#(2)) mMSize <- mkReg(0); Reg#(Bit#(1)) mOrdered <- mkReg(0); Reg#(Bit#(2)) mPriority <- mkReg(0); Reg#(Bool) mRdBurst <- mkReg(False); Reg#(Bool) mRequest <- mkReg(False); Reg#(Bit#(4)) mSize <- mkReg(0); Reg#(Bit#(3)) mType <- mkReg(0); Reg#(Bool) mWrBurst <- mkReg(False); Reg#(Bit#(64)) mWrDBus <- mkReg(0); // State for running the golden test loop Reg#(Bit#(32)) goldenElementCounter <- mkReg(0); Reg#(Bit#(64)) totalTicks <- mkReg(0); rule latch(True); mABus <= plb.mABus(); // Address Bus mBE <= plb.mBE(); // Byte Enable mRNW <= plb.mRNW() == 1; // Read Not Write mAbort <= plb.mAbort(); // Abort mBusLock <= plb.mBusLock(); // Bus lock mCompress <= plb.mCompress(); // compressed transfer mGuarded <= plb.mGuarded(); // guarded transfer mLockErr <= plb.mLockErr(); // lock error mMSize <= plb.mMSize(); // data bus width? mOrdered <= plb.mOrdered(); // synchronize transfer mPriority <= plb.mPriority(); // priority mRdBurst <= plb.mRdBurst() == 1; // read burst mRequest <= plb.mRequest() == 1; // bus request mSize <= plb.mSize(); // transfer size mType <= plb.mType(); // transfer type (dma) mWrBurst <= plb.mWrBurst() == 1; // write burst mWrDBus <= plb.mWrDBus(); // write data bus endrule rule doMagic(True); Bit#(1) plb_mRst = 0; // PLB reset Bit#(1) plb_mAddrAck = 0; // Addr Ack //* Bit#(1) plb_mBusy = 0; // Master Busy Bit#(1) plb_mErr = 0; // Slave Error Bit#(1) plb_mRdBTerm = 0; // Read burst terminate signal Bit#(1) plb_mRdDAck = 0; // Read data ack Bit#(64) plb_mRdDBus = 64'hcafefeeddeadbeef; // Read data bus Bit#(3) plb_mRdWdAddr = 0; // Read word address Bit#(1) plb_mRearbitrate = 0; // Rearbitrate Bit#(1) plb_mWrBTerm = 0; // Write burst terminate Bit#(1) plb_mWrDAck = 0; // Write data ack //* Bit#(1) plb_mSSize = 0; // Slave bus size Bit#(1) plb_sMErr = 0; // Slave error Bit#(1) plb_sMBusy = 0; //Terminating Previous Request // // Technically, it's "correct" for a burst of 1/2 // We're ignoring this if(transferSize == 1 && doingRead) // penultimate read begin plb_mRdBTerm = 1; // Read burst terminate signal end if(transferSize == 1 && doingWrite) plb_mWrBTerm = 1; //Determine if there's a new request // new read if mReq + mRNW + we've at just terminated or aren't working Bool newRead = mRequest && mRNW && (!doingRead || (plb_mRdBTerm ==1)); // new write if mReq + !mRNW + we've at hust terminated or aren't working Bool newWrite = mRequest && !mRNW && (!doingWrite || (plb_mWrBTerm ==1)); /////////////////////////////////////////////////////////////////// // // Read access logic. One cycle Delay // /////////////////////////////////////////////////////////////////// //Get Request //Bool newRead = !doingRead && mRequest && mRNW && !mWrBurst; //Bool newWrite = !doingWrite && mRequest && !mRNW && mWrBurst; plb_mAddrAck = pack(newRead || newWrite); plb_mWrDAck = pack(newWrite || doingWrite); Bool error_wrBurst_dropped_early = (transferSize > 1) && doingWrite && !mWrBurst; if (error_wrBurst_dropped_early) $display("ERROR: wrBurst dropped early"); if (newRead) transferSize <= mBE + 1; else if (newWrite) transferSize <= mBE +1; else if ((doingRead || doingWrite) && (transferSize > 0)) transferSize <= transferSize - 1; if (newRead || newWrite) curAddr <= mABus; else curAddr <= curAddr + 4; if (doingWrite) begin let wAddr = newWrite ? mABus : curAddr;//(curAddr + 4); let wData = (wAddr[2] == 0) ? mWrDBus[63:32]:mWrDBus[31:0]; case (wAddr[23:22]) 2'b00: begin debug(plbMasterDebug,$display("PLB: writing to matA %h",wAddr[21:2])); debug(plbMasterDebug,$display("PLB: got %h expected %h",wData, ~matrixA.sub( wAddr[21:2]))); if(wData != ~matrixA.sub( wAddr[21:2])) begin $finish; end matrixA.upd(wAddr[21:2],wData); end 2'b01: begin debug(plbMasterDebug,$display("PLB: writing to matB %h",wAddr[21:2])); $finish; end 2'b10: begin debug(plbMasterDebug,$display("PLB: writing to matC %h %h",wAddr[21:2],goldenElementCounter)); $finish; end 2'b11: begin debug(plbMasterDebug,$display("PLB: writing to scratch %h",wAddr[21:2])); $finish; end endcase end if(doingRead) case (curAddr[23:22]) 2'b00: readValue <= Just({matrixA.sub({curAddr[21:3],1}),(matrixA.sub({curAddr[21:3],0}))}); 2'b01: readValue <= Just({matrixB.sub({curAddr[21:3],1}),(matrixB.sub({curAddr[21:3],0}))}); 2'b10: readValue <= Just({matrixC.sub({curAddr[21:3],1}),(matrixC.sub({curAddr[21:3],0}))}); 2'b11: readValue <= Just({matrixC.sub({curAddr[21:3],1}),(matrixC.sub({curAddr[21:3],0}))}); endcase else readValue <= Nothing; plb_mRdDBus = case(readValue) matches tagged Nothing: return 64'hfeedcafedeadbeef; tagged Just .x: return x; endcase; plb_mRdDAck = isJust(readValue) ? 1 : 0; if (newRead) doingRead <= True; else if (transferSize == 1) doingRead <= False; if (newWrite) doingWrite <= True; else if (transferSize == 1) doingWrite <= False; /* if(transferSize == 1 && (doingRead || newRead)) // penultimate read begin plb_mRdBTerm = 1; // Read burst terminate signal end if(transferSize == 1 && (doingWrite || newWrite)) plb_mWrBTerm = 1; */ //wrComp and rdComp don't exist? plb.plbIN( plb_mRst, plb_mAddrAck, plb_mBusy, plb_mErr, plb_mRdBTerm, plb_mRdDAck, plb_mRdDBus, plb_mRdWdAddr, plb_mRearbitrate, plb_mWrBTerm, plb_mWrDAck, plb_mSSize, plb_sMErr, plb_sMBusy ); endrule endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBSlave.bsv http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/PLBSlave.bsv?rev=1.1&content-type=text/x-cvsweb-markup Index: PLBSlave.bsv =================================================================== /* Copyright (c) 2007 MIT 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. Author: Kermin Fleming */ // Project Imports `include "Common.bsv" import PLBMasterWires::*; import RegFile::*; interface PLBSlave; interface PLBMasterWires plb; endinterface module mkPLBSlave#(PLBMastWires plb) (); RegFile#(Bit#(PLBAddrSize), Bit#(32)) rf <- mkRegFileFull(); Reg#(Bit#(PLBAddrSize)) curAddr <- mkReg(0); Reg#(Bit#(8)) transferSize <- mkReg(0); Reg#(Bit#(32)) wrValue <- mkReg(0); Reg#(Bool) doingRead <- mkReg(False); Reg#(Bool) doingWrite <- mkReg(False); Reg#(Maybe#(Bit#(32))) readValue <- mkReg(Nothing); Bit#(PLBAddrSize) mABus = plb.mABus(); // Address Bus Bit#(8) mBE = plb.mBE(); // Byte Enable Bool mRNW = plb.mRNW() == 1; // Read Not Write //Bit#(1) mAbort = plb.mAbort(); // Abort Bit#(1) mBusLock = plb.mBusLock(); // Bus lock //Bit#(1) mCompress = plb.mCompress(); // compressed transfer //Bit#(1) mGuarded = plb.mGuarded(); // guarded transfer //Bit#(1) mLockErr = plb.mLockErr(); // lock error Bit#(2) mMSize = plb.mMSize(); // data bus width? Bit#(1) mOrdered = plb.mOrdered(); // synchronize transfer //Bit#(2) mPriority = plb.mPriority(); // priority indicator Bool mRdBurst = plb.mRdBurst() == 1; // read burst Bool mRequest = plb.mRequest() == 1; // bus request Bit#(4) mSize = plb.mSize(); // transfer size //Bit#(3) mType = plb.mType(); // transfer type (dma) Bool mWrBurst = plb.mWrBurst() == 1; // write burst Bit#(32) mWrDBus = plb.mWrDBus(); // write data bus rule doMagic(True); Bit#(1) plb_mRst = 0; // PLB reset Bit#(1) plb_mAddrAck = 0; // Addr Ack //* Bit#(1) plb_mBusy = 0; // Master Busy Bit#(1) plb_mErr = 0; // Slave Error Bit#(1) plb_mRdBTerm = 0; // Read burst terminate signal Bit#(1) plb_mRdDAck = 1; // Read data ack Bit#(32) plb_mRdDBus = 32'hdeadbeef; // Read data bus Bit#(3) plb_mRdWdAddr = 0; // Read word address Bit#(1) plb_mRearbitrate = 0; // Rearbitrate Bit#(1) plb_mWrBTerm = 0; // Write burst terminate Bit#(1) plb_mWrDAck = 1; // Write data ack //* Bit#(1) plb_mSSize = 0; // Slave bus size Bit#(1) plb_sMErr = 0; // Slave error Bit#(1) plb_sMBusy = 0; //Get Request Bool newRead = mRequest && mRNW && mRdBurst && !mWrBurst; Bool newWrite = mRequest && !mRNW && !mRdBurst && mWrBurst; Bool error_Request = mRequest && !(newRead || newWrite); if (error_Request) $display("ERROR: poorly formatted request"); plb_mAddrAck = pack(newRead || newWrite); plb_mWrDAck = pack(newWrite || doingWrite); Bool error_wrBurst_dropped_early = (transferSize > 1) && doingWrite && !mWrBurst; if (error_wrBurst_dropped_early) $display("ERROR: wrBurst dropped early"); if (newRead) transferSize <= mBE + 1; else if (newWrite) transferSize <= mBE; else if (doingRead || doingWrite) transferSize <= transferSize - 1; if (newRead || newWrite) curAddr <= mABus; else curAddr <= curAddr + 1; if (newWrite) rf.upd(mABus, mWrDBus); else if (doingWrite) rf.upd(curAddr + 1, mWrDBus); if(doingRead) readValue <= Just(rf.sub(curAddr)); else readValue <= Nothing; plb_mRdDBus = case(readValue) matches tagged Nothing: return 32'hdeadbeef; tagged Just .x: return x; endcase; if (transferSize > 0) transferSize <= transferSize - 1; if (transferSize == 1) doingRead <= False; if (transferSize == 1) doingWrite <= False; if(transferSize == 2 && (doingRead || newRead)) // penultimate read begin plb_mRdBTerm = 1; // Read burst terminate signal end if(transferSize == 2 && (doingWrite || newWrite)) plb_mWrBTerm = 1; //wrComp and rdComp don't exist? plb.plbIN( plb_mRst, plb_mAddrAck, plb_mBusy, plb_mErr, plb_mRdBTerm, plb_mRdDAck, plb_mRdDBus, plb_mRdWdAddr, plb_mRearbitrate, plb_mWrBTerm, plb_mWrDAck, plb_mSSize, plb_sMErr, plb_sMBusy ); endrule endmodule 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/mkPLBMaster.sched http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/mkPLBMaster.sched?rev=1.1&content-type=text/x-cvsweb-markup Index: mkPLBMaster.sched =================================================================== === Generated schedule for mkPLBMaster === Method schedule --------------- Method: wordInput_put Ready signal: recordInfifo.i_notFull Conflict-free: wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Conflicts: wordInput_put Method: wordOutput_get Ready signal: recordOutfifo.i_notEmpty Conflict-free: wordInput_put, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Conflicts: wordOutput_get Method: plbMasterCommandInput_put Ready signal: plbMasterCommandInfifo.i_notFull Conflict-free: wordInput_put, wordOutput_get, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Conflicts: plbMasterCommandInput_put Method: plbMasterWires_mABus Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mBE Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mRNW Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mAbort Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mBusLock Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mCompress Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mGuarded Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mLockErr Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mMSize Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mOrdered Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mPriority Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mRdBurst Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus Sequenced after (restricted): plbMasterWires_plbIN Method: plbMasterWires_mRequest Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus Sequenced after (restricted): plbMasterWires_plbIN Method: plbMasterWires_mSize Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mType Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_mWrBurst Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus Sequenced after (restricted): plbMasterWires_plbIN Method: plbMasterWires_mWrDBus Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN Method: plbMasterWires_plbIN Ready signal: True Conflict-free: wordInput_put, wordOutput_get, plbMasterCommandInput_put, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrDBus Sequenced before (restricted): plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mWrBurst Conflicts: plbMasterWires_plbIN Rule schedule ------------- Rule: wordToRecord Predicate: ((loadBufferReadPointer + 5'd1)[0] || recordOutfifo.i_notFull) && loadValid.i_notEmpty Blocking rules: (none) Rule: writeStoreData Predicate: recordInfifo.i_notEmpty && storeValid.i_notFull Blocking rules: (none) Rule: storePage_WaitForBusy Predicate: doingStore && (stateStore == 2'd2) Blocking rules: (none) Rule: storePage_Data Predicate: doingStore && (stateStore == 2'd1) Blocking rules: (none) Rule: storePage_Requesting Predicate: doingStore && (stateRequest == 2'd2) && (stateStore == 2'd0) Blocking rules: (none) Rule: storePage_Idle Predicate: doingStore && (stateRequest == 2'd0) && (stateStore == 2'd0) Blocking rules: (none) Rule: loadPage_Data Predicate: doingLoad && (stateLoad == 2'd1) Blocking rules: (none) Rule: loadPage_Requesting Predicate: doingLoad && (stateRequest == 2'd1) && (stateLoad == 2'd0) Blocking rules: (none) Rule: loadPage_Idle Predicate: doingLoad && (stateRequest == 2'd0) && (stateLoad == 2'd0) Blocking rules: storePage_Idle Rule: startPageStore Predicate: plbMasterCommandInfifo.i_notEmpty && (! (plbMasterCommandInfifo.first[31:30] == 2'd0)) && (! (plbMasterCommandInfifo.first[31:30] == 2'd1)) && (! doingStore) Blocking rules: (none) Rule: startPageLoad Predicate: plbMasterCommandInfifo.i_notEmpty && (plbMasterCommandInfifo.first[31:30] == 2'd1) && (! doingLoad) Blocking rules: (none) Logical execution order: plbMasterWires_plbIN, plbMasterWires_mWrDBus, plbMasterWires_mWrBurst, plbMasterWires_mType, plbMasterWires_mSize, plbMasterWires_mRequest, plbMasterWires_mRdBurst, plbMasterWires_mPriority, plbMasterWires_mOrdered, plbMasterWires_mMSize, plbMasterWires_mLockErr, plbMasterWires_mGuarded, plbMasterWires_mCompress, plbMasterWires_mBusLock, plbMasterWires_mAbort, plbMasterWires_mRNW, plbMasterWires_mABus, plbMasterWires_mBE, plbMasterCommandInput_put, wordOutput_get, wordInput_put, wordToRecord, writeStoreData, storePage_WaitForBusy, storePage_Data, storePage_Requesting, storePage_Idle, loadPage_Data, loadPage_Requesting, loadPage_Idle, startPageStore, startPageLoad =========================================== 1.1 cryptosorter/memocodeDesignContest2008/xup/PLBMaster/mkPLBMasterTester.sched http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/xup/PLBMaster/mkPLBMasterTester.sched?rev=1.1&content-type=text/x-cvsweb-markup Index: mkPLBMasterTester.sched =================================================================== === Generated schedule for mkPLBMasterTester === Method schedule --------------- Method: plbMasterWires_mABus Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mBE Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mRNW Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mAbort Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mBusLock Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mCompress Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mGuarded Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mLockErr Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mMSize Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mOrdered Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mPriority Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded, plbMasterWires_mLockErr, plbMasterWires_mMSize, plbMasterWires_mOrdered, plbMasterWires_mPriority, plbMasterWires_mRdBurst, plbMasterWires_mRequest, plbMasterWires_mSize, plbMasterWires_mType, plbMasterWires_mWrBurst, plbMasterWires_mWrDBus, plbMasterWires_plbIN, bramInitiatorWires_bramCLK, bramInitiatorWires_bramRST, bramInitiatorWires_bramAddr, bramInitiatorWires_bramDout, bramInitiatorWires_bramDin, bramInitiatorWires_bramWEN, bramInitiatorWires_bramEN Method: plbMasterWires_mRdBurst Ready signal: True Conflict-free: plbMasterWires_mABus, plbMasterWires_mBE, plbMasterWires_mRNW, plbMasterWires_mAbort, plbMasterWires_mBusLock, plbMasterWires_mCompress, plbMasterWires_mGuarded,