示例#1
0
    def __init__(s, nports, src_msgs, sink_msgs, stall_prob, latency,
                 src_delay, sink_delay):

        # Messge type

        mem_msgs = MemMsg(32, 32)

        # Instantiate models

        s.srcs = []
        for i in range(nports):
            s.srcs.append(TestSource(mem_msgs.req, src_msgs[i], src_delay))

        s.mem = TestMemory(mem_msgs, nports, stall_prob, latency)

        s.sinks = []
        for i in range(nports):
            s.sinks.append(TestSink(mem_msgs.resp, sink_msgs[i], sink_delay))

        # Connect

        for i in range(nports):
            s.connect(s.srcs[i].out, s.mem.reqs[i])
            s.connect(s.sinks[i].in_, s.mem.resps[i])
示例#2
0
  def __init__( s ):

    # interface
    
    s.in_control   = InValRdyBundle     (inst_msg() ) # control word
    s.in_neighbor  = InValRdyBundle[2]  (nWid)

    s.out_fsm      = OutValRdyBundle    (1)    # response to FSM
    s.out_neighbor = OutValRdyBundle[2] (nWid)

    s.ocmreqs      = OutValRdyBundle    (MemMsg(8,32,nWid))
    s.ocmresps     = InValRdyBundle     (MempMsg(8,  nWid))


    # PE local register file

    s.rf = RegisterFile( nWid, nReg, 2, 1 )

    # temporary variables

    s.src0_tmp = Wire( nWid )
    s.src1_tmp = Wire( nWid )
    s.des_tmp  = Wire( nWid )
    s.go       = Wire( 1 )
示例#3
0
    def __init__(s, mem_ifc_types=MemMsg(32, 32)):

        # Interface

        s.xcelreq = InValRdyBundle(XcelReqMsg())
        s.xcelresp = OutValRdyBundle(XcelRespMsg())

        #s.memreq    = InValRdyBundle  ( mem_ifc_types.req  )
        #s.memresp   = OutValRdyBundle ( mem_ifc_types.resp )

        # Adapters

        s.xcelreq_q = InValRdyQueueAdapter(s.xcelreq)
        s.xcelresp_q = OutValRdyQueueAdapter(s.xcelresp)

        # Accelerator registers

        s.xregs = [Bits(32, 0) for _ in xrange(32)]

        # Concurrent block

        @s.tick_fl
        def block():

            # We loop forever handling accelerator requests.

            while True:

                xcelreq_msg = s.xcelreq_q.popleft()

                if xcelreq_msg.type_ == XcelReqMsg.TYPE_READ:
                    data = s.xregs[xcelreq_msg.raddr]
                    s.xcelresp_q.append(XcelRespMsg().mk_rd(data))
                else:
                    s.xregs[xcelreq_msg.raddr] = xcelreq_msg.data
                    s.xcelresp_q.append(XcelRespMsg().mk_wr())
示例#4
0
def mreq(a):
    return MemMsg(32, 32).req.mk_msg(0, a, 0, 0)
示例#5
0
  def __init__( s, reset_vector=0, test_en=True ):

    s.reset_vector = reset_vector
    s.test_en      = test_en

    # Proc/Mngr Interface

    s.mngr2proc  = InValRdyBundle( 32 )
    s.proc2mngr  = OutValRdyBundle( 32 )

    # Instruction Memory Request/Response Interface

    s.imemreq    = OutValRdyBundle ( MemReqMsg(32,32) )
    s.imemresp   = InValRdyBundle  ( MemRespMsg(32)   )

    # Data Memory Request/Response Interface

    s.dmemreq    = OutValRdyBundle ( MemReqMsg(32,32) )
    s.dmemresp   = InValRdyBundle  ( MemRespMsg(32)   )

    # Accelerator Interface

    s.xcelreq    = OutValRdyBundle( XcelReqMsg() )
    s.xcelresp   = InValRdyBundle( XcelRespMsg() )

    # Extra Interface

    s.go        = InPort   ( 1  )
    s.status    = OutPort  ( 32 )
    s.stats_en  = OutPort  ( 1  )
    s.num_insts = OutPort  ( 32 )

    # Queue Adapters

    s.mngr2proc_q     = InValRdyQueueAdapter  ( s.mngr2proc )
    s.proc2mngr_q     = OutValRdyQueueAdapter ( s.proc2mngr )

    s.imemreq_q       = OutValRdyQueueAdapter ( s.imemreq   )
    s.imemresp_q      = InValRdyQueueAdapter  ( s.imemresp  )

    s.dmemreq_q       = OutValRdyQueueAdapter ( s.dmemreq   )
    s.dmemresp_q      = InValRdyQueueAdapter  ( s.dmemresp  )

    s.xcelreq_q       = OutValRdyQueueAdapter ( s.xcelreq   )
    s.xcelresp_q      = InValRdyQueueAdapter  ( s.xcelresp  )

    # Helpers to make memory read/write requests

    mem_ifc_types = MemMsg(32,32)
    s.mk_rd = mem_ifc_types.req.mk_rd
    s.mk_wr = mem_ifc_types.req.mk_wr

    # Pipeline queues

    s.pc_queue_FX     = Queue(4)
    s.inst_queue_XW   = Queue(4)
    s.wb_queue_XW     = Queue(4)

    s.R = ParcProcCL.RegisterFile()

    s.stall_X = False
    s.stall_W = False

    s.stall_type_X = " "
    s.stall_type_W = " "

    s.WB_NONE  = 0
    s.WB_REGWR = 1

    s.ifetch_wait = 0

    # Reset

    s.reset_proc()
