URL
https://opencores.org/ocsvn/bluespec_md6/bluespec_md6/trunk
Subversion Repositories bluespec_md6
[/] [bluespec_md6/] [trunk/] [lib/] [bsv/] [Register/] [src/] [ControlReg.bsv] - Rev 7
Compare with Previous | Blame | View Log
import Vector::*;import ActionSeq::*;import FIFOF::*;import FIFO::*;import GetPut::*;import ClientServer::*;import Register::*;interface ControlReg#(type addr_t, type data_t);method addr_t getAddr();method Action write(data_t x1);method ActionValue#(data_t) read();endinterface// function makeControlRegFromRAM(TBDRegisterMap regNum, HSTDEC_OCP_RAM_module_addr_t inc,// FIFO#(HSTDEC_OCP_RAM_module_addr_t));// begin// ControlReg#(HSTDEC_OCP_RAM_addr_t, HSTDEC_OCP_RAM_data_t) cr =// interface ControlReg// method HSTDEC_OCP_RAM_addr_t getAddr();// return zeroExtend(pack(regNum));// endmethod// method Action write(HSTDEC_OCP_RAM_data_t data);// begin// tbdRegs.hstRamAddr <= tbdRegs.hstRamAddr + inc;// (determineMemory(curTBD,tbdRegs)).writeReq.put(tuple2(truncate(tbdRegs.hstRamAddr),data));// end// endmethod// method ActionValue#(HSTDEC_OCP_RAM_data_t) read();// begin// let mem = (determineMemory(curTBD,tbdRegs));// debugModule(hstdecDebug, $display("HSTDEC Pushing read request"));// mem.readReq.put(truncate(tbdRegs.hstRamAddr));// state <= Read;// read_inc_fifo.enq(inc);// return ?;// end// endmethod// endinterface;// return cr;// end// rule complete_read;// let inc = read_inc_fifo.first; read_inc_fifo.deq;// let mem = (determineMemory(curTBD,tbdRegs));// tbdRegs.hstRamAddr <= tbdRegs.hstRamAddr + signExtend(inc);// let data <- mem.readResp().get();// resp_fifo.enq(data);// endrule// endfunction// function ControlReg#(addrT, dataT) mkControlReg(addrT addr,// function regDataT get(),// function Action put(regDataT))// provisos (Bits#(regDataT, regDataSz),// Bits#(dataT, dataSz),// Add#(regDataSz,aaa,dataSz));// ControlReg#(addrT, dataT) cr =// interface ControlReg;// method addrT getAddr();// return addr;// endmethod// method Action write(dataT data);// let foo <- put(unpack(truncate(pack(data))));// endmethod// method ActionValue#(dataT) read();// let data <- get();// return unpack(zeroExtend(pack(data)));// endmethod// endinterface;// return cr;// endfunctionfunction ControlReg#(addrT, dataT) mkControlRegFromReg(addrT addr,Reg#(dataT) r)provisos (//Bits#(regDataT, regDataSz),Bits#(dataT, dataSz)//Add#(regDataSz,aaa,dataSz));ControlReg#(addrT, dataT) cr =interface ControlReg;method addrT getAddr();return addr;endmethodmethod Action write(dataT data);r._write(data);endmethodmethod ActionValue#(dataT) read();let data = r._read();return data;endmethodendinterface;return cr;endfunctionfunction ControlReg#(addrT, dataT) mkControlRegFromGet(addrT addr,Get#(dataT) get)provisos (Bits#(dataT, dataSz));ControlReg#(addrT, dataT) cr =interface ControlReg;method addrT getAddr();return addr;endmethodmethod Action write(dataT data);// no write methodendmethodmethod ActionValue#(dataT) read();let data <- get.get();return data;endmethodendinterface;return cr;endfunctionfunction ControlReg#(addrT, dataT) mkControlRegFromGetPut(addrT addr,Get#(dataT) get,Put#(dataT) put)provisos (Bits#(dataT, dataSz));ControlReg#(addrT, dataT) cr =interface ControlReg;method addrT getAddr();return addr;endmethodmethod Action write(dataT data);put.put(data);endmethodmethod ActionValue#(dataT) read();let data <- get.get();return data;endmethodendinterface;return cr;endfunctionfunction ControlReg#(addrT, dataT) mkControlRegFromServer(addrT addr,Server#(dataT, dataT) server)provisos (Bits#(dataT, dataSz));ControlReg#(addrT, dataT) cr =interface ControlReg;method addrT getAddr();return addr;endmethodmethod Action write(dataT data);server.request.put(data);endmethodmethod ActionValue#(dataT) read();let data <- server.response.get();return data;endmethodendinterface;return cr;endfunctionfunction Vector#(n, ControlReg#(addrT, dataT))addControlReg(Vector#(n, ControlReg#(addrT, dataT)) crvec,regNumT regNum,ControlReg#(addrT, dataT) cr)provisos (Bits#(regNumT, regNumSz),Bits#(addrT, addrSz),Bits#(dataT, ramDataSz),Add#(regNumSz,aaa,addrSz));crvec[zeroExtend(pack(regNum))] = cr;return crvec;endfunctionfunction Vector#(n, ControlReg#(addrT, dataT))addControlRegFromReg(Vector#(n, ControlReg#(addrT, dataT)) crvec,regNumT regNum,Reg#(dataT) r)provisos (Bits#(regNumT, regNumSz),Bits#(addrT, addrSz),Bits#(dataT, ramDataSz),Add#(regNumSz,aaa,addrSz));ControlReg#(addrT, dataT) cr =mkControlRegFromReg(unpack(zeroExtend(pack(regNum))), r);crvec[zeroExtend(pack(regNum))] = cr;return crvec;endfunctionfunction Vector#(n, ControlReg#(addrT, dataT))addControlRegFromGet(Vector#(n, ControlReg#(addrT, dataT)) crvec,regNumT regNum,Get#(dataT) g)provisos (Bits#(dataT, ramDataSz),Bits#(regNumT, regNumSz),Bits#(addrT, addrSz),Add#(regNumSz,aaa,addrSz));ControlReg#(addrT, dataT) cr =mkControlRegFromGet(unpack(zeroExtend(pack(regNum))), g);crvec[zeroExtend(pack(regNum))] = cr;return crvec;endfunctionfunction Vector#(n, ControlReg#(addrT, dataT))addControlRegFromGetPut(Vector#(n, ControlReg#(addrT, dataT)) crvec,regNumT regNum,Get#(dataT) g,Put#(dataT) p)provisos (Bits#(dataT, ramDataSz),Bits#(regNumT, regNumSz),Bits#(addrT, addrSz),Add#(regNumSz,aaa,addrSz));ControlReg#(addrT, dataT) cr =mkControlRegFromGetPut(unpack(zeroExtend(pack(regNum))), g, p);crvec[pack(regNum)] = cr;return crvec;endfunctionfunction ControlReg#(addrT, dataT) widenControlReg(ControlReg#(nAddrT, nDataT) ncr)provisos (Bits#(addrT, addrSz),Bits#(dataT, dataSz),Bits#(nAddrT, nAddrSz),Bits#(nDataT, nDataSz),Add#(nDataSz,ddd,dataSz),Add#(nAddrSz,aaa,addrSz));ControlReg#(addrT, dataT) cr =interface ControlReg;method addrT getAddr();return unpack(zeroExtend(pack(ncr.getAddr())));endmethodmethod Action write(dataT data);ncr.write(unpack(truncate(pack(data))));endmethodmethod ActionValue#(dataT) read();let data <- ncr.read();return unpack(zeroExtend(pack(data)));endmethodendinterface;return cr;endfunction
