orca-sim
Public Member Functions | Private Member Functions | Private Attributes | List of all members
TDmaMult Class Reference

#include <TDmaMult.hpp>

Inheritance diagram for TDmaMult:

Public Member Functions

DmaState GetDmaState ()
 
SimulationTime Run ()
 
void Reset ()
 
 TDmaMult (std::string name, Signal< uint8_t > *stall, Signal< uint8_t > *dma_start, Signal< uint32_t > *burst_size, Signal< uint32_t > *nn_size, Signal< uint32_t > *out_size, uint32_t base_mac_out_addr, Memory *main_mem)
 ctor More...
 
 ~TDmaMult ()
 dtor More...
 

Private Member Functions

void ReadData ()
 Internal processes – 3 stage pipeline. More...
 
void DoMult ()
 
void DoAcc ()
 

Private Attributes

Memory * _mem0
 
uint32_t _memW [SIMD_SIZE]
 
uint32_t _memI [SIMD_SIZE]
 
uint32_t _base_mac_out_addr
 
DmaState _dma_state
 
Signal< uint8_t > * _sig_stall
 
Signal< uint8_t > * _sig_dma_prog
 
Signal< uint32_t > * _sig_burst_size
 
Signal< uint32_t > * _sig_nn_size
 
Signal< uint32_t > * _sig_out_size
 
float _op1 [SIMD_SIZE]
 
float _op2 [SIMD_SIZE]
 
float _reg_mul [SIMD_SIZE]
 
float _reg_mac [SIMD_SIZE]
 
uint8_t _mul_loaded
 pipeline signals. More...
 
uint8_t _mul_ready
 
uint32_t _burst_size
 
uint32_t nn_size
 
uint32_t out_size
 
uint32_t _remaining
 count number of data to be read. More...
 
uint32_t _mem_idx
 memory idx used to access both the input and weight memories. More...
 

Detailed Description

Author
Alexandre Amory, based on Anderson's TDMANetif
Date
01/04/20

Definition at line 69 of file TDmaMult.hpp.

Constructor & Destructor Documentation

§ TDmaMult()

TDmaMult::TDmaMult ( std::string  name,
Signal< uint8_t > *  stall,
Signal< uint8_t > *  dma_start,
Signal< uint32_t > *  burst_size,
Signal< uint32_t > *  nn_size,
Signal< uint32_t > *  out_size,
uint32_t  base_mac_out_addr,
Memory *  main_mem 
)

ctor

This file is part of project URSA.

Parameters
namename of the module.
stallsignal to stall the processor while the DMA is going on.
burst_sizeMMIO with the total number of multiplications.
nn_size(not used) number of NN memory banks for a single MAC.
out_size(not used) number of expected output data.
base_mac_out_addrbase address to the array with the output of the MACs.
macpointer to the MAC module.

More information on the project can be found at URSA's repository at GitHub

http://https://github.com/andersondomingues/ursa

Copyright (C) 2018 Anderson Domingues, ti.an.nosp@m.ders.nosp@m.ondom.nosp@m.ingu.nosp@m.es@gm.nosp@m.ail..nosp@m.com

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Definition at line 34 of file TDmaMult.cpp.