示例#6
0
    def __init__(s):

        # Parameters

        num_reqers = 4  # 4 processors
        num_reqees = 4  # 4 data caches
        num_ports = max(num_reqers, num_reqees)  # We still have 4 ports

        nopaque_nbits = 8
        mopaque_nbits = 8
        addr_nbits = 32
        data_nbits = 32  # CacheNet only deals with 32 bit requests

        # Interface

        s.procifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)
        s.cacheifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)

        s.procreq = InValRdyBundle[num_ports](s.procifc.req)
        s.procresp = OutValRdyBundle[num_ports](s.procifc.resp)

        s.cachereq = OutValRdyBundle[num_ports](s.cacheifc.req)
        s.cacheresp = InValRdyBundle[num_ports](s.cacheifc.resp)

        # Connection

        s.inner = CacheNetVRTL_inner()

        procreq_nbits = s.procifc.req.nbits
        procresp_nbits = s.procifc.resp.nbits
        cachereq_nbits = s.cacheifc.req.nbits
        cacheresp_nbits = s.cacheifc.resp.nbits

        for i in xrange(num_ports):
            s.connect_pairs(
                s.procreq[i].val,
                s.inner.procreq_val[i],
                s.procreq[i].rdy,
                s.inner.procreq_rdy[i],
                s.procreq[i].msg,
                s.inner.procreq_msg[i * procreq_nbits:(i + 1) * procreq_nbits],
                s.procresp[i].val,
                s.inner.procresp_val[i],
                s.procresp[i].rdy,
                s.inner.procresp_rdy[i],
                s.procresp[i].msg,
                s.inner.procresp_msg[i * procresp_nbits:(i + 1) *
                                     procresp_nbits],
                s.cachereq[i].val,
                s.inner.cachereq_val[i],
                s.cachereq[i].rdy,
                s.inner.cachereq_rdy[i],
                s.cachereq[i].msg,
                s.inner.cachereq_msg[i * cachereq_nbits:(i + 1) *
                                     cachereq_nbits],
                s.cacheresp[i].val,
                s.inner.cacheresp_val[i],
                s.cacheresp[i].rdy,
                s.inner.cacheresp_rdy[i],
                s.cacheresp[i].msg,
                s.inner.cacheresp_msg[i * cacheresp_nbits:(i + 1) *
                                      cacheresp_nbits],
            )
    def __init__(s):

        # Parameters

        num_cores = 1
        opaque_nbits = 8
        addr_nbits = 32
        icache_nbytes = 256
        dcache_nbytes = 256
        data_nbits = 32
        cacheline_nbits = 128

        #---------------------------------------------------------------------
        # Interface
        #---------------------------------------------------------------------

        s.memifc = MemMsg(opaque_nbits, addr_nbits, cacheline_nbits)

        s.mngr2proc = InValRdyBundle(32)
        s.proc2mngr = OutValRdyBundle(32)

        s.imemreq = OutValRdyBundle(s.memifc.req)
        s.imemresp = InValRdyBundle(s.memifc.resp)

        s.dmemreq = OutValRdyBundle(s.memifc.req)
        s.dmemresp = InValRdyBundle(s.memifc.resp)

        # These ports are for statistics. Basically we want to provide the
        # simulator with some useful signals to let the simulator calculate
        # cache miss rate.

        s.stats_en = OutPort(1)
        s.commit_inst = OutPort(1)

        s.icache_miss = OutPort(1)
        s.icache_access = OutPort(1)
        s.dcache_miss = OutPort(1)
        s.dcache_access = OutPort(1)

        #---------------------------------------------------------------------
        # Verilog import
        #---------------------------------------------------------------------

        s.set_params({'dummy': 0})

        # connect to Verilog module

        s.set_ports({
            'clk': s.clk,
            'reset': s.reset,
            'mngr2proc_msg': s.mngr2proc.msg,
            'mngr2proc_val': s.mngr2proc.val,
            'mngr2proc_rdy': s.mngr2proc.rdy,
            'proc2mngr_msg': s.proc2mngr.msg,
            'proc2mngr_val': s.proc2mngr.val,
            'proc2mngr_rdy': s.proc2mngr.rdy,
            'imemreq_msg': s.imemreq.msg,
            'imemreq_val': s.imemreq.val,
            'imemreq_rdy': s.imemreq.rdy,
            'imemresp_msg': s.imemresp.msg,
            'imemresp_val': s.imemresp.val,
            'imemresp_rdy': s.imemresp.rdy,
            'dmemreq_msg': s.dmemreq.msg,
            'dmemreq_val': s.dmemreq.val,
            'dmemreq_rdy': s.dmemreq.rdy,
            'dmemresp_msg': s.dmemresp.msg,
            'dmemresp_val': s.dmemresp.val,
            'dmemresp_rdy': s.dmemresp.rdy,
            'stats_en': s.stats_en,
            'commit_inst': s.commit_inst,
            'icache_miss': s.icache_miss,
            'icache_access': s.icache_access,
            'dcache_miss': s.dcache_miss,
            'dcache_access': s.dcache_access,
        })
示例#8
0
    def __init__(s,
                 mem_ifc_dtypes=MemMsg(32, 32),
                 nports=1,
                 stall_prob=0,
                 latency=0,
                 mem_nbytes=2**20):

        # Interface

        xr = range
        s.reqs = [InValRdyBundle(mem_ifc_dtypes.req) for _ in xr(nports)]
        s.resps = [OutValRdyBundle(mem_ifc_dtypes.resp) for _ in xr(nports)]

        # Checks

        assert mem_ifc_dtypes.req.data.nbits % 8 == 0
        assert mem_ifc_dtypes.resp.data.nbits % 8 == 0

        # Buffers to hold memory request/response messages

        s.reqs_q = []
        for req in s.reqs:
            s.reqs_q.append(InValRdyRandStallAdapter(req, stall_prob))

        s.resps_q = []
        for resp in s.resps:
            s.resps_q.append(OutValRdyInelasticPipeAdapter(resp, latency))

        # Actual memory

        s.mem = bytearray(mem_nbytes)

        # Local constants

        s.mem_ifc_dtypes = mem_ifc_dtypes
        s.nports = nports

        #---------------------------------------------------------------------
        # Tick
        #---------------------------------------------------------------------

        @s.tick_cl
        def tick():

            # Tick adapters

            for req_q, resp_q in zip(s.reqs_q, s.resps_q):
                req_q.xtick()
                resp_q.xtick()

            # Iterate over input/output queues

            for req_q, resp_q in zip(s.reqs_q, s.resps_q):

                if not req_q.empty() and not resp_q.full():

                    # Dequeue memory request message

                    memreq = req_q.deq()

                    # When len is zero, then we use all of the data

                    nbytes = memreq.len
                    if memreq.len == 0:
                        nbytes = s.mem_ifc_dtypes.req.data.nbits / 8

                    # Handle a read request

                    if memreq.type_ == MemReqMsg.TYPE_READ:

                        # Copy the bytes from the bytearray into read data bits

                        read_data = Bits(s.mem_ifc_dtypes.req.data.nbits)
                        for j in range(nbytes):
                            read_data[j * 8:j * 8 + 8] = s.mem[memreq.addr + j]

                        # Create and enqueu response message

                        memresp = s.mem_ifc_dtypes.resp()
                        memresp.type_ = MemRespMsg.TYPE_READ
                        memresp.len = memreq.len
                        memresp.data = read_data

                        resp_q.enq(memresp)

                    # Handle a write request

                    elif memreq.type_ == MemReqMsg.TYPE_WRITE:

                        # Copy write data bits into bytearray

                        write_data = memreq.data
                        for j in range(nbytes):
                            s.mem[memreq.addr + j] = write_data[j * 8:j * 8 +
                                                                8].uint()

                        # Create and enqueu response message

                        memresp = s.mem_ifc_dtypes.resp()
                        memresp.type_ = MemRespMsg.TYPE_WRITE
                        memresp.len = 0
                        memresp.data = 0

                        resp_q.enq(memresp)
示例#9
0
    def __init__(s):

        # Parameters

        num_cores = 4
        mopaque_nbits = 8
        addr_nbits = 32
        cacheline_nbits = 128

        # Interface

        s.memifc = MemMsg(mopaque_nbits, addr_nbits, cacheline_nbits)

        s.mngr2proc = InValRdyBundle[num_cores](32)
        s.proc2mngr = OutValRdyBundle[num_cores](32)

        s.imemreq = OutValRdyBundle(s.memifc.req)
        s.imemresp = InValRdyBundle(s.memifc.resp)

        s.dmemreq = OutValRdyBundle(s.memifc.req)
        s.dmemresp = InValRdyBundle(s.memifc.resp)

        # These ports are for statistics. Basically we want to provide the
        # simulator with some useful signals to let the simulator calculate
        # cache miss rate.

        s.stats_en = OutPort(1)
        s.commit_inst = OutPort(num_cores)

        s.icache_miss = OutPort(num_cores)
        s.icache_access = OutPort(num_cores)
        s.dcache_miss = OutPort(num_cores)
        s.dcache_access = OutPort(num_cores)

        # Connection

        s.inner = MultiCoreVRTL_inner()

        memreq_nbits = s.memifc.req.nbits
        memresp_nbits = s.memifc.resp.nbits

        for i in xrange(num_cores):
            s.connect_pairs(
                s.mngr2proc[i].val,
                s.inner.mngr2proc_val[i],
                s.mngr2proc[i].rdy,
                s.inner.mngr2proc_rdy[i],
                s.mngr2proc[i].msg,
                s.inner.mngr2proc_msg[i * 32:(i + 1) * 32],
                s.proc2mngr[i].val,
                s.inner.proc2mngr_val[i],
                s.proc2mngr[i].rdy,
                s.inner.proc2mngr_rdy[i],
                s.proc2mngr[i].msg,
                s.inner.proc2mngr_msg[i * 32:(i + 1) * 32],
                s.imemreq,
                s.inner.imemreq,
                s.imemresp,
                s.inner.imemresp,
                s.dmemreq,
                s.inner.dmemreq,
                s.dmemresp,
                s.inner.dmemresp,
                s.stats_en,
                s.inner.stats_en,
                s.commit_inst,
                s.inner.commit_inst,
                s.icache_miss,
                s.inner.icache_miss,
                s.icache_access,
                s.inner.icache_access,
                s.dcache_miss,
                s.inner.dcache_miss,
                s.dcache_access,
                s.inner.dcache_access,
            )
