OpenCores
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;
// endfunction                                               



function 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;
   endmethod
   method Action write(dataT data);
      r._write(data);
   endmethod
   method ActionValue#(dataT) read();
      let data = r._read();
      return data;
   endmethod
   endinterface;
   return cr;
endfunction                                                  

function ControlReg#(addrT, dataT) mkControlRegFromGet(addrT addr,
                                                       Get#(dataT) get)
   provisos (Bits#(dataT, dataSz));
   ControlReg#(addrT, dataT) cr =
   interface ControlReg;
   method addrT getAddr();
      return addr;
   endmethod
   method Action write(dataT data);
      // no write method
   endmethod
   method ActionValue#(dataT) read();
      let data <- get.get();
      return data;
   endmethod
   endinterface;
   return cr;
endfunction                                                  

function 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;
   endmethod
   method Action write(dataT data);
      put.put(data);
   endmethod
   method ActionValue#(dataT) read();
      let data <- get.get();
      return data;
   endmethod
   endinterface;
   return cr;
endfunction                                                  

function 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;
   endmethod
   method Action write(dataT data);
      server.request.put(data);
   endmethod
   method ActionValue#(dataT) read();
      let data <- server.response.get();
      return data;
   endmethod
   endinterface;
   return cr;
endfunction                                                  

function 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;
endfunction                                                  

function 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;
endfunction                                                  

function 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;
endfunction                                                  

function 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;
endfunction                                                  

function 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())));
   endmethod
   method Action write(dataT data);
      ncr.write(unpack(truncate(pack(data))));
   endmethod
   method ActionValue#(dataT) read();
      let data <- ncr.read();
      return unpack(zeroExtend(pack(data)));
   endmethod
   endinterface;
   return cr;
endfunction                                                  


Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.