37  : TimedModel(name) {
38 
39  int i;
40 
41  // control signal sent to the proc
42  _sig_stall = stall;
43  _sig_dma_prog = dma_start;
44 
45  // data signals sent by the proc
46  _sig_burst_size = burst_size;
47  _sig_nn_size = nn_size; // TODO not used
48  _sig_out_size = out_size; // TODO not used
49  _base_mac_out_addr = base_mac_out_addr;
50 
51  // set the base mamory address to each channel
52  _memW[0] = MEMW_BASE;
53  _memI[0] = MEMI_BASE;
54  for ( i = 1; i < SIMD_SIZE; i++)
55  {
58  }
59  _mem0 = main_mem;
60 
61  // internal control 'registers' between the pipeline stages
62  _mul_loaded = 0;
63  _mul_ready = 0;
64 
65  printf("NN CONFIGURATION:\n\n");
66  printf(" TOTAL_NN_MEM_SIZE = 0x%x\n",TOTAL_NN_MEM_SIZE);
67  printf(" SIMD_SIZE = %d\n",SIMD_SIZE);
68  printf(" NN_MEM_SIZE_PER_CHANNEL = 0x%x\n",NN_MEM_SIZE_PER_CHANNEL);
69  printf(" MEMW_BASE = 0x%x\n",MEMW_BASE);
70  printf(" MEMI_BASE = 0x%x\n",MEMI_BASE);
71  printf(" DMA_MAC_OUT_ARRAY = 0x%x\n\n",base_mac_out_addr);
72 
73  this->Reset();
74 }
Signal< uint8_t > * _sig_dma_prog
Definition: TDmaMult.hpp:89
Signal< uint32_t > * _sig_out_size
Definition: TDmaMult.hpp:99
uint32_t _memI[SIMD_SIZE]
Definition: TDmaMult.hpp:78
uint32_t nn_size
Definition: TDmaMult.hpp:117
Signal< uint32_t > * _sig_nn_size
Definition: TDmaMult.hpp:97
#define MEMI_BASE
Definition: _MemoryMap.h:84
uint8_t _mul_loaded
pipeline signals.
Definition: TDmaMult.hpp:112
uint32_t out_size
Definition: TDmaMult.hpp:118
#define MEMW_BASE
Definition: _MemoryMap.h:83
#define SIMD_SIZE
Definition: _MemoryMap.h:81
Memory * _mem0
Definition: TDmaMult.hpp:72
uint8_t _mul_ready
Definition: TDmaMult.hpp:113
Signal< uint32_t > * _sig_burst_size
Definition: TDmaMult.hpp:93
void Reset()
Definition: TDmaMult.cpp:79
uint32_t _memW[SIMD_SIZE]
Definition: TDmaMult.hpp:75
#define TOTAL_NN_MEM_SIZE
Definition: _MemoryMap.h:80
Signal< uint8_t > * _sig_stall
Definition: TDmaMult.hpp:87
uint32_t _base_mac_out_addr
Definition: TDmaMult.hpp:81
#define NN_MEM_SIZE_PER_CHANNEL
Definition: _MemoryMap.h:82

§ ~TDmaMult()

TDmaMult::~TDmaMult ( )

dtor

Definition at line 76 of file TDmaMult.cpp.

76  {
77 }

Member Function Documentation

§ DoAcc()

void TDmaMult::DoAcc ( )
private

Definition at line 107 of file TDmaMult.cpp.

107  {
108  int i;
109  switch(_dma_state){
111  for (i=0;i<SIMD_SIZE;i++){
112  _reg_mac[i] = 0;
113  }
114  }break;
116  if (_mul_ready == 0x1){
117  for (i=0;i<SIMD_SIZE;i++){
118  _reg_mac[i] += _reg_mul[i];
119  }
120  }
121  }break;
122  case DmaState::COPY_TO_CPU:{
123  float *ptr = (float *)_mem0->GetMap(_base_mac_out_addr);
124  for (i=0;i<SIMD_SIZE;i++){
125  //printf ("MAC[%d]: %f - 0x%p\n", i, _reg_mac[i], &(_reg_mac[i]));
126  *ptr = _reg_mac[i]; // send the final result back to the processor
127  ptr++;
128  }
129  }break;
130  case DmaState::FLUSH:
131  break;
132  }
133 }
DmaState _dma_state
Definition: TDmaMult.hpp:83
float _reg_mac[SIMD_SIZE]
Definition: TDmaMult.hpp:109
float _reg_mul[SIMD_SIZE]
Definition: TDmaMult.hpp:107
#define SIMD_SIZE
Definition: _MemoryMap.h:81
Memory * _mem0
Definition: TDmaMult.hpp:72
uint8_t _mul_ready
Definition: TDmaMult.hpp:113
uint32_t _base_mac_out_addr
Definition: TDmaMult.hpp:81

§ DoMult()

void TDmaMult::DoMult ( )
private

Definition at line 137 of file TDmaMult.cpp.

137  {
138  int i;
140  for (i=0;i<SIMD_SIZE;i++){
141  _reg_mul[i] = 0; // restart register
142  }
143  _mul_ready = 0;
144  }
145  else {
146  if (_mul_loaded == 0x1){
147  for (i=0;i<SIMD_SIZE;i++){
148  _reg_mul[i] = _op1[i] * _op2[i]; // mult
149  }
150  _mul_ready = 1;
151  }else{
152  _mul_ready = 0;
153  }
154  }
155 }
uint8_t _mul_loaded
pipeline signals.
Definition: TDmaMult.hpp:112
DmaState _dma_state
Definition: TDmaMult.hpp:83
float _reg_mul[SIMD_SIZE]
Definition: TDmaMult.hpp:107
float _op1[SIMD_SIZE]
Definition: TDmaMult.hpp:104
#define SIMD_SIZE
Definition: _MemoryMap.h:81
uint8_t _mul_ready
Definition: TDmaMult.hpp:113
float _op2[SIMD_SIZE]
Definition: TDmaMult.hpp:104

