orca-sim
ProcessingTile.cpp
Go to the documentation of this file.
1 
22 #include <iostream>
23 #include <sstream>
24 
25 //model API
26 #include <ProcessingTile.h>
27 
33  //DMA control signals
34  _sig_stall = new Signal<uint8_t>(SIGNAL_CPU_STALL, this->GetName() + ".stall");
35  _sig_dma_prog = new Signal<uint8_t>(SIGNAL_DMA_PROG, this->GetName() + ".dma_prog");
36  // dummy signal required by the cpu
37  _sig_intr = new Signal<uint8_t>(SIGNAL_CPU_INTR, this->GetName() + ".intr");
38 
39  //DMA data signals
40  _sig_burst_size = new Signal<uint32_t>(DMA_BURST_SIZE, this->GetName() + ".burst_size");
41  _sig_nn_size = new Signal<uint32_t>(DMA_NN_SIZE, this->GetName() + ".weight_mem_addr");
42  _sig_out_size = new Signal<uint32_t>(DMA_OUT_SIZE, this->GetName() + ".input_mem_addr");
43 
44  //create a cpu and memory in addition to current tile hardware
45  _mem0 = new Memory(this->GetName() + ".mem0", MEM0_SIZE, MEM0_BASE); //main
46  _cpu = new HFRiscV(this->GetName() + ".cpu", _sig_intr, _sig_stall, _mem0);
47 
48  // configurable DMA controller which is able to feed multiple MACs in parallel
49  _dma = new TDmaMult(this->GetName() + ".dma_mult", _sig_stall, _sig_dma_prog, _sig_burst_size,
50  _sig_nn_size, _sig_out_size, DMA_MAC_OUT_ARRAY, _mem0);
51 
52  //bind control signals to hardware (cpu side)
53  _sig_stall->MapTo(_mem0->GetMap(SIGNAL_CPU_STALL), SIGNAL_CPU_STALL);
54  _sig_dma_prog->MapTo(_mem0->GetMap(SIGNAL_DMA_PROG), SIGNAL_DMA_PROG);
55  _sig_intr->MapTo(_mem0->GetMap(SIGNAL_CPU_INTR), SIGNAL_CPU_INTR);
56 
57  _sig_burst_size->MapTo(_mem0->GetMap(DMA_BURST_SIZE), DMA_BURST_SIZE);
58  _sig_nn_size->MapTo(_mem0->GetMap(DMA_NN_SIZE), DMA_NN_SIZE);
59  _sig_out_size->MapTo(_mem0->GetMap(DMA_OUT_SIZE), DMA_OUT_SIZE);
60 
61  #ifdef MEMORY_ENABLE_COUNTERS
62  //map memory counters to memory space
63  _mem0->GetSignalCounterStore()->MapTo(_mem0->GetMap(M0_COUNTER_STORE_ADDR), M0_COUNTER_STORE_ADDR);
64  _mem0->GetSignalCounterLoad()->MapTo(_mem0->GetMap(M0_COUNTER_LOAD_ADDR), M0_COUNTER_LOAD_ADDR);
65  #endif
66 
67  #ifdef HFRISCV_ENABLE_COUNTERS
68  //map cpu counters to memory space
69  _cpu->GetSignalCounterArith()->MapTo(_mem0->GetMap(CPU_COUNTER_ARITH_ADDR), CPU_COUNTER_ARITH_ADDR);
70  _cpu->GetSignalCounterLogical()->MapTo(_mem0->GetMap(CPU_COUNTER_LOGICAL_ADDR), CPU_COUNTER_LOGICAL_ADDR);
71  _cpu->GetSignalCounterShift()->MapTo(_mem0->GetMap(CPU_COUNTER_SHIFT_ADDR), CPU_COUNTER_SHIFT_ADDR);
72  _cpu->GetSignalCounterBranches()->MapTo(_mem0->GetMap(CPU_COUNTER_BRANCHES_ADDR), CPU_COUNTER_BRANCHES_ADDR);
73  _cpu->GetSignalCounterJumps()->MapTo(_mem0->GetMap(CPU_COUNTER_JUMPS_ADDR), CPU_COUNTER_JUMPS_ADDR);
74  _cpu->GetSignalCounterLoadStore()->MapTo(_mem0->GetMap(CPU_COUNTER_LOADSTORE_ADDR), CPU_COUNTER_LOADSTORE_ADDR);
75  _cpu->GetSignalCounterCyclesTotal()->MapTo(_mem0->GetMap(CPU_COUNTER_CYCLES_TOTAL_ADDR), CPU_COUNTER_CYCLES_TOTAL_ADDR);
76  _cpu->GetSignalCounterCyclesStall()->MapTo(_mem0->GetMap(CPU_COUNTER_CYCLES_STALL_ADDR), CPU_COUNTER_CYCLES_STALL_ADDR);
77  _cpu->GetSignalHostTime()->MapTo(_mem0->GetMap(CPU_COUNTER_HOSTTIME_ADDR), CPU_COUNTER_HOSTTIME_ADDR);
78  #endif
79 
80  this->Reset();
81 }
82 
84  delete(_cpu);
85  delete(_mem0);
86  delete(_dma);
87 
88  //delete signals
89  delete(_sig_stall);
90  delete(_sig_dma_prog);
91  delete(_sig_intr);
92  delete(_sig_burst_size);
93  delete(_sig_nn_size);
94  delete(_sig_out_size);
95 }
96 
98  //reset control wires
99  _sig_stall->Write(0);
100  _sig_dma_prog ->Write(0);
101  _sig_intr->Write(0);
102 
103  //DMA data signals
105  _sig_nn_size->Write(0);
106  _sig_out_size->Write(0);
107 }
108 
109 HFRiscV* ProcessingTile::GetCpu(){
110  return _cpu;
111 }
113  return _dma;
114 }
115 
116 /************************************* GETTERS **************************************/
117 Signal<uint8_t>* ProcessingTile::GetSignalStall(){ return _sig_stall; }
118 Signal<uint8_t>* ProcessingTile::GetSignalDmaProg(){ return _sig_dma_prog; }
119 Signal<uint8_t>* ProcessingTile::GetSignalIntr(){ return _sig_intr; }
120 
121 
122 Signal<uint32_t>* ProcessingTile::GetSignalHostTime(){
123  return _signal_hosttime;
124 }
125 
126 Memory* ProcessingTile::GetMem0(){ return _mem0;}
127 
128 std::string ProcessingTile::ToString(){
129  stringstream ss;
130  ss << this->GetName() << "={" << _cpu->GetName() <<"}";
131  return ss.str();
132 }
133 
135  return "core!";
136 }
#define MEM0_BASE
TDmaMult * GetDma()
Signal< uint8_t > * GetSignalIntr()
void MapTo(bool keep_val=true)
Maps current Signal to the internal storage.
Definition: Signal.cpp:79
#define DMA_OUT_SIZE
Definition: _MemoryMap.h:44
#define MEM0_SIZE
This file is part of project URSA.
Signal< uint8_t > * GetSignalDmaProg()
Signal< uint32_t > * _signal_hosttime
#define SIGNAL_CPU_STALL
Definition: _MemoryMap.h:12
Signal< uint8_t > * GetSignalStall()
Signal< uint8_t > * _sig_dma_prog
ProcessingTile()
This file is part of project URSA.
std::string GetName()
Signal< uint32_t > * _sig_burst_size
#define DMA_BURST_SIZE
Definition: _MemoryMap.h:42
void Write(T val)
Writes some value to the bus.
Definition: Signal.cpp:127
#define DMA_MAC_OUT_ARRAY
Definition: _MemoryMap.h:45
HFRiscV * _cpu
#define DMA_NN_SIZE
Definition: _MemoryMap.h:43
Signal< uint32_t > * GetSignalHostTime()
Get current signal for systime signal.
Signal< uint32_t > * _sig_out_size
Signal< uint8_t > * _sig_intr
Memory * GetMem0()
HFRiscV * GetCpu()
Signal< uint8_t > * _sig_stall
std::string ToString()
Signal< uint32_t > * _sig_nn_size
#define SIGNAL_DMA_PROG
Definition: _MemoryMap.h:31
This class models an entire processing element that contains RAM memory (3x), DMA, NoC Router, HFRiscV core.
#define SIGNAL_CPU_INTR
Definition: _MemoryMap.h:13