示例#10
0
    def __init__(s):

        # Parameters

        num_cores = 4
        mopaque_nbits = 8
        addr_nbits = 32
        cacheline_nbits = 128

        # Interface

        s.memifc = MemMsg(mopaque_nbits, addr_nbits, cacheline_nbits)

        s.mngr2proc_val = InPort(num_cores)
        s.mngr2proc_rdy = OutPort(num_cores)
        s.mngr2proc_msg = InPort(32 * num_cores)

        s.proc2mngr_val = OutPort(num_cores)
        s.proc2mngr_rdy = InPort(num_cores)
        s.proc2mngr_msg = OutPort(32 * num_cores)

        s.imemreq = OutValRdyBundle(s.memifc.req)
        s.imemresp = InValRdyBundle(s.memifc.resp)

        s.dmemreq = OutValRdyBundle(s.memifc.req)
        s.dmemresp = InValRdyBundle(s.memifc.resp)

        s.stats_en = OutPort(1)
        s.commit_inst = OutPort(num_cores)
        s.icache_miss = OutPort(num_cores)
        s.icache_access = OutPort(num_cores)
        s.dcache_miss = OutPort(num_cores)
        s.dcache_access = OutPort(num_cores)

        # connect to Verilog module

        s.set_ports({
            'clk': s.clk,
            'reset': s.reset,
            'mngr2proc_val': s.mngr2proc_val,
            'mngr2proc_rdy': s.mngr2proc_rdy,
            'mngr2proc_msg': s.mngr2proc_msg,
            'proc2mngr_val': s.proc2mngr_val,
            'proc2mngr_rdy': s.proc2mngr_rdy,
            'proc2mngr_msg': s.proc2mngr_msg,
            'imemreq_val': s.imemreq.val,
            'imemreq_rdy': s.imemreq.rdy,
            'imemreq_msg': s.imemreq.msg,
            'imemresp_val': s.imemresp.val,
            'imemresp_rdy': s.imemresp.rdy,
            'imemresp_msg': s.imemresp.msg,
            'dmemreq_val': s.dmemreq.val,
            'dmemreq_rdy': s.dmemreq.rdy,
            'dmemreq_msg': s.dmemreq.msg,
            'dmemresp_val': s.dmemresp.val,
            'dmemresp_rdy': s.dmemresp.rdy,
            'dmemresp_msg': s.dmemresp.msg,
            'stats_en': s.stats_en,
            'commit_inst': s.commit_inst,
            'icache_miss': s.icache_miss,
            'icache_access': s.icache_access,
            'dcache_miss': s.dcache_miss,
            'dcache_access': s.dcache_access,
        })
  def __init__( s ):

    # Parameters

    num_cores       = 1
    opaque_nbits    = 8
    addr_nbits      = 32
    icache_nbytes   = 256
    dcache_nbytes   = 256
    data_nbits      = 32
    cacheline_nbits = 128

    #---------------------------------------------------------------------
    # Interface
    #---------------------------------------------------------------------

    s.memifc = MemMsg( opaque_nbits, addr_nbits, cacheline_nbits )

    s.mngr2proc = InValRdyBundle ( 32 )
    s.proc2mngr = OutValRdyBundle( 32 )

    s.imemreq  = OutValRdyBundle( s.memifc.req )
    s.imemresp = InValRdyBundle ( s.memifc.resp )

    s.dmemreq  = OutValRdyBundle( s.memifc.req )
    s.dmemresp = InValRdyBundle ( s.memifc.resp )

    # These ports are for statistics. Basically we want to provide the
    # simulator with some useful signals to let the simulator calculate
    # cache miss rate.

    s.stats_en      = OutPort( 1 )
    s.commit_inst   = OutPort( 1 )

    s.icache_miss   = OutPort( 1 )
    s.icache_access = OutPort( 1 )
    s.dcache_miss   = OutPort( 1 )
    s.dcache_access = OutPort( 1 )

    #---------------------------------------------------------------------
    # Components
    #---------------------------------------------------------------------

    s.proc   = ProcAltRTL( num_cores )
    s.icache = BlockingCacheAltRTL( 0 )
    s.dcache = BlockingCacheAltRTL( 0 )

    #---------------------------------------------------------------------
    # Connections
    #---------------------------------------------------------------------

    # core id & mngr

    s.connect( s.proc.core_id, 0 )

    s.connect( s.mngr2proc, s.proc.mngr2proc   )
    s.connect( s.proc2mngr, s.proc.proc2mngr   )

    # instruction

    s.connect( s.proc.imemreq,   s.icache.cachereq  )
    s.connect( s.icache.memreq,  s.imemreq  )

    s.connect( s.proc.imemresp,  s.icache.cacheresp )
    s.connect( s.icache.memresp, s.imemresp )

    # data

    s.connect( s.proc.dmemreq,   s.dcache.cachereq  )
    s.connect( s.dcache.memreq,  s.dmemreq  )

    s.connect( s.proc.dmemresp,  s.dcache.cacheresp )
    s.connect( s.dcache.memresp, s.dmemresp )

    # statistics

    s.connect( s.stats_en,    s.proc.stats_en    )
    s.connect( s.commit_inst, s.proc.commit_inst )

    @s.combinational
    def collect_cache_statistics():
      s.icache_miss.value   = s.icache.cacheresp.rdy & s.icache.cacheresp.val & \
                            (~s.icache.cacheresp.msg.test[0])

      s.icache_access.value = s.icache.cachereq.rdy & s.icache.cachereq.val

      s.dcache_miss.value   = s.dcache.cacheresp.rdy & s.dcache.cacheresp.val & \
                            (~s.dcache.cacheresp.msg.test[0])

      s.dcache_access.value = s.dcache.cachereq.rdy & s.dcache.cachereq.val
示例#12
0
文件: Top.py 项目: ya235/bubblesort
    def __init__(s):

        # interface from source and sink

        s.in_mem = InValRdyBundle(nWid)
        s.out_mem = OutValRdyBundle(nWid)

        s.cgra = CgraRTL()
        s.fsm = fsm()

        #Memory

        s.ocm = TestMemoryFuture(MemMsg(
            0, 32, nWid))  # opaque field, address, data width

        # Input Mux

        s.input_mux = m = Mux(dtype=MemMsg(0, 32, nWid), nports=3)

        s.in_mem_wire = Wire(MemMsg(0, 32, nWid))

        @s.combinational
        def logic():
            s.in_mem_wire.msg[0:16].value = s.in_mem.msg[0:16]  # data
            s.in_mem_wire.msg[16:18].value = s.in_mem.msg[
                16:18]  # length in bytes of read or write
            s.in_mem_wire.msg[18:50].value = s.in_mem.msg[18:
                                                          50]  # address field
            s.in_mem_wire.msg[50:51].value = s.in_mem.msg[
                50:51]  # type: read or write

        s.connect_pairs(
            m.in_[0],
            s.in_mem_wire,
            m.in_[1],
            s.cgra.ocmreqs[0],
            m.in_[2],
            s.cgra.ocmreqs[1],
            m.sel,
            s.fsm.in_mux_sel,  # Add later in Cpath
        )

        # Memory Connections

        s.connect(s.ocm.reqs[0], s.input_mux.out)

        # Demux logic
        @s.combinational
        def logic():

            if s.fsm.out_mux_sel.value == 0:
                s.out_mem.msg[0:16] = s.ocm.resps[0].msg[0:16]
                s.out_mem.msg[16:18] = s.ocm.resps[0].msg[16:18]
                s.out_mem.msg[18:50] = s.ocm.resps[0].msg[18:50]
                s.out_mem.msg[50:51] = s.ocm.resps[0].msg[50:51]

            elif s.fsm.out_mux_sel.value == 1:
                s.cgra.ocmresps[0].msg.value = s.ocm.resps[0].msg

            elif s.fsm.out_mux_sel.value == 2:
                s.cgra.ocmresps[1].msg.value = s.ocm.resps[0].msg

        # queue for control word
        #s.ctr_q = SingleElementBypassQueue[nPE](inst_msg())
        #s.ctr_q = SingleElementNormalQueue[nPE](inst_msg())
        s.ctr_q = NormalQueue[nPE](2, inst_msg())

        # queue for cgra-to-fsm response
        s.resp_q = SingleElementBypassQueue[nPE](1)
        #s.resp_q = SingleElementNormalQueue[nPE](1)

        for x in range(nPE):
            s.connect(s.cgra.out_fsm[x], s.resp_q[x].enq)
            s.connect(s.resp_q[x].deq, s.fsm.in_[x])

            s.connect(s.fsm.out[x], s.ctr_q[x].enq)
            s.connect(s.ctr_q[x].deq, s.cgra.in_control[x])

        s.connect(s.in_mem, s.cgra.in_mem)
        s.connect(s.out_mem, s.cgra.out_mem)
    def __init__(s):

        # Parameters

        num_reqers = 4  # 4 processors
        num_reqees = 4  # 4 data caches
        num_ports = max(num_reqers, num_reqees)  # We still have 4 ports

        nopaque_nbits = 8
        mopaque_nbits = 8
        addr_nbits = 32
        data_nbits = 32  # CacheNet only deals with 32 bit requests

        #---------------------------------------------------------------------
        # Interface
        #---------------------------------------------------------------------

        s.procifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)
        s.cacheifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)

        s.procreq = InValRdyBundle[num_ports](s.procifc.req)
        s.procresp = OutValRdyBundle[num_ports](s.procifc.resp)

        s.cachereq = OutValRdyBundle[num_ports](s.cacheifc.req)
        s.cacheresp = InValRdyBundle[num_ports](s.cacheifc.resp)

        #---------------------------------------------------------------------
        # Components
        #---------------------------------------------------------------------

        single_reqee = False  # 4 caches so not single reqee
        single_reqer = False  # 4 procs so not single reqer

        s.u_adpt = UpsAdapter[num_ports](
            single_reqee,
            mopaque_nbits,
            addr_nbits,
            data_nbits,  # mem msg parameter
            nopaque_nbits,
            num_ports)  # net msg parameter

        # One can also use RingNetRTL

        s.reqnet = BusNetRTL(s.procifc.req.nbits)
        s.respnet = BusNetRTL(s.procifc.resp.nbits)

        s.d_adpt = DownsAdapter[num_ports](
            single_reqer,
            mopaque_nbits,
            addr_nbits,
            data_nbits,  # mem msg parameter
            nopaque_nbits,
            num_ports)  # net msg parameter

        #---------------------------------------------------------------------
        # Connections
        #---------------------------------------------------------------------

        for i in xrange(num_ports):
            s.connect(s.u_adpt[i].src_id, i)

            s.connect(s.procreq[i], s.u_adpt[i].memreq)
            s.connect(s.u_adpt[i].netreq, s.reqnet.in_[i])

            s.connect(s.procresp[i], s.u_adpt[i].memresp)
            s.connect(s.u_adpt[i].netresp, s.respnet.out[i])

        for i in xrange(num_ports):
            s.connect(s.d_adpt[i].src_id, i)

            s.connect(s.reqnet.out[i], s.d_adpt[i].netreq)
            s.connect(s.d_adpt[i].memreq, s.cachereq[i])

            s.connect(s.respnet.in_[i], s.d_adpt[i].netresp)
            s.connect(s.d_adpt[i].memresp, s.cacheresp[i])