§ GetDmaState()

DmaState TDmaMult::GetDmaState ( )

Definition at line 92 of file TDmaMult.cpp.

92 {return _dma_state;}
DmaState _dma_state
Definition: TDmaMult.hpp:83

§ ReadData()

void TDmaMult::ReadData ( )
private

Internal processes – 3 stage pipeline.

Definition at line 158 of file TDmaMult.cpp.

158  {
159  int i;
160  //send state machine
161  switch(_dma_state){
162  //wait the cpu to configure the ni
164  if(_sig_dma_prog->Read() == 0x1){
165  _sig_stall->Write(0x1); //raise stall
166  _mul_loaded = 0; // raised when the mul can be executed
167  // reading data sent from the proc to the DMA
170  stringstream s;
171  s << this->GetName() << ": burst size exedded the NN memory capacity.";
172  throw std::runtime_error(s.str());
173  }
174 // _w_mem_idx = _sig_nn_size->Read();
175 // _i_mem_idx = _sig_out_size->Read();
176  // init counters used for burst mode operation
177  _mem_idx = 0;
179  _dma_state = DmaState::COPY_FROM_MEM; //change states
180  }
181 
182  } break;
183 
184  //copy data from the NN memory to the internal MAC registers
186 
187  if(_remaining > 0){
188  int8_t * w_ptr, * i_ptr;
189 
190  for (i=0;i<SIMD_SIZE;i++){
191  w_ptr = _mem0->GetMap(_memW[i]+_mem_idx);
192  _op1[i] = *(float*)w_ptr;
193  i_ptr = _mem0->GetMap(_memI[i]+_mem_idx);
194  _op2[i] = *(float*)i_ptr;
195  //if ( _op1[i] != 0.0f)
196  // printf ("OPs[%d %d]: %f %f\n", _mem_idx, i, _op1[i], _op2[i]);
197  }
198  //signal to the next pipiline stage
199  _mul_loaded = 1;
200  // updating counters used for burst mode operation
201  _remaining--; //one less packet to send
202  _mem_idx +=4;
203  }else{
204  _mul_loaded = 0;
206  }
207  } break;
208 
209  case DmaState::COPY_TO_CPU:{
210  // result is written back to the output MMIO register
212  }break;
213 
214  // just waits few clock cycles. currently, only one cycle
215  case DmaState::FLUSH:
217  // TODO multiple drivers to signal _sig_dma_prog !!! implement a handshare protocol between proc and dma
218  _sig_dma_prog->Write(0x0); //lower the start signal .
219  _sig_stall->Write(0x0); //lowering stall and giving the control back to the processor
220  break;
221  }
222 }
Signal< uint8_t > * _sig_dma_prog
Definition: TDmaMult.hpp:89
uint32_t _memI[SIMD_SIZE]
Definition: TDmaMult.hpp:78
T Read()
Get the last value writen to the bus.
Definition: Signal.cpp:118
uint8_t _mul_loaded
pipeline signals.
Definition: TDmaMult.hpp:112
DmaState _dma_state
Definition: TDmaMult.hpp:83
uint32_t _remaining
count number of data to be read.
Definition: TDmaMult.hpp:120
void Write(T val)
Writes some value to the bus.
Definition: Signal.cpp:127
uint32_t _mem_idx
memory idx used to access both the input and weight memories.
Definition: TDmaMult.hpp:122
uint32_t _burst_size
Definition: TDmaMult.hpp:116
float _op1[SIMD_SIZE]
Definition: TDmaMult.hpp:104
#define SIMD_SIZE
Definition: _MemoryMap.h:81
Memory * _mem0
Definition: TDmaMult.hpp:72
Signal< uint32_t > * _sig_burst_size
Definition: TDmaMult.hpp:93
float _op2[SIMD_SIZE]
Definition: TDmaMult.hpp:104
uint32_t _memW[SIMD_SIZE]
Definition: TDmaMult.hpp:75
Signal< uint8_t > * _sig_stall
Definition: TDmaMult.hpp:87
#define NN_MEM_SIZE_PER_CHANNEL
Definition: _MemoryMap.h:82

§ Reset()

void TDmaMult::Reset ( )

