rlm@8: import Connectable::*; rlm@8: import GetPut::*; rlm@8: import ClientServer::*; rlm@8: rlm@8: `include "asim/provides/librl_bsv_storage.bsh" rlm@8: rlm@8: typedef SCOREBOARD_FIFO_ENTRY_ID#(t) CBUFFToken#(type t); rlm@8: rlm@8: interface CBUFF #(numeric type n, type element_type); rlm@8: interface Get#(CBUFFToken#(n)) reserve; rlm@8: interface Put#(Tuple2 #(CBUFFToken#(n), element_type)) complete; rlm@8: interface Get#(element_type) drain; rlm@8: endinterface rlm@8: rlm@8: module mkCBUFF(CBUFF#(n, element_type)) rlm@8: provisos(Bits#(element_type,a__)); rlm@8: rlm@8: SCOREBOARD_FIFOF#(n,element_type) cbuff <- mkScoreboardFIFOF(); rlm@8: rlm@8: let res = interface Get; rlm@8: method ActionValue#(CBUFFToken#(n)) get(); rlm@8: let tok <- cbuff.enq(); rlm@8: return tok; rlm@8: endmethod rlm@8: endinterface; rlm@8: rlm@8: let comp = interface Put; rlm@8: method Action put(Tuple2#(CBUFFToken#(n),element_type) t); rlm@8: cbuff.setValue(tpl_1(t), tpl_2(t)); rlm@8: endmethod rlm@8: endinterface; rlm@8: rlm@8: let dr = interface Get; rlm@8: method ActionValue#(element_type) get(); rlm@8: cbuff.deq(); rlm@8: return cbuff.first(); rlm@8: endmethod rlm@8: endinterface; rlm@8: rlm@8: interface Get reserve = res; rlm@8: interface Put complete = comp; rlm@8: interface Get drain = dr; rlm@8: rlm@8: endmodule