示例#14
0
    def __init__(s):

        # Parameters

        num_reqers = 4  # 4 data caches
        num_reqees = 1  # 1 memory port
        num_ports = max(num_reqers, num_reqees)  # We still have 4 ports

        nopaque_nbits = 8
        mopaque_nbits = 8
        addr_nbits = 32
        data_nbits = 128  # MemNet deals with 128 bit refill requests

        # Interface

        s.memifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)
        s.mainmemifc = MemMsg(mopaque_nbits, addr_nbits, data_nbits)

        s.memreq = InValRdyBundle[num_ports](s.memifc.req)
        s.memresp = OutValRdyBundle[num_ports](s.memifc.resp)

        s.mainmemreq = OutValRdyBundle[num_ports](s.mainmemifc.req)
        s.mainmemresp = InValRdyBundle[num_ports](s.mainmemifc.resp)

        # Connection

        s.inner = MemNetVRTL_inner()

        memreq_nbits = s.memifc.req.nbits
        memresp_nbits = s.memifc.resp.nbits
        mainmemreq_nbits = s.mainmemifc.req.nbits
        mainmemresp_nbits = s.mainmemifc.resp.nbits

        for i in xrange(num_ports):
            s.connect_pairs(
                s.memreq[i].val,
                s.inner.memreq_val[i],
                s.memreq[i].rdy,
                s.inner.memreq_rdy[i],
                s.memreq[i].msg,
                s.inner.memreq_msg[i * memreq_nbits:(i + 1) * memreq_nbits],
                s.memresp[i].val,
                s.inner.memresp_val[i],
                s.memresp[i].rdy,
                s.inner.memresp_rdy[i],
                s.memresp[i].msg,
                s.inner.memresp_msg[i * memresp_nbits:(i + 1) * memresp_nbits],
                s.mainmemreq[i].val,
                s.inner.mainmemreq_val[i],
                s.mainmemreq[i].rdy,
                s.inner.mainmemreq_rdy[i],
                s.mainmemreq[i].msg,
                s.inner.mainmemreq_msg[i * mainmemreq_nbits:(i + 1) *
                                       mainmemreq_nbits],
                s.mainmemresp[i].val,
                s.inner.mainmemresp_val[i],
                s.mainmemresp[i].rdy,
                s.inner.mainmemresp_rdy[i],
                s.mainmemresp[i].msg,
                s.inner.mainmemresp_msg[i * mainmemresp_nbits:(i + 1) *
                                        mainmemresp_nbits],
            )