Definition at line 79 of file TDmaMult.cpp.

79  {
80  int i;
81  // all relevant data go to their initial value at this state
83 
84  // get the pointer to the base memory position where the MACs store their final values
85  float *ptr = (float *)_mem0->GetMap(_base_mac_out_addr);
86  for (i=0;i<SIMD_SIZE;i++){
87  *ptr = 0;
88  ptr++;
89  }
90 }
DmaState _dma_state
Definition: TDmaMult.hpp:83
#define SIMD_SIZE
Definition: _MemoryMap.h:81
Memory * _mem0
Definition: TDmaMult.hpp:72
uint32_t _base_mac_out_addr
Definition: TDmaMult.hpp:81

§ Run()

SimulationTime TDmaMult::Run ( )

Definition at line 94 of file TDmaMult.cpp.

94  {
95  // TODO fazer loop p realizar o mac de todo o vetor
96  //3 stage pipeline
97  this->DoAcc(); // 3rd stage, accumulator
98  this->DoMult(); // 2nd stage, does mult
99  this->ReadData(); // 1st stage, read data from the memory
100 
101  return 1; //takes only 1 cycle to change both states
102 }
void DoMult()
Definition: TDmaMult.cpp:137
void DoAcc()
Definition: TDmaMult.cpp:107
void ReadData()
Internal processes – 3 stage pipeline.
Definition: TDmaMult.cpp:158

Member Data Documentation

§ _base_mac_out_addr

uint32_t TDmaMult::_base_mac_out_addr
private

Definition at line 81 of file TDmaMult.hpp.

§ _burst_size

uint32_t TDmaMult::_burst_size
private

Definition at line 116 of file TDmaMult.hpp.

§ _dma_state

DmaState TDmaMult::_dma_state
private

Definition at line 83 of file TDmaMult.hpp.

§ _mem0

Memory* TDmaMult::_mem0
private

Definition at line 72 of file TDmaMult.hpp.

§ _mem_idx

uint32_t TDmaMult::_mem_idx
private

memory idx used to access both the input and weight memories.

Definition at line 122 of file TDmaMult.hpp.

§ _memI

uint32_t TDmaMult::_memI[SIMD_SIZE]
private

Definition at line 78 of file TDmaMult.hpp.

§ _memW

uint32_t TDmaMult::_memW[SIMD_SIZE]
private

Definition at line 75 of file TDmaMult.hpp.

§ _mul_loaded

uint8_t TDmaMult::_mul_loaded
private

pipeline signals.

Definition at line 112 of file TDmaMult.hpp.

§ _mul_ready

uint8_t TDmaMult::_mul_ready
private

Definition at line 113 of file TDmaMult.hpp.

§ _op1

float TDmaMult::_op1[SIMD_SIZE]
private

Definition at line 104 of file TDmaMult.hpp.

§ _op2

float TDmaMult::_op2[SIMD_SIZE]
private

Definition at line 104 of file TDmaMult.hpp.

§ _reg_mac

float TDmaMult::_reg_mac[SIMD_SIZE]
private

Definition at line 109 of file TDmaMult.hpp.

§ _reg_mul

float TDmaMult::_reg_mul[SIMD_SIZE]
private

Definition at line 107 of file TDmaMult.hpp.

§ _remaining

uint32_t TDmaMult::_remaining
private

count number of data to be read.

Definition at line 120 of file TDmaMult.hpp.

§ _sig_burst_size

Signal<uint32_t>* TDmaMult::_sig_burst_size
private

Definition at line 93 of file TDmaMult.hpp.

§ _sig_dma_prog

Signal<uint8_t>* TDmaMult::_sig_dma_prog
private

Definition at line 89 of file TDmaMult.hpp.

§ _sig_nn_size

Signal<uint32_t>* TDmaMult::_sig_nn_size
private

Definition at line 97 of file TDmaMult.hpp.

§ _sig_out_size

Signal<uint32_t>* TDmaMult::_sig_out_size
private

Definition at line 99 of file TDmaMult.hpp.

§ _sig_stall

Signal<uint8_t>* TDmaMult::_sig_stall
private

Definition at line 87 of file TDmaMult.hpp.

§ nn_size

uint32_t TDmaMult::nn_size
private

Definition at line 117 of file TDmaMult.hpp.

§ out_size

uint32_t TDmaMult::out_size
private

Definition at line 118 of file TDmaMult.hpp.


The documentation for this class was generated from the following files: