Tesi Robotica Algoritmi ed architetture per la risoluzione di... | Page 80

4.4. HARDWARE ARCHITECTURE 80 segno estendere (sext) e zero estendere (zext), che sia risultato in un numero intero senza segno. Tuttavia, le operazioni Verilog come + / - dipendono dal tipo degli operandi, che può essere firmato o senza segno. In LegUp, dichiariamo ogni variabile Verilog come unsigned e utilizzare il $signed() comando Verilog quando richiesto da un’istruzione come sdiv, Srem, o sext. 4.4.6 Mult-dimensional Arrays Array multi-dimensionali sono memorizzati in ordine di riga-maggiore, la stessa convenzione usata da C. Ad esempio in un array: int array[2][2][2] = {{{0, 1}, {2, 3}}, {{4, 5}, {7, 8}}} Se si assegna variabili per la dimensione di ogni dimensione della matrice [A] [B] [C] dove A = 2, B = 2, C = 2. Poi per accedere alla schiera di elementi [a] [b] [c] memoria o set è dato da: offset = c + C*b + C*B*a = c + C*(b + B*a) Questo supporta la memorizzazione di un array di dimensione arbitraria in ram la stessa larghezza di un elemento con A* B* C righe. 4.4.7 Functional Units Per mantenere Fmax alto, utilizziamo le pipeline . In tutti i casi si sceglie una pipeline pari alla larghezza bit dell’operazione. Unità funzionali soltanto le parti divisorie/modulo per salvare zona. Il driver clock è impostato a 0 quando il segnale wait_request del controller della memoria è elevato o quando stiamo chiamando una funzione. 4.4.8 Structs Le strutture sono supportate da LegUp compresi i puntatori, array, strutture e primitive come elementi. I puntatori a struct sono supportati anche, ad esempio le liste concatenate possono essere sintetizzati.