Sei sulla pagina 1di 65

Universit degli Studi di Napoli Federico II Facolt di Ingegneria

Corso di Laurea Magistrale in Ingegneria Elettronica

Elaborato in

Architettura dei Sistemi Integrati


Elaborato Progettazione microprocessore

Federico Iaccarino
M61/150

A cura di:

Alessio Sellaroli
M61/177

Anno Accademico 2012-2013

Indice
1 Esercitazione 1 - ALU 1.1 Unit aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Unit logica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Unit logico-aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 5 9

2 Esercitazione 2 - Sintesi dellALU 15 2.1 Ottimizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3 Esercitazione 3 - Data-path del processore 3.1 Sintesi del Data-path . . . . . . . . . . . . . . . . . . . . . 3.1.1 Tempo di Setup . . . . . . . . . . . . . . . . . . . . 3.1.2 Tempo di Hold . . . . . . . . . . . . . . . . . . . . 3.1.3 Eetto della non-idealit del clock . . . . . . . . . . 3.1.4 Simulazione post-layout con annotazione dei ritardi 4 Esercitazione 4 - Placement 4.1 Floorplan . . . . . . . . . 4.2 Placement . . . . . . . . . 4.3 In-Place Optimization . . 4.4 Albero di Clock . . . . . . 4.5 Routing . . . . . . . . . . 4.6 Controllo . . . . . . . . . . 4.7 Salvataggio nale . . . . . 4.8 Aumento delloccupazione e . . . . . . . . Routing del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datapath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 29 29 30 32 33 35 37 37 38 40 41 42 42 43 47 48 48 51 53 55 57 59

5 Esercitazione 5 - Simulazione a 5.1 Simulazione con Spectre . . . 5.2 Analisi statica . . . . . . . . . 5.3 Leakage . . . . . . . . . . . . 5.4 Analisi Dinamica . . . . . . . 5.5 Netlist gerarchiche . . . . . . 5.6 Tempi di setup e di hold di un 5.7 Simulazione con Ultrasim . . .

livello transistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . registro . . . . . . . . . . . . . . . . .

Elenco delle gure


1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 Schema a blocchi dellALU. . . . . . . . . . . . . . Schema a blocchi della parte aritmetica dellALU. . Risultati della simulazione del blocco aritmetico. . . Multiplexer 4/1 utilizzato nellunit logica dellALU. Funzioni booleane al variare di f3,f2,f1,f0. . . . . . . Risultati della simulazione del blocco logico. . . . . . Risultati della simulazione dellALU. . . . . . . . . Schema a blocchi dellALU. . . . . . . . . . . . . . Schema a blocchi del Data-path. . . . . . Risultati della simulazione del data-path. Modello di timing per il vincolo di setup. Modello di timing per il vincolo di hold. . Floorplan del circuito. . . . . . . . . . Confronto pre e post ottimizzazione. . . Placement del circuito. . . . . . . . . . Clock Skew del circuito. . . . . . . . . . Albero di clock. . . . . . . . . . . . . . Verica della geometria del circuito. . . Analisi della potenza dissipata. . . . . . Report di Encounter. . . . . . . . . . . P&R con 90% doccupazione. . . . . . Cella con ritardo ????????? sul clock. Cella con ritardo ????????? sul clock. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . 2 . 5 . 5 . 6 . 9 . 14 . 14 . 24 . 29 . 29 . 31 . . . . . . . . . . . . . . . . . . . . . . . . . . 37 38 39 40 41 42 43 44 45 45 46 48 49 49 50 51 52 52 53 53 54 54 55 55 56 56

Caratteristica NMOS L=45nm W=90nm. . . . . . . . . . . . . . . . . . NMOS L=45nm W=90nm NMOS L=0.5m W=1m. . . . . . . Transcaratteristica del MOS. Vds costante e Vgs variabile tra 0 e 1.1V. Caratteristica PMOS L=45nm W=90nm. . . . . . . . . . . . . . . . . . Corrente di leakage rispettivamente per L=45nm e L=90nm. . . . . . . Corrente di leakage a dierenti temperature. . . . . . . . . . . . . . . . NMOS L=45nm W=90nm modello fast. . . . . . . . . . . . . . . . . . Circuito utilizzato nellanalisi dinamico. . . . . . . . . . . . . . . . . . Andamento dinamico ingresso/uscito. . . . . . . . . . . . . . . . . . . . tplh e tphl del circuito. . . . . . . . . . . . . . . . . . . . . . . . . . . . Variazione dei tempi di propagazione al variare della capacit di carico. Variazione dei tempi di propagazione al variare dello slew. . . . . . . . Circuito in esame. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Andamento ingresso/uscita dellinvertitore in esame. . . . . . . . . . . Ritardi di propagazione dellinvertitore in esame. . . . . . . . . . . . . . ii

5.16 5.17 5.18 5.19

Tempi di setup del ip op. . . . . . . . . . . . . . . . . Valutazione del tempo di setup del ip op. . . . . . . . . Valutazione del tempo di hold del ip op. . . . . . . . . Variazione uscita in funzione dellistante di commutazione ingresso. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.20 Modalita di simulazione di Ultrasim. . . . . . . . . . . . 5.21 Simulazione Digital fast in Simvision. . . . . . . . . . . .

. . . . . . del . . . . . .

. . . . . . . . . . . . . . . . . . . . . segnale D in . . . . . . . . . . . . . . . . . . . . .

. 57 . 58 . 58 . 59 . 60 . 61

iii

Capitolo 1 Esercitazione 1 - ALU


Lobiettivo della prima esercitazione del corso stato la progettazione dellALU Arithmetic Logic Unit. La unit logico-aritmetica suddivisa in due sottosezioni: una parte dedicata ad operazioni aritmetiche ed un per operazioni logiche. Un multiplexer seleziona luscita dei due blocchi.

Figura 1.1: Schema a blocchi dellALU.

1.1

Unit aritmetica

La parte aritmetica realizzata utilizzando un moltiplicatore ed un addizionatore. A questo blocco oltre agli ingressi A e B, di 16 bit, giunge un codice a 4 bit. Il MSB di tale codice pilota il multiplexer per selezionare luscita o dal blocco moltiplicatore o dal blocco addizionatore 1

1 Esercitazione 1 - ALU

Figura 1.2: Schema a blocchi della parte aritmetica dellALU.

Di seguito riporto la descrizione dataow della parte aritmetica.


1

ESERCITAZIONE d e l 21/3/13 d i ASI D e s c r i z i o n e d a t a f l o w d e l l a p a r t e a r i t m e t i c a d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ; e n t i t y aritm i s port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; zero , invert , c , m : in std_logic ; Z : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end e n t i t y ; a r c h i t e c t u r e dataflow o f aritm i s s i g n a l B1 , Prod_temp , Somma, c_temp : s i g n e d ( 1 5 downto 0 ) ; s i g n a l temp : s t d _ l o g i c _ v e c t o r ( 1 downto 0 ) ; s i g n a l Prod : s i g n e d ( 3 1 downto 0 ) ; begin temp <= ( z e r o , i n v e r t ) ; B l o c c o b_op with temp s e l e c t B1 <= s i g n e d (B) when " 00 " , s i g n e d ( not B) when " 01 " , ( o t h e r s => 0 ) when " 10 " , ( o t h e r s => 1 ) when o t h e r s ; V e t t o r e d i z e r i ad e c c e t t o d e l LSB p a r i a c c_temp <= ( 0 => c , o t h e r s => 0 ) ; Essendo B1 e c_temp s i g n e d devo a p p l i c a r e un c a s t i n g s i A Somma <= B1 + s i g n e d (A) + c_temp ; I l p r o d o t t o t r a due t e r m i n e a 16 b i t r e s t i t u i s c e un t e r m i n e a 32 b i t Prod <= s i g n e d (A) s i g n e d (B) ; Dei 32 b i t d e l p r o d o t t o p r e l e v o i 16 b i t + s i g n i f i c a t i v i Prod_temp <= Prod ( 3 1 downto 1 6 ) ; Determino l u s c i t a i n b a s e a l v a l o r e d i m Z <= s t d _ l o g i c _ v e c t o r ( Prod_temp ) when m = 1 else s t d _ l o g i c _ v e c t o r (Somma) ; end d a t a f l o w ;

11

13

15

17

19

21

23

25

27

29

31

33

35

37

39

41

1 Esercitazione 1 - ALU

Nel caso della moltiplicazione vengono prelevati, come richiesto, i primi 16 bit pi signicativi dei 32 restituiti dal prodotto di due seganli a 16 bit. Per vericare la corretta descrizione del circuito stato richiesto di sollecitare il blocco realizzato con gli input riportati di seguito.

Tali valori sono riportati nel seguente test bench :


2

ESERCITAZIONE d e l 21/3/13 d i ASI Test Bench d e l l a p a r t e a r i t m e t i c a d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ; e n t i t y aritm_tb i s end aritm_tb ; a r c h i t e c t u r e t e s t o f aritm_tb i s component a r i t m i s p o r t ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; zero , invert , c , m : in std_logic ; Z : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ; s i g n a l A_tb , B_tb , Z_tb : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s i g n a l code : s t d _ l o g i c _ v e c t o r ( 3 downto 0 ) ; begin dut : a r i t m p o r t map ( A => A_tb , B => B_tb , m => code ( 3 ) , i n v e r t => code ( 2 ) , z e r o => code ( 1 ) , c => code ( 0 ) , Z => Z_tb ) ; stimulus : process begin A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 0000 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 4 2 , 1 6 ) )

10

12

14

16

18

20

22

24

26

28

30

32

34

36

1 Esercitazione 1 - ALU

38

r e p o r t " e r r o r e i n A+B" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 0010 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) r e p o r t " e r r o r e i n Z=A" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 0011 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 0 0 , 1 6 ) ) r e p o r t " e r r o r e i n A+1" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 0101 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 5 6 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 1 1 , 1 6 ) ) ; code <= " 0101 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 12 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 1 1 , 1 6 ) ) ; code <= " 0110 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 8 , 1 6 ) ) r e p o r t " e r r o r e i n A1" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 5 2 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 3 0 4 , 1 6 ) ) ; code <= " 1000 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 3 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 5 2 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 3 0 4 , 1 6 ) ) ; code <= " 1101 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 3 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ;

40

42

44

46

48

50

52

54

56

58

60

62

64

66

68

70

72

74

76

78

80

82

84

86

88

90

92

94

1 Esercitazione 1 - ALU

96

98

100

102

A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 7 5 4 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 3 7 7 3 , 1 6 ) ) ; code <= " 1000 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 8 6 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 5888 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 5 6 0 , 1 6 ) ) ; code <= " 1000 " ; w a i t f o r 10 ns ; a s s e r t Z_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 230 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; wait ; end p r o c e s s ; end t e s t ;

104

106

108

110

112

114

La simulazione stata eseguita correttamente, e non ha prodotto warnings poich la simulazione ha restituito i risultati attesi. Di seguito riporto tali risultati.

Figura 1.3: Risultati della simulazione del blocco aritmetico.

1.2

Unit logica

La parte logica viene realizzata utilizzando un numero di 16 multiplexer 4/1 pilotati dai segnali A e B.

Figura 1.4: Multiplexer 4/1 utilizzato nellunit logica dellALU.

Per il blocco logico stato utilizzato una descrizione strutturale dove stato utilizzato la funzione generate per descrivere in maniera compatta tale struttura. I valori dei segnali f3-f0 determinano quale delle possibili funzioni booleane viene implementata secondo la seguente formula. B + f 1AB + f 2AB + f 3AB Z = f 0A Attraverso tale formula possibile realizzare le seguenti funzioni booleane. 5

1 Esercitazione 1 - ALU

Figura 1.5: Funzioni booleane al variare di f3,f2,f1,f0.

Di seguito riportato la descrizione strutturale utilizzata per descrivere lunit logica.


2

ESERCITAZIONE d e l 21/3/13 d i ASI D e s c r i z i o n e s t r u t t u r a l e d e l l a p a r t e b o o l e a n a d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ;

entity bool i s port ( 10 A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 12 f3 , f2 , f1 , f 0 : i n s t d _ l o g i c ; W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) 14 ) ; end e n t i t y ;


8 16

a r c h i t e c t u r e s t r u c t u r a l of bool i s
18

20

22

24

component Bool_Mux4 port ( in3 , in2 , in1 , in0 , x1 , x2 : i n s t d _ l o g i c ; Mux_out : out s t d _ l o g i c ); end component ; begin g1 : f o r k i n 15 downto 0 g e n e r a t e Bool_port : Bool_Mux4 p o r t map ( i n 3 => f3 , i n 2 => f2 , i n 1 => f1 , i n 0 => f0 , x1 => A( k ) , x2 => B( k ) , Mux_out => W( k ) ); end g e n e r a t e ;

26

28

30

32

34

36

38

end s t r u c t u r a l ;

Il componente utilizzato appunto un multiplexer 4/1 descritto nel seguente codice.


2

ESERCITAZIONE d e l 21/3/13 d i ASI M u l t i p l e x e r u t i l i z z a t o n e l l a d e s c r i z i o n e s t r u t t u r a l e d e l l a p a r t e b o o l e a n a d e l l ALU

1 Esercitazione 1 - ALU

library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ; e n t i t y Bool_Mux4 i s p o r t ( in3 , in2 , in1 , in0 , x1 , x2 : i n s t d _ l o g i c ; Mux_out : out s t d _ l o g i c ); end e n t i t y ; a r c h i t e c t u r e d a t a f l o w o f Bool_Mux4 i s s i g n a l temp : s t d _ l o g i c _ v e c t o r ( 1 downto 0 ) ; begin temp <= ( x1 , x2 ) ; Mux_out <= i n 3 when temp = " 11 " e l s e i n 2 when temp = " 01 " e l s e i n 1 when temp = " 10 " e l s e in0 ; end d a t a f l o w ;

10

12

14

16

18

20

22

Il test bench per vericare la corretta descrizione del blocco logico utilizza i seguenti valori.

Di seguito riportato il test bench ricavato a partire da tale tabella.


ESERCITAZIONE d e l 21/3/13 d i ASI

1 Esercitazione 1 - ALU

Test Bench d e l l a p a r t e b o o l e a n a d e l l ALU

library ieee ; use i e e e . std_logic_1164 . a l l ; 6 u s e i e e e . numeric_std . a l l ; e n t i t y tb_bool i s 8 end tb_bool ; a r c h i t e c t u r e t e s t o f tb_bool i s 10 component b o o l i s p o r t ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 12 B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; f3 , f2 , f1 , f 0 : i n s t d _ l o g i c ; 14 W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); 16 end component ; s i g n a l A_tb , B_tb , W_tb : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 18 s i g n a l code : s t d _ l o g i c _ v e c t o r ( 3 downto 0 ) ; begin 20 dut : b o o l p o r t map ( A => A_tb , 22 B => B_tb , f 3 => code ( 3 ) , 24 f 2 => code ( 2 ) , f 1 => code ( 1 ) , 26 f 0 => code ( 0 ) , W => W_tb ) ; 28 s t i m u l u s : p r o c e s s begin 30 A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; 32 code <= " 0000 " ; w a i t f o r 10 ns ; 34 a s s e r t W_tb <= b" 0000 _0000_0000_0000" r e p o r t " e r r o r e in 0" 36 s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; 38 B_tb <= b" 1010 _1101_1111_0000" ; code <= " 0001 " ; 40 w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0101 _0000_0000_0000" 42 r e p o r t " e r r o r e i n A NOR B" s e v e r i t y warning ; 44 A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; 46 code <= " 0011 " ; w a i t f o r 10 ns ; 48 a s s e r t W_tb <= b" 0101 _0010_0000_1111" r e p o r t " e r r o r e i n 0011 " 50 s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; 52 B_tb <= b" 1010 _1101_1111_0000" ; code <= " 0101 " ; 54 w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1111 _1100_1111_0000" 56 r e p o r t " e r r o r e i n 0101 " s e v e r i t y warning ; 58 A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; 60 code <= " 0110 " ;
4

1 Esercitazione 1 - ALU

62

64

66

68

70

72

74

76

78

80

82

84

86

88

90

92

94

w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1110_1111_1111" r e p o r t " e r r o r e i n A XOR B" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 1010 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0000 _0011_0000_1111" r e p o r t " e r r o r e i n 1010 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 1100 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1101_1111_0000" r e p o r t " e r r o r e i n 1100 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 1110 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1111_1111_1111" r e p o r t " e r r o r e i n A OR B" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 1111 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1111 _1111_1111_1111" r e p o r t " e r r o r e in 1" s e v e r i t y warning ; wait ; end p r o c e s s ; end t e s t ;

La simulazione ha restituito i codici attesi come mostrato nella seguente gura.

Figura 1.6: Risultati della simulazione del blocco logico.

1.3

Unit logico-aritmetica

Lunit logioco-aritmetica la realizziamo attraverso una descrizione strutturale dove utilizziamo il blocco logico e quello come aritmetico come componenti. Di seguito riporto tale descrizione strutturale dellALU.
1

ESERCITAZIONE d e l 21/3/13 d i ASI D e s c r i z i o n e s t r u t t u r a l e d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ; entity alu i s

1 Esercitazione 1 - ALU

port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 11 B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; opcode : i n s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; 13 W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); 15 end e n t i t y a l u ;


9 17

a r c h i t e c t u r e s t r u c t u r a l of alu i s s i g n a l Bool_temp , Aritm_temp : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; component a r i t m port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; zero , invert , c , m : in std_logic ; Z : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ;

19

21

23

25

27

29

component b o o l port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 33 B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; f3 , f2 , f1 , f 0 : i n s t d _ l o g i c ; 35 W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); 37 end component ;


31 39

41

43

45

component ALU_Mux2 port ( Aritm_out : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; Bool_out : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; mode : i n s t d _ l o g i c ; ALU_out : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ; begin bool_port : b o o l p o r t map ( A => A, B => B, f 3 => opcode ( 3 ) , f 2 => opcode ( 2 ) , f 1 => opcode ( 1 ) , f 0 => opcode ( 0 ) , W => Bool_temp ); aritm_port : a r i t m p o r t map ( A => A, B => B, z e r o => opcode ( 1 ) ,m => opcode ( 3 ) , c => opcode ( 0 ) , i n v e r t => opcode ( 2 ) , Z => Aritm_temp ); ALU_Mux2_port : ALU_Mux2 p o r t map ( Bool_out => Bool_temp , Aritm_out => Aritm_temp , mode => opcode ( 4 ) , ALU_out => W ); end s t r u c t u r a l ;

47

49

51

53

55

57

59

61

63

65

10

1 Esercitazione 1 - ALU

Il blocco ALU_Mux2 viene descritto nel seguente listato.


2

ESERCITAZIONE d e l 21/3/13 d i ASI M u l t i p l e x e r u t i l i z z a t o p e r s e l e z i o n a r e l u s c i t a d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ; e n t i t y ALU_Mux2 i s port ( Aritm_out : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; Bool_out : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; mode : i n s t d _ l o g i c ; ALU_out : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end e n t i t y ; a r c h i t e c t u r e d a t a f l o w o f ALU_Mux2 i s begin ALU_out <= Aritm_out when mode = 1 else Bool_out ; end d a t a f l o w ;

10

12

14

16

18

20

Come test bench dellALU sono stati sommati gli ingressi gi utilizzati nel test bench della parte aritmetica e della logica aggiungengo al codice di selezione il quinto bit per pilotare luscita.
1

ESERCITAZIONE d e l 21/3/13 d i ASI Test Bench d e l l ALU library ieee ; use i e e e . std_logic_1164 . a l l ; u s e i e e e . numeric_std . a l l ;

e n t i t y ALU_tb i s end ALU_tb ; a r c h i t e c t u r e t e s t o f ALU_tb i s 11 component ALU i s p o r t ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; 13 B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; opcode : i n s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; 15 W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); 17 end component ;
9

s i g n a l A_tb , B_tb , W_tb : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s i g n a l code : s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; 21 b e g i n dut : ALU p o r t map ( 23 A => A_tb , B => B_tb , 25 opcode ( 4 ) => code ( 4 ) , opcode ( 3 ) => code ( 3 ) , 27 opcode ( 2 ) => code ( 2 ) , opcode ( 1 ) => code ( 1 ) , 29 opcode ( 0 ) => code ( 0 ) , W => W_tb ) ; 31 s t i m u l u s : p r o c e s s begin
19

11

1 Esercitazione 1 - ALU

33

35

37

39

41

43

45

47

49

51

53

55

57

59

61

63

65

67

69

71

73

75

77

79

81

83

85

87

89

91

A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 00000 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0000 _0000_0000_0000" r e p o r t " e r r o r e in 0" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 00001 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0101 _0000_0000_0000" r e p o r t " e r r o r e i n A NOR B" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 00011 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0101 _0010_0000_1111" r e p o r t " e r r o r e i n 0011 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 00101 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1111 _1100_1111_0000" r e p o r t " e r r o r e i n 0101 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 00110 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1110_1111_1111" r e p o r t " e r r o r e i n A XOR B" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 01010 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 0000 _0011_0000_1111" r e p o r t " e r r o r e i n 1010 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 01100 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1101_1111_0000" r e p o r t " e r r o r e i n 1100 " s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 01110 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1010 _1111_1111_1111" r e p o r t " e r r o r e i n A OR B" s e v e r i t y warning ; A_tb <= b" 0000 _0011_0000_1111" ; B_tb <= b" 1010 _1101_1111_0000" ; code <= " 01111 " ;

12

1 Esercitazione 1 - ALU

93

95

w a i t f o r 10 ns ; a s s e r t W_tb <= b" 1111 _1111_1111_1111" r e p o r t " e r r o r e in 1" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 10000 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 4 2 , 1 6 ) ) r e p o r t " e r r o r e i n A+B" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 10010 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) r e p o r t " e r r o r e i n Z=A" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 10011 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 0 0 , 1 6 ) ) r e p o r t " e r r o r e i n A+1" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 , 1 6 ) ) ; code <= " 10101 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 5 6 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 1 1 , 1 6 ) ) ; code <= " 10101 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 12 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 1 1 , 1 6 ) ) ; code <= " 10110 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 8 , 1 6 ) ) r e p o r t " e r r o r e i n A1" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 5 2 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 3 0 4 , 1 6 ) ) ; code <= " 11000 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 3 , 1 6 ) ) r e p o r t " e r r o r e i n AB"

97

99

101

103

105

107

109

111

113

115

117

119

121

123

125

127

129

131

133

135

137

139

141

143

145

147

149

13

1 Esercitazione 1 - ALU

151

s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 4 3 5 2 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 3 0 4 , 1 6 ) ) ; code <= " 11101 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 3 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 7 5 4 9 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 3 7 7 3 , 1 6 ) ) ; code <= " 11000 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 5 8 6 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; A_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 5888 , 1 6 ) ) ; B_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 2 5 6 0 , 1 6 ) ) ; code <= " 11000 " ; w a i t f o r 10 ns ; a s s e r t W_tb <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 230 , 1 6 ) ) r e p o r t " e r r o r e i n AB" s e v e r i t y warning ; wait ; end p r o c e s s ; end t e s t ;

153

155

157

159

161

163

165

167

169

171

173

175

177

179

Per ulteriore verica stata simulato lALU che, come previsto, non ha riscontrato errori di nessun tipo, come mostrato in gura.

Figura 1.7: Risultati della simulazione dellALU.

In SimVision possibile visualizzare in forma schematica i blocchi realizzati. In questa maniera sono ben distinguibili tutti i blocchi utlizzati nella descrizione gerarchica dellALU.

Figura 1.8: Schema a blocchi dellALU.

14

Capitolo 2 Esercitazione 2 - Sintesi dellALU


Si passati successivamente a sintetizzare la ALU. Per procedere a questoperazione, si lancia il sintetizzatore attraverso il comando bgx_shell gui & e si caricano i le VHDL relativi al componente da sintetizzare, procedendo ad una prima sintesi generica:
1

11

#r e a d h d l s p u t s " r e a d i n g HDL" read_vhdl . / h d l /ALU_Mux2.vhd read_vhdl . / h d l /ALU.vhd read_vhdl . / h d l /Bool_Mux4.vhd read_vhdl . / h d l / a r i t m . v h d read_vhdl . / h d l / b o o l . v h d #e l a b o r a t e puts " e l a b o r a t i n g g e n e r i c b u i l d . . . " do_build_generic write_vhdl hier h d l / s y n t h _ g e n e r i c . v h d r e p o r t _ r e s o u r c e s hier > r e p o r t s / r e s o u r c e s _ g e n e r i c . r p t

Salviamo il risultato della sintesi nel le synth_generic.vhd ed analizziamo attraverso questo le i componenti istanziati per realizzare il blocco aritmetico.
170

172

174

176

e n t i t y AWDP_MULT_1 i s port ( Prod : out s t d _ l o g i c _ v e c t o r ( 3 1 downto 0 ) ; A: i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end e n t i t y AWDP_MULT_1;

In questa particolare sintesi il sintetizzatore non ha utilizzato segnali unconnected. In linea di principio dovrebbero presenti 31 segnali nominati UNCONNECTED_0xx: 16 di questi sono i bit meno signicativi tralasciati in uscita dal moltiplicatore, mentre gli altri 15 sono i bit sempre nulli associati al riporto c in modo da avere un carry su 16 bit. In seguito si procede a caricare nel sintetizzatore la libreria di celle standard attraverso lo script cong.tcl:
4

#F l u s s o c o m p a t i b i l e con Synopsys set_flow_compatible_mode on p u t s " Reading L i b r a r y . . . " s e t nangate_dir /home/ c a d u s e r /NCSUFreePDK451.3/ nangate / NangateOpenCellLibrary_PDKv1_3_v2009_07 / l i b e r t y r e a d _ d o t l i b min $nangate_dir / N a n g a t e O p e n C e l l L i b r a r y _ f a s t _ c o n d i t i o n a l _ c c s . l i b max $nangate_dir / NangateOpenCellLibrary_typical_conditional_ccs.lib #I m p o s t a z i o n e a n a l i s i Timing

15

2 Esercitazione 2 - Sintesi dellALU

10

12

s e t _ g l o b a l pvt_early_path min s e t _ g l o b a l pvt_late_path max s e t _ g l o b a l t i m i n g _ a n a l y s i s _ t y p e bc_wc

2.1

Ottimizzazione

Ottimizziamo in seguito il circuito con il comando do_optimize eort high e visualizziamo le celle utilizzate con il comando report_area hier cells:
+-------------------------------------------------------------+ | Block report for module alu | Current | Cumulative | | | Module | | |--------------------------------------+---------+------------| | Number of combinational instances | 0 | 1050 | | Number of noncombinational instances | 0 | 0 | | Number of hierarchical instances | 3 | 21 | | Number of blackbox instances | 0 | 0 | | Total number of instances | 3 | 1071 | | Area of combinational cells | 0.00 | 1348.35 | | Area of non-combinational cells | 0.00 | 0.00 | | Total cell area | 0.00 | 1348.35 | | Number of nets | 85 | 1162 | | Area of nets | 0.00 | 0.00 | | Total area | 0.00 | 1348.35 | +-------------------------------------------------------------+ +-------------------------------------------------------------+ | Block report for module aritm | Current | Cumulative | | | Module | | |--------------------------------------+---------+------------| | Number of combinational instances | 51 | 986 | | Number of noncombinational instances | 0 | 0 | | Number of hierarchical instances | 2 | 2 | | Number of blackbox instances | 0 | 0 | | Total number of instances | 53 | 988 | | Area of combinational cells | 65.97 | 1229.19 | | Area of non-combinational cells | 0.00 | 0.00 | | Total cell area | 65.97 | 1229.19 | | Number of nets | 119 | 1097 | | Area of nets | 0.00 | 0.00 | | Total area | 65.97 | 1229.19 | +-------------------------------------------------------------+ +-------------------------------------------------------------+ | Block report for module | Current | Cumulative | | AWDP_MULT_1 | Module | | |--------------------------------------+---------+------------| | Number of combinational instances | 864 | 864 | | Number of noncombinational instances | 0 | 0 | | Number of hierarchical instances | 0 | 0 | | Number of blackbox instances | 0 | 0 | | Total number of instances | 864 | 864 | | Area of combinational cells | 1079.43 | 1079.43 | | Area of non-combinational cells | 0.00 | 0.00 | | Total cell area | 1079.43 | 1079.43 | | Number of nets | 956 | 956 | | Area of nets | 0.00 | 0.00 | | Total area | 1079.43 | 1079.43 | +-------------------------------------------------------------+

16

2 Esercitazione 2 - Sintesi dellALU

Il blocco che occupa pi area , come potevamo attenderci, il blocco aritm: occupa 1229.19m2 su 1348.35m2 totali (il moltiplicatore occupa l87.8% dellarea utilizzata da aritm). La cella standard pi utilizzata la AOI22_X2, ne vengono istanziate 320 per la realizzazione del moltiplicatore. La maggior parte delle celle standard utilizzate comunque utilizzata per la realizzazione del moltiplicatore. Sono utilizzate anche molte celle MUX2_X1 per la realizzazione dei multiplexer allinterno del progetto. Andiamo adesso a fare una prima analisi dei ritardi senza modicare la sintesi (in seguito ottimizzeremo la sintesi per avere una minore occupazione darea o una velocit maggiore). Utilizziamo il comando report_timing late unconstrained per ottenere lanalisi sul ritardo massimo del circuito:
+---------------------+--------------------------------------------------------------+ | Module | alu | | Timing | LATE | | Slew Propagation | WORST | | Operating Condition | typical | | PVT Mode | max | | Tree Type | balanced | | Process | 1.00 | | Voltage | 1.10 | | Temperature | 25.00 | | time unit | 1.00 ns | | capacitance unit | 1.00 pF | | resistance unit | 1.00 kOhm | +------------------------------------------------------------------------------------+ Path 1:Endpoint: W[14] (v) Beginpoint: B[1] (v) (unconstrained input) Clock Rise Edge 0.00 + Input Delay 0.00 = Beginpoint Arrival Time 0.00 +-------------------------------------------------------------------------+ | Instance | Arc | Cell | Delay | Arrival | | | | | | Time | |-----------------------+-----------------+-------------+-------+---------| | | B[1] v | | | 0.00 | | aritm_port | B[1] v | aritm | | 0.00 | | aritm_port/i_5 | B[1] v | AWDP_MULT_1 | | 0.00 | | aritm_port/i_5/i_417 | B v -> ZN ^ | XNOR2_X2 | 0.26 | 0.26 | | aritm_port/i_5/i_426 | A ^ -> ZN v | INV_X4 | 0.09 | 0.35 | | aritm_port/i_5/i_439 | A1 v -> ZN ^ | AOI22_X2 | 0.09 | 0.44 | | aritm_port/i_5/i_440 | A ^ -> ZN v | INV_X4 | 0.01 | 0.46 | | aritm_port/i_5/i_441 | A1 v -> ZN ^ | AOI22_X2 | 0.06 | 0.51 | | aritm_port/i_5/i_199 | A ^ -> S v | FA_X1 | 0.14 | 0.65 | | aritm_port/i_5/i_200 | CI v -> S ^ | FA_X1 | 0.16 | 0.82 | | aritm_port/i_5/i_1139 | A ^ -> Z ^ | XOR2_X2 | 0.09 | 0.91 | | aritm_port/i_5/i_1141 | A ^ -> ZN v | INV_X4 | 0.01 | 0.92 | | aritm_port/i_5/i_1142 | A1 v -> ZN ^ | AOI22_X2 | 0.04 | 0.96 | | aritm_port/i_5/i_1147 | A2 ^ -> ZN v | AOI22_X2 | 0.03 | 0.99 | | aritm_port/i_5/i_1151 | B2 v -> ZN ^ | AOI22_X2 | 0.07 | 1.06 | | aritm_port/i_5/i_1156 | A2 ^ -> ZN v | AOI22_X2 | 0.03 | 1.09 | | aritm_port/i_5/i_1160 | B2 v -> ZN ^ | AOI22_X2 | 0.07 | 1.16 | | aritm_port/i_5/i_1165 | A2 ^ -> ZN v | AOI22_X2 | 0.03 | 1.19 | | aritm_port/i_5/i_1169 | B2 v -> ZN ^ | AOI22_X2 | 0.07 | 1.26 | | aritm_port/i_5/i_1174 | A2 ^ -> ZN v | AOI22_X2 | 0.03 | 1.29 | | aritm_port/i_5/i_1178 | B2 v -> ZN ^ | AOI22_X2 | 0.07 | 1.36 | | aritm_port/i_5/i_1183 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 1.40 | | aritm_port/i_5/i_1187 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 1.49 | | aritm_port/i_5/i_1192 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 1.53 |

17

2 Esercitazione 2 - Sintesi dellALU

| aritm_port/i_5/i_1196 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 1.62 | | aritm_port/i_5/i_1201 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 1.66 | | aritm_port/i_5/i_1205 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 1.75 | | aritm_port/i_5/i_1210 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 1.79 | | aritm_port/i_5/i_1214 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 1.88 | | aritm_port/i_5/i_1219 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 1.92 | | aritm_port/i_5/i_1223 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 2.01 | | aritm_port/i_5/i_1228 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 2.05 | | aritm_port/i_5/i_1232 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 2.14 | | aritm_port/i_5/i_1237 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 2.18 | | aritm_port/i_5/i_1241 | B2 v -> ZN ^ | AOI22_X2 | 0.09 | 2.27 | | aritm_port/i_5/i_1246 | A2 ^ -> ZN v | AOI22_X2 | 0.04 | 2.31 | | aritm_port/i_5/i_1248 | B v -> Z v | XOR2_X2 | 0.09 | 2.40 | | aritm_port/i_5 | Prod[30] v | AWDP_MULT_1 | | 2.40 | | aritm_port/i_14 | B v -> Z v | MUX2_X1 | 0.11 | 2.51 | | aritm_port | Z[14] v | aritm | | 2.51 | | ALU_Mux2_port | Aritm_out[14] v | ALU_Mux2 | | 2.51 | | ALU_Mux2_port/i_14 | B v -> Z v | MUX2_X1 | 0.11 | 2.62 | | ALU_Mux2_port | ALU_out[14] v | ALU_Mux2 | | 2.62 | | | W[14] v | | 0.00 | 2.62 | +-------------------------------------------------------------------------+

Il ritardo massimo presente su Bv > ZN ed pari a 260ps. Viene coinvolta una cella XNOR2_X2. Dualmente possibile valutare il ritardo minimo con il comando report_timing early unconstrained. In seguito si procede ad imporre i vincoli temporali richiesti dal circuito. Attraverso dei comandi possibile impostare questi vincoli:
2

# Removes o l d c o n s t r a i n t s r e m o v e _ a s s e r t i o n s [ f i n d ports ] # Clock d e f i n i t i o n c r e a t e _ c l o c k period $ p e r i o d name my_clk # Input and output L o g i c d e l a y set_input_delay clock my_clk max $in_delay [ a l l _ i n p u t s ] set_output_delay clock my_clk max $out_delay [ a l l _ o u t p u t s ] # Input s i g n a l R i s i n g time [ ns ] set_input_transition $inp_trans [ a l l _ i n p u t s ] # S e t l o a d on output p i n s s e t _ l o a d $cap_load [ a l l _ o u t p u t s ] # FLOW 1 : normal t i m i n g a n a l y s i s

10

12

14

16

18

20

report_timing late > r e p o r t s / standard_timing_late.rpt report_timing late > r e p o r t s / standard_timing_early.rpt

Andiamo a fare una timing analysis dei ritardi massimi dopo aver impostato la variabile period a 5ns:
Path 1: MET External Delay Assertion Endpoint: W[14] (v) checked with leading edge of my_clk

18

2 Esercitazione 2 - Sintesi dellALU

Beginpoint: B[1] (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - External Delay 0.15 + Phase Shift 5.00 = Required Time 4.85 - Arrival Time 2.82 = Slack Time 2.03

Il vincolo sullo slack vericato. Andiamo adesso a modicare gli altri parametri. Triplichiamo il parametro set_input_transition, avviamo una nuova sintesi ed una nuova timing analysis.
Path 1: MET External Delay Assertion Endpoint: W[14] (v) checked with leading edge of my_clk Beginpoint: B[1] (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - External Delay 0.15 + Phase Shift 5.00 = Required Time 4.85 - Arrival Time 2.86 = Slack Time 1.99 Clock Rise Edge 0.00 + Input Delay 0.10 = Beginpoint Arrival Time 0.10

E possibile notare come aumentano, ovviamente, i tempi darrivo dei segnali; ci peggiora la condizione sullo slack. Riportiamo il parametro set_input_transition al valore di default e decuplichiamo la capacit duscita (cap_load). Avviamo una nuova sintesi e la successiva timing analysis:
Path 1: MET External Delay Assertion Endpoint: W[15] (^) checked with leading edge of my_clk Beginpoint: B[1] (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - External Delay 0.15 + Phase Shift 5.00 = Required Time 4.85 - Arrival Time 3.78 = Slack Time 1.07 Clock Rise Edge 0.00 + Input Delay 0.10 = Beginpoint Arrival Time 0.10

Anche in questo caso, la modica della capacit duscita peggiora ancor pi sensibilmente i tempi darrivo dei segnali e la condizione sullo slack. Se infatti ponessimo il periodo a 2.5ns avremmo uno slack negativo:
Path 1: VIOLATED External Delay Assertion Endpoint: W[14] (v) checked with leading edge of my_clk Beginpoint: B[1] (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - External Delay 0.15 + Phase Shift 2.50 = Required Time 2.35 - Arrival Time 2.82 = Slack Time -0.47 Clock Rise Edge 0.00 + Input Delay 0.10 = Beginpoint Arrival Time 0.10

19

2 Esercitazione 2 - Sintesi dellALU

Possiamo per ottimizzare il circuito con il comando do_optimize reclaim_maximum_area: in seguito a questa istruzione, infatti, il sintetizzatore utilizzer celle pi grandi per soddisfare i vincoli imposti sul clock. Si ottiene in denitiva:

Path 1: MET External Delay Assertion Endpoint: W[15] (v) checked with leading edge of my_clk Beginpoint: B[0] (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - External Delay 0.15 + Phase Shift 2.50 = Required Time 2.35 - Arrival Time 2.31 = Slack Time 0.04 Clock Rise Edge 0.00 + Input Delay 0.10 = Beginpoint Arrival Time 0.10

Come possibile notare, adesso lo slack time positivo. Si procede adesso ad unanalisi delle prestazioni del circuito al variare del periodo di clock. E possibile notare come il sintetizzatore vari larchitettura di moltiplicatore ed addizionatore al variare delle prestazioni richieste con i vincoli temporali. Per fare ci si utilizza uno script che impone i vincoli richiesti in fase di sintesi e salva i report in apposite cartelle:
1

# Removes o l d c o n s t r a i n t s r e m o v e _ a s s e r t i o n s [ f i n d ports ] # Clock d e f i n i t i o n c r e a t e _ c l o c k period $ p e r i o d name my_clk # Input and output L o g i c d e l a y set_input_delay clock my_clk max $in_delay [ a l l _ i n p u t s ] set_output_delay clock my_clk max $out_delay [ a l l _ o u t p u t s ] # Input s i g n a l R i s i n g time [ ns ] set_input_transition $inp_trans [ a l l _ i n p u t s ] # S e t l o a d on output p i n s s e t _ l o a d $cap_load [ a l l _ o u t p u t s ] # NORMAL FLOW 2 . 5 n s do_optimize reclaim_maximum_area r e p o r t _ r e s o u r c e s hier > r e p o r t s /2 _5ns/ r e s o u r c e s . r p t report_timing late > r e p o r t s /2 _5ns/ t i m i n g _ l a t e . r p t report_area > r e p o r t s /2 _5ns/ a r e a . r p t

11

13

15

17

19

21

Viene eettuata unanalisi iterata per 6 diversi valori del periodo di clock. I risultati ottenuti sono riportati in tabella: 20

2 Esercitazione 2 - Sintesi dellALU

Valore Periodo [ns] 5 2.5 2.2 2.0 1.8 1.6

Slack [ns] 2.03 0.03 0.02 0 0 0

Minimo periodo Area di funzionamento [m2 ] [ns] 2.97 2.47 2.18 2 1.8 1.6 1348.35 1419.38 1386.13 1381.60 1586.69 1699.47

Architettura moltiplicatore ed addizionatore MULT: Ripple/Booth ADDER: Ripple MULT: Ripple/Booth ADDER: Ripple MULT: Cla/Booth ADDER: Ripple MULT: Cla/Booth ADDER: Ripple MULT: Fcla/Booth ADDER: Ripple MULT: Fcla/Booth ADDER: Cla

Lintero usso di sintesi stato richiamato mediante un unico script. Tale script come richiesto stato rinominato ow.tcl ed il contenuto mostrato di seguito.
p u t s " S c r i p t made by F e d e r i c o I a c c a r i n o & A l e s s i o S e l l a r o l i , ASI, c 2013 "
2

# FLOW 0
4

10

12

source s c r i p t / c o n f i g . t c l source s c r i p t / read_hdl.tcl source s c r i p t / optimize.tcl set period 5 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 source s c r i p t / constraints_reports_0.tcl # FLOW 1

14

16

18

20

22

24

do_remove_design a l l source s c r i p t / read_hdl.tcl source s c r i p t / optimize.tcl set period 5 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .150 s e t cap_load 0 . 0 1 0 source s c r i p t / constraints_reports_1.tcl # FLOW 2

26

28

30

32

34

do_remove_design a l l source s c r i p t / read_hdl.tcl source s c r i p t / optimize.tcl set period 5 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0

21

2 Esercitazione 2 - Sintesi dellALU

36

s e t inp_trans 0 .050 s e t cap_load 0 . 1 0 0 source s c r i p t / constraints_reports_2.tcl # FLOW 3

38

40

42

44

46

48

50

52

do_remove_design a l l source s c r i p t / read_hdl.tcl source s c r i p t / optimize.tcl set period 2 .5 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 1 0 0 source s c r i p t / constraints_reports_3.tcl do_optimize reclaim_maximum_area r e p o r t _ t i m i n g l a t e > r e p o r t s /10 x l o a d _ t i m i n g _ l a t e _ p o s s l a c k . r p t r e p o r t _ t i m i n g l a t e > r e p o r t s /10 x l o a d _ t i m i n g _ e a r l y _ p o s s l a c k . r p t # FLOW PERIOD = 5 ns [ 1 ] do_remove_design a l l source s c r i p t / read_hdl.tcl set period 5 .0 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /5 _ 0 n s . t c l # FLOW PERIOD = 2 . 5 n s [ 2 ]

54

56

58

60

62

64

66

68

70

72

74

do_remove_design a l l source s c r i p t / read_hdl.tcl set period 2 .5 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /2 _ 5 n s . t c l # FLOW PERIOD = 2 . 2 n s [ 3 ] do_remove_design a l l source s c r i p t / read_hdl.tcl set period 2 .2 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /2 _ 2 n s . t c l # FLOW PERIOD = 2 ns [ 4 ]

76

78

80

82

84

86

88

90

92

do_remove_design a l l source s c r i p t / read_hdl.tcl set period 2 .0 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0

22

2 Esercitazione 2 - Sintesi dellALU

94

96

s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /2 _ 0 n s . t c l # FLOW PERIOD = 1 . 8 n s [ 5 ] do_remove_design a l l source s c r i p t / read_hdl.tcl set period 1 .8 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /1 _ 8 n s . t c l # FLOW PERIOD = 1 . 6 n s [ 6 ]

98

100

102

104

106

108

110

112

114

116

118

do_remove_design a l l source s c r i p t / read_hdl.tcl set period 1 .6 s e t in_delay 0 . 1 0 0 s e t out_delay 0 . 1 5 0 s e t inp_trans 0 .050 s e t cap_load 0 . 0 1 0 s o u r c e s c r i p t / c o n s t r a i n t s _ r e p o r t s _ 4 /1 _ 6 n s . t c l exit

120

23

Capitolo 3 Esercitazione 3 - Data-path del processore


Il data-path include la ALU sviluppata in precedenza, il registro che contiene il dato in ingresso dalla memoria, laccumulatore che immagazzina il risultato prodotto dalla ALU ed un semplice blocco combinatorio che fornisce unuscita alta qualora il valore dellaccumulatore sia zero.

Figura 3.1: Schema a blocchi del Data-path.

Il data-path stato realizzato attraverso una descrizione strutturale dove sono stati richiamati il blocco della ALU ed altri blocchi che verrano descritti di seguito. La descrizione VHDL del data-path la seguente.
1

D e s c r i z i o n e s t r u t t u r a l e d e l b l o c c o datapath library ieee ; use i e e e . std_logic_1164 . a l l ;

24

3 Esercitazione 3 - Data-path del processore

11

13

e n t i t y datapath i s port ( DataIn : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; opcode : i n s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; r e s e t , LoadData , LoadAcc , c l k : i n s t d _ l o g i c ; z : out s t d _ l o g i c ; C, DataOut : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end e n t i t y ; a r c h i t e c t u r e s t r u c t u r a l o f datapath i s s i g n a l InputB_alu : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s i g n a l Output_accum : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s i g n a l Output_alu : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; component d a t a _ s i n c r o port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; r e s e t , Load , c l k : i n s t d _ l o g i c ; Z : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ; component z e r o _ d e t e c t o r port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; z : out s t d _ l o g i c ); end component ; component a l u port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; opcode : i n s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; W : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ; begin

15

17

19

21

23

25

27

29

31

33

35

37

39

41

43

45

47

49

data : d a t a _ s i n c r o p o r t map ( A => DataIn , r e s e t => r e s e t , Load => LoadData , c l k => c l k , Z => InputB_alu ); alu_map : a l u p o r t map ( A => Output_accum , B => InputB_alu , opcode => opcode , W => Output_alu ); accum : d a t a _ s i n c r o p o r t map ( A => Output_alu , r e s e t => r e s e t , Load => LoadAcc , c l k => c l k , Z => Output_accum ); zero : zero_detector p o r t map(

51

53

55

57

59

61

25

3 Esercitazione 3 - Data-path del processore

63

A => Output_accum , z => z ); C <= InputB_alu ; DataOut <= Output_accum ; end s t r u c t u r a l ;

65

67

69

Per realizzare il blocco Data e il blocco accum stato utilizzato lo stesso componente di nome data_sincro. Di seguito sono mostrati le descrizioni del blocco data_sincro e zero_detector.
2

D e s c r i z i o n e d e l b l o c c o Data e Accum Se i l s e g n a l e Load a l t o => B<=A s u l f r o n t e d i s a l i t a d e l c l o c k a l t r i m e n t i B non v i e n e m o d i f i c a t o p e r r e s e t a l t o B <= b "0000 _0000_0000_0000" library ieee ; use i e e e . std_logic_1164 . a l l ; e n t i t y data_sincro i s port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; r e s e t , Load , c l k : i n s t d _ l o g i c ; Z : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end e n t i t y ; a r c h i t e c t u r e behavorial of data_sincro i s begin data : p r o c e s s ( c l k ) begin i f r i s i n g _ e d g e ( c l k ) then i f ( r e s e t = 1 ) then Z <= ( o t h e r s => 0 ) ; else i f ( Load = 1 ) then Z <= A; end i f ; end i f ; end i f ; end p r o c e s s ; end b e h a v o r i a l ; D e s c r i z i o n e d e l b l o c c o z e r o s e A = b "0000 _0000_0000_0000" a l l o r a z = 1 library ieee ; use i e e e . std_logic_1164 . a l l ; entity zero_detector i s port ( A : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; z : out s t d _ l o g i c ); end e n t i t y ; a r c h i t e c t u r e dataflow of zero_detector i s begin z <= 1 when A = b" 0000 _0000_0000_0000" e l s e

10

12

14

16

18

20

22

24

26

28

10

12

14

26

3 Esercitazione 3 - Data-path del processore

16

0 ; end d a t a f l o w ;

Nellesercitazione stato richiesto di realizzare un test bench cos strutturato: Dapprima si eettua il reset dei registri. In seguito, porre il valore 9 (decimale) su DataIn e settare i segnali di controllo per trasferirlo nel registro data. Porre il codice operativo in modalit decremento ed eettuare alcuni cicli di clock con LoadAcc=1. Dovremo vedere il valore dellaccumulatore decrescere progressivamente; quando raggiunger lo zero il segnale z dovr alzarsi. Inne realizzare una moltiplicazione, per esercitare anche questo blocco interno dellALU. Il test bench realizzato ha implementato tutte le speciche richieste come si pu vericare di seguito.
2

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

tb_datapath . vhd library ieee ; u s e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; u s e i e e e . numeric_std . a l l ; e n t i t y tb_datapath i s end e n t i t y tb_datapath ; a r c h i t e c t u r e t e s t o f tb_datapath i s component datapath i s port ( DataIn : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; opcode : i n s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; r e s e t , LoadData , LoadAcc , c l k : i n s t d _ l o g i c ; z : out s t d _ l o g i c ; C, DataOut : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ); end component ; s i g n a l mDataIn , mC, mDataOut : s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s i g n a l mopcode : s t d _ l o g i c _ v e c t o r ( 4 downto 0 ) ; s i g n a l mreset , mLoadData , mLoadAcc , mz : s t d _ l o g i c ; s i g n a l mclk : s t d _ l o g i c := 0 ; c o n s t a n t p e r i o d : time := 10 ns ; c o n s t a n t maxSimTime : time := 25 p e r i o d ; begin dut : datapath p o r t map( DataIn => mDataIn , opcode => mopcode , r e s e t => mreset , LoadData => mLoadData , LoadAcc => mLoadAcc , c l k => mclk , z => mz , C => mC, DataOut => mDataOut ) ; clocking : process begin wait f o r period /2; mclk <= not mclk ; i f now > maxSimTime then w a i t ; f o r e v e r end i f ; end p r o c e s s c l o c k i n g ; stimoli : process begin m r e s e t <= 1 ; mLoadData <= 0 ;

40

42

27

3 Esercitazione 3 - Data-path del processore

44

46

mLoadAcc <= 0 ; mopcode <= ( o t h e r s => 0 ) ; mDataIn <= ( o t h e r s => 0 ) ; w a i t f o r p e r i o d ; e f f e t t u o i l r e s e t d e f i n i r e i s e g n a l i d i c o n t r o l l o e c a r i c a r e i l r e g i s t r o Data con i l v a l o r e 9 ( d e c i m a l e ) m r e s e t <= 0 ; mLoadData <= 1 ; mDataIn <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 9 , 1 6 ) ) ; wait f o r period ; D e f i n i r e i l c o d i c e o p e r a t i v o p e r t r a s f e r i r e Data n e l l a c c u m u l a t o r e mLoadData <= 0 ; mLoadAcc <= 1 ; mopCode <= " 01100 " ; wait f o r period ; i l contenuto del r e g i s t r o

48

50

52

54

56

58

60

62

64

66

68

70

d e f i n i s c o i l c o d i c e o p e r a t i v o p e r i l decremento ed a s p e t t a r e p e r 12 c i c l i di clock mopCode <= " 10110 " ; w a i t f o r 12 p e r i o d ; c a r i c o i l r e g i s t r o Data con un nuovo v a l o r e mLoadData <= 1 ; mLoadAcc <= 0 ; mDataIn <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 7 5 4 9 , 1 6 ) ) ; wait f o r period ; m o l t i p l i c a z i o n e c a r i c o i l r e g i s t r o Data con un nuovo v a l o r e mLoadAcc <= 1 ; mLoadData <= 1 ; mopCode <= " 01100 " ; mDataIn <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d ( 1 3 7 7 3 , 1 6 ) ) ; wait f o r period ; b l o c c o i l r e g i s t r o data ed e f f e t t u o l a m o l t i p l i c a z i o n e mLoadData <= 0 ; mopCode <= " 11000 " ; Primo r i s u l t a t o a t t e s o : 1586 i n d e c i m a l e w a i t ; f o r e v e r end p r o c e s s s t i m o l i ; end a r c h i t e c t u r e t e s t ;

72

74

76

78

80

82

84

86

Il data-path cos realizzato stato simulato in SimVision e i risultati sono stati vericati controllando landamento dei segnali nella nestra waveform sotto riportata. Dalla verica possibile aermare che i risultati coincidono con quelli attesi. 28

3 Esercitazione 3 - Data-path del processore

Figura 3.2: Risultati della simulazione del data-path.

3.1

Sintesi del Data-path

Si procede dunque alla sintesi del datapath, in particolare stato richiesto, impostato il periodo del clock pari a 2.5 ns, di vericare che sia rispettato il vincolo di setup e di hold.

3.1.1

Tempo di Setup

Il vincolo sul tempo di setup pu essere vericato attraverso il comando report_timing late -unconstrained. Il modello di timing considerato dal sintetizzatore riportato nella gura seguente:

Figura 3.3: Modello di timing per il vincolo di setup.

Nel nostro caso tra il registro Data e gli ingressi non c logica, e quindi essendo ritardo max in_to_reg nullo, il max imput delay non sar critico. In uscita il ritardo max reg_to_out si riferisce al semplice blocco zero detector, di conseguenza, sicuramente, non sar un ritardo incisivo sul vincolo. Da queste riessioni, si pu dedurre che il limite sul tempo di setup e quindi sulla frequenza di clock, dato dal ritardo max reg_to_reg, cio dal cammino critico tra il registro Data e il registro Accum che coincide con il cammino critico della ALU. Questa conclusione confermata dal seguente report. 29

3 Esercitazione 3 - Data-path del processore

+--------------------------------------------+ | Report | report_timing | |---------------------+----------------------| | Options | -late > late.rpt | +---------------------+----------------------+ | Date | 20130509.162424 | | Tool | bgx_shell64 | | Release | v5.16-s014 | | Version | Jan 27 2006 09:26:29 | +---------------------+----------------------+ | Module | datapath | | Timing | LATE | | Slew Propagation | WORST | | Operating Condition | typical | | PVT Mode | max | | Tree Type | balanced | | Process | 1.00 | | Voltage | 1.10 | | Temperature | 25.00 | | time unit | 1.00 ns | | capacitance unit | 1.00 pF | | resistance unit | 1.00 kOhm | +--------------------------------------------+ Path 1: MET Setup Check with Pin accum/Z_reg_3/CK Endpoint: accum/Z_reg_3/D (v) checked with leading edge of my_clk Beginpoint: data/Z_reg_5/Q (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - Setup 0.03 + Phase Shift 2.50 - Uncertainty 0.10 = Required Time 2.37 - Arrival Time 2.31 = Slack Time 0.06 Clock Rise Edge 0.00 = Beginpoint Arrival Time 0.00

In tale report possibile vericare, osservando che lo Slack positivo, che il tempo di setup rispettato. Il cammino critico, come stato ipotizzato in precedenza, appartiene alla logica reg_to_reg e quindi alla ALU. Le voci Beginpoint e Endpoint indicano, rispettivamente, linizio e la ne del cammino critico; nel nostro caso tale cammino va dallundicesimo bit in uscita dal registro Data allundicesimo bit in uscita dal registro Accumulatore.

3.1.2

Tempo di Hold

Il vincolo sul tempo di hold pu essere vericato attraverso il comando report_timing early -unconstrained. Il modello di timing considerato dal sintetizzatore riportato nella gura seguente: 30

3 Esercitazione 3 - Data-path del processore

Figura 3.4: Modello di timing per il vincolo di hold.

Nel nostro circuito, probabilmente, il ritardo min reg_to_reg, quindi il cammino critico per il tempo di hold nella ALU, non sar il fattore limitante sul vincolo del tempo di hold. I ritardi che possono violare tale vincolo, saranno i ritardo min in_to_reg e ritardo min reg_to_out. Tale tesi confermata dal seguente report.
+--------------------------------------------+ | Report | report_timing | |---------------------+----------------------| | Options | -early > early.rpt | +---------------------+----------------------+ | Date | 20130509.162424 | | Tool | bgx_shell64 | | Release | v5.16-s014 | | Version | Jan 27 2006 09:26:29 | +---------------------+----------------------+ | Module | datapath | | Timing | EARLY | | Slew Propagation | WORST | | Operating Condition | fast | | PVT Mode | min | | Tree Type | balanced | | Process | 1.00 | | Voltage | 1.25 | | Temperature | 0.00 | | time unit | 1.00 ns | | capacitance unit | 1.00 pF | | resistance unit | 1.00 kOhm | +--------------------------------------------+ Path 1: MET Hold Check with Pin data/Z_reg_0/CK Endpoint: data/Z_reg_0/D (^) checked with leading edge of my_clk Beginpoint: data/Z_reg_0/Q (^) triggered by leading edge of my_clk Other End Arrival Time 0.00 + Hold 0.03 + Phase Shift 0.00 + Uncertainty 0.10 = Required Time 0.13 Arrival Time 0.19 Slack Time 0.06 Clock Rise Edge 0.00 = Beginpoint Arrival Time 0.00

31

3 Esercitazione 3 - Data-path del processore

Come possibile notare il vincolo sul tempo di hold rispettato, e il cammino critico coincide con il ritardo minimo introdotto dal registro Data. Il tempo di hold pari a 30ps e laver posto nello script set_input_delay -clock my_clk -min 0.200 [all_inputs] ci ha restituito un Arrival Time pari a 0.19ns e di conseguenza uno slack positivo. Nel caso avessimo posto un ritardo minimo ai segnali dingresso minore dei 30ps si avrebbe avuto una violazione sul vincolo del tempo di hold; in tal caso le strade da percorrere sarebbero state due: Lutilizzo di celle pi piccole e quindi pi lente. Lintroduzione di buer ttizi. In entrambi i casi lobiettivo aumentare il minimo ritardo del sistema combinatorio. Tali tecniche possono essere implementate attraverso, rispettivamente, i comandi do_x_hold -resize e do_x_hold -buer.

3.1.3

Eetto della non-idealit del clock

Di notevole interesse il comportamento del circuito quando vengono introdotti fenomeni (jitter, skew) che no ad ora non erano portati in conto. Per avvicinare il segnale di clock al caso reale si introduce unincertezza sui fronti di clock attraverso il comando set_clock_uncertainty. Nel nostro script stato posto un incertezza pari a 0.1ns che ha comportato una variazione sui vincoli dei tempi di setup e di hold come mostrato dai seguenti report.
+--------------------------------------------------------------------------+ | Report | report_timing | |---------------------+----------------------------------------------------| | Options | -late > reports/2_5/standard_timing_late_clock.rpt | +---------------------+----------------------------------------------------+ | Date | 20130418.154056 | | Tool | bgx_shell64 | | Release | v5.16-s014 | | Version | Jan 27 2006 09:26:29 | +---------------------+----------------------------------------------------+ | Module | datapath | | Timing | LATE | | Slew Propagation | WORST | | Operating Condition | typical | | PVT Mode | max | | Tree Type | balanced | | Process | 1.00 | | Voltage | 1.10 | | Temperature | 25.00 | | time unit | 1.00 ns | | capacitance unit | 1.00 pF | | resistance unit | 1.00 kOhm | +--------------------------------------------------------------------------+ Path 1: MET Setup Check with Pin accum/Z_reg_14/CK Endpoint: accum/Z_reg_14/D (v) checked with leading edge of my_clk Beginpoint: data/Z_reg_7/Q (v) triggered by leading edge of my_clk Other End Arrival Time 0.00 - Setup 0.03 + Phase Shift 2.50 - Uncertainty 0.10 = Required Time 2.37 - Arrival Time 2.37 = Slack Time 0.00 Clock Rise Edge 0.00

32

3 Esercitazione 3 - Data-path del processore

= Beginpoint Arrival Time

0.00

+----------------------------------------------------------------------------+ | Report | report_timing | |---------------------+------------------------------------------------------| | Options | -early > reports/2_5/standard_timing_early_clock.rpt | +---------------------+------------------------------------------------------+ | Date | 20130418.154056 | | Tool | bgx_shell64 | | Release | v5.16-s014 | | Version | Jan 27 2006 09:26:29 | +---------------------+------------------------------------------------------+ | Module | datapath | | Timing | EARLY | | Slew Propagation | WORST | | Operating Condition | fast | | PVT Mode | min | | Tree Type | balanced | | Process | 1.00 | | Voltage | 1.25 | | Temperature | 0.00 | | time unit | 1.00 ns | | capacitance unit | 1.00 pF | | resistance unit | 1.00 kOhm | +----------------------------------------------------------------------------+ Path 1: MET Hold Check with Pin data/Z_reg_0/CK Endpoint: data/Z_reg_0/D (^) checked with leading edge of my_clk Beginpoint: data/Z_reg_0/Q (^) triggered by leading edge of my_clk Other End Arrival Time 0.00 + Hold 0.03 + Phase Shift 0.00 + Uncertainty 0.10 = Required Time 0.13 Arrival Time 0.19 Slack Time 0.06 Clock Rise Edge 0.00 = Beginpoint Arrival Time 0.00

Lintroduzione dellincertezza sui fronti di clock ha ridotto lo slack sia sul vincolo di setup che di hold, arrivando a modicare il cammino critico sul primo vincolo; dal primo report possibile vericare che tale cammino va dal settimo bit in uscita dal registro Data al quattordicesimo bit in uscita dal registro Accumulatore.

3.1.4

Simulazione post-layout con annotazione dei ritardi

Per passare alla successiva fase di place & route si necessita della netlist vhdl del circuito sintetizzato e di un le contenente i tempi di salita e di discesa dei segnali in ingresso e in uscita ad ogni porta logica elementare che viene istanziata. Utilizzando il seguente script possibile ricavare tali listati.
1

# write_output.tcl p u t s " w r i t i n g SDF" w r i t e _ v e r i l o g h i e r a r c h i c a l sim / c i r c u i t . v write_vhdl h i e r a r c h i c a l sim / c i r c u i t . v h d w r i t e _ s d f p r e c i s i o n 4 c e l l t i m i n g a l l edges check_edge sim / c i r c u i t . s d f

33

3 Esercitazione 3 - Data-path del processore

11

13

#o u t p u t s f o r P&R p u t s " w r i t i n g f i l e s f o r P&R" write_verilog hierarchical final_synt.v s e t _ p r o p a g a t e d _ c l o c k [ f i n d port c l k ] #s e t _ c l o c k _ u n c e r t a i n t y 0 . 1 c l k write_sdc s y n t h e s i z e d _ c o n s t . s d c

Questo script crea il le circuit.sdf dove sono presenti le informazioni necessarie per annotare i ritardi del circuito. Allinterno di tale le possibile trovare diverse istanze della stessa cella come mostrato di seguito.
(CELL (CELLTYPE "NOR2_X1") (INSTANCE data/i_16) (DELAY (ABSOLUTE (IOPATH A1 ZN (0.1542: :0.2857) (0.0921: :0.1160)) (IOPATH A2 ZN (0.1565: :0.2953) (0.0955: :0.1201)) ) ) )

(CELL (CELLTYPE "NOR2_X1") (INSTANCE alu_map/aritm_port/i_33) (DELAY (ABSOLUTE (IOPATH A1 ZN (0.1746: :0.3237) (0.1034: :0.1294)) (IOPATH A2 ZN (0.1771: :0.3333) (0.1068: :0.1334)) ) ) )

Le righe IOPATH riportano i ritardi (tempi di salita e tempi di discesa) per i due archi temporali: ingresso A1 => uscita ZN ed A2 => uscita ZN. Si hanno due valori per ognuno dei tempi, che corrispondono ai due casi fast e slow per i quali stata richiesta la valutazione dei ritardi; il caso typical non stato considerato. Si pu notare che per la stessa porta logica istanziata, possibile avere ritardi dierenti; tali ritardi, infatti, sono inuenzati da due indici che sono il tempo di transizione del segnale in ingresso e la capacit di carico.

34

Capitolo 4 Esercitazione 4 - Placement e Routing del Datapath


Per eettuare il placement & routing del datapath utilizzeremo il software SoC Encounter della Cadence. E necessario piazzare sul perimetro del circuito i pin dingresso e duscita del circuito. Grazie al P&R potremo realizzare anche lalbero del clock e lottimizzazione del circuito portando in conto gli eetti parassiti legati alla lunghezza dei collegamenti tra le celle. Si comincia allora col denire la posizione dei pin dingresso e duscita del nostro circuito attraverso un le *.io. Indicheremo, oltre alla posizione sul chip (North-South-East-West), anche il livello di metal utilizzato per i collegamenti (Metal 3-Metal 4).
###################################################### # # # pin_locations.io # # # ###################################################### Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: C[15] N 4 C[14] N 4 C[13] N 4 C[12] N 4 C[11] N 4 C[10] N 4 C[9] N 4 C[8] N 4 C[7] N 4 C[6] N 4 C[5] N 4 C[4] N 4 C[3] N 4 C[2] N 4 C[1] N 4 C[0] N 4 opcode[4] E 3 opcode[3] E 3 opcode[2] E 3 opcode[1] E 3 opcode[0] E 3 DataIn[15] E 3 DataIn[14] E 3 DataIn[13] E 3 DataIn[12] E 3

35

4 Esercitazione 4 - Placement e Routing del Datapath

Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin: Pin:

DataIn[11] E 3 DataIn[10] E 3 DataIn[9] E 3 DataIn[8] E 3 DataOut[15] S 4 DataOut[14] S 4 DataOut[13] S 4 DataOut[12] S 4 DataOut[11] S 4 DataOut[10] S 4 DataOut[9] S 4 DataOut[8] S 4 DataOut[7] S 4 DataOut[6] S 4 DataOut[5] S 4 DataOut[4] S 4 DataOut[3] S 4 DataOut[2] S 4 DataOut[1] S 4 DataOut[0] S 4 DataIn[7] W 3 DataIn[6] W 3 DataIn[5] W 3 DataIn[4] W 3 DataIn[3] W 3 DataIn[2] W 3 DataIn[1] W 3 DataIn[0] W 3 z W 3 LoadData W 3 LoadAcc W 3 clk W 3 reset W 3

In questo modo, stato equilibrato il numero di pin (16 N-S e 13 E-W) e sono state rispettate le speciche richieste nellesercitazione. Si pu adesso cominciare ad utilizzare il programma SoC Encounter. Cominciamo con limportare il le *.conf per caricare la netlist sintetizzata in precedenza ed i constraints imposti nella fase precedente. Nel le .log non vengono visualizzati errori. In seguito si esegue lo script cong.cmd per ssare il nome del progetto, dei terminali di alimentazione ed alcuni identicativi per buer ed invertitori. Viene inoltre eettuata una prima analisi temporale del circuito:
+--------------------+---------+---------+---------+---------+---------+---------+ | Setup mode | all | reg2reg | in2reg | reg2out | in2out | clkgate | +--------------------+---------+---------+---------+---------+---------+---------+ | WNS (ns):| 0.336 | 0.336 | 0.552 | 1.565 | N/A | N/A | | TNS (ns):| 0.000 | 0.000 | 0.000 | 0.000 | N/A | N/A | | Violating Paths:| 0 | 0 | 0 | 0 | N/A | N/A | | All Paths:| 65 | 32 | 32 | 33 | N/A | N/A | +--------------------+---------+---------+---------+---------+---------+---------+

Come possibile notare, non sono presenti Violating Paths. Inoltre lo slack migliore a quello ottenuto in fase di sintesi per lassenza di utilizzo di un wireload model per il 36

4 Esercitazione 4 - Placement e Routing del Datapath

calcolo dei ritardi di interconnessione.

4.1

Floorplan

Si procede nel ssare il oorplan del circuito, indicando le dimensioni geometriche del nostro die e la posizione delle linee di alimentazione. Utilizzeremo un oorplan rettangolare le cui celle standard occuperanno il 60%-65%-70%-75% dello spazio a disposizione. Lasceremo inoltre uno spazio vuoto di 0.95 m lateralmente al core. Lo spazio lasciato vuoto sar utilizzato in seguito durante la fase di ottimizzazione. Le linee di alimentazione saranno verticali, ci saranno 3 coppie di linee VDD-GND, ognuna spessa 0.8 m e distanti tra di loro sempre 0.8 m. Una coppia sar fatta passare per il centro del die, le altre due a 5 m dal bordo destro e sinistro del die.

Figura 4.1: Floorplan del circuito.

4.2

Placement

Attraverso lo script place.cmd possiamo procedere alla fase di placement. Viene anche fatta una ricerca di eventuali errori che, nel nostro caso, non sono presenti.
########################################## # # # Cadence Design Systems, Inc. # # FirstEncounter Placement check file # # # ##########################################

37

4 Esercitazione 4 - Placement e Routing del Datapath

## No violations found ##

Viene anche fatta una nuova analisi dei ritardi, che non presenta slack negativi:
+--------------------+---------+---------+---------+---------+---------+---------+ | Setup mode | all | reg2reg | in2reg | reg2out | in2out | clkgate | +--------------------+---------+---------+---------+---------+---------+---------+ | WNS (ns):| 0.016 | 0.016 | 0.260 | 1.415 | N/A | N/A | | TNS (ns):| 0.000 | 0.000 | 0.000 | 0.000 | N/A | N/A | | Violating Paths:| 0 | 0 | 0 | 0 | N/A | N/A | | All Paths:| 65 | 32 | 32 | 33 | N/A | N/A | +--------------------+---------+---------+---------+---------+---------+---------+

Il tool adesso realizza delle connessioni ttizie (trial route) per stimare esclusivamente le capacit delle interconnessioni. Il circuito apparir in questo modo:

Figura 4.2: Confronto pre e post ottimizzazione.

4.3

In-Place Optimization

Si procede allottimizzazione con lo script ipo.cmd. Si impone come target quello di avere uno slack di 100 ps su tutti i cammini e si rianalizzano tutti i ritardi. E possibile notare come larea del circuito sia rimasta invariata ma sia aumentata la percentuale dutilizzazione, infatti aumentato il numero di celle: 38

4 Esercitazione 4 - Placement e Routing del Datapath

Figura 4.3: Placement del circuito.

Analizziamo adesso il cammino critico nelle fasi di pre-Place, pre-Optimization e post-Optimization:


PRE-PLACE------------------------------------------------Path #: 1 Startpoint: data/Z_reg_5/Q (clocked by my_clk R) Endpoint: accum/Z_reg_3/D (Setup time: 0.029, clocked by my_clk R) Data required time: 2.371 (minus uncertainty: 0.100) Data arrival time: 2.035 Slack: 0.336 PRE-OPTIMIZATION------------------------------------------Path #: 1 Startpoint: accum/Z_reg_9/Q (clocked by my_clk R) Endpoint: accum/Z_reg_9/D (Hold time: 0.025, clocked by my_clk R) Data required time: 0.125 (minus uncertainty: 0.100) Data arrival time: 0.207 Slack: 0.082 POST-OPTIMIZATION-----------------------------------------Path #: 1 Startpoint: data/Z_reg_1/Q (clocked by my_clk R) Endpoint: accum/Z_reg_6/D (Setup time: 0.030, clocked by my_clk R) Data required time: 2.370 (minus uncertainty: 0.100) Data arrival time: 2.167 Slack: 0.203

Come possibile notare, lo slack diminuito dalla fase di pre-Place a quella postOptimization. Inoltre, con la scelta di imporre uno slack di almeno 100 ps su tutti i cammini, evidente come lo slack sul cammino critico, dalla fase di pre-Optimization a quella di post-Optimization, sia aumentato per rispettare i vincoli imposti. Sono inoltre rispettati tutti i vincoli temporali di hold e di setup sui cammini reg2reg. Se cos non fosse stato, non avremmo potuto soddisfare in alcun modo i vincoli di progetto: 39

4 Esercitazione 4 - Placement e Routing del Datapath

*info: Report constrained paths * Path type: max ----------------------------------------------------Path #: 1 Startpoint: data/Z_reg_1/Q (clocked by my_clk R) Endpoint: accum/Z_reg_6/D (Setup time: 0.030, clocked by my_clk R) Data required time: 2.370 (minus uncertainty: 0.100) Data arrival time: 2.167 Slack: 0.203 *info: Report constrained paths * Path type: min ----------------------------------------------------Path #: 1 Startpoint: data/Z_reg_1/Q (clocked by my_clk R) Endpoint: data/Z_reg_1/D (Hold time: 0.025, clocked by my_clk R) Data required time: 0.125 (minus uncertainty: 0.100) Data arrival time: 0.136 Slack: 0.011

4.4

Albero di Clock

Per realizzare lalbero di clock si utilizza lo script cts.cmd ed il le di congurazione clock.cts che contiene i constraints riguardanti la sua realizzazione. Lo skew, a causa della presenza di pochi ip op, molto limitato:

Figura 4.4: Clock Skew del circuito.

E stata fatta anche una nuova analisi dei ritardi che, dopo linserimento dellalbero di clock, risultano praticamente immutati se non per lo skew in2reg che ha avuto un incremento del 54%. Attraverso Encounter possibile anche visualizzare i registri pilotati da un particolare buer: 40

4 Esercitazione 4 - Placement e Routing del Datapath

Figura 4.5: Albero di clock.

I registri con la medesima colorazione sono caratterizzati dallo stesso skew.

4.5

Routing

Realizziamo il routing con lo script route.cmd. Con questo comando svolgiamo pi compiti: inseriamo delle celle ller negli spazi vuoti, creiamo i collegamenti orizzontali per VDD e GND ed inne procediamo al vero routing. Come possibile notare, nel log sono riportare le lunghezze complessive dei collegamenti per ogni livello di metal:
#Complete Detail Routing. #Total wire length = 15810 um. #Total half perimeter of net bounding box = 14083 um. #Total wire length on LAYER metal1 = 741 um. #Total wire length on LAYER metal2 = 3659 um. #Total wire length on LAYER metal3 = 4990 um. #Total wire length on LAYER metal4 = 2473 um. #Total wire length on LAYER metal5 = 1957 um. #Total wire length on LAYER metal6 = 895 um. #Total wire length on LAYER metal7 = 607 um. #Total wire length on LAYER metal8 = 487 um. #Total wire length on LAYER metal9 = 0 um. #Total wire length on LAYER metal10 = 0 um. #Total number of vias = 12669 #Up-Via Summary (total 12669): # #----------------------# Metal 1 4960 # Metal 2 4596 # Metal 3 1567 # Metal 4 782 # Metal 5 405

41

4 Esercitazione 4 - Placement e Routing del Datapath

# Metal 6 178 # Metal 7 181 #----------------------# 12669 # #Total number of violations = 0

Il livello di metal pi utilizzato il metal 3, utilizzato in fase di progettazione per collegare i pin di I/O North/South del chip.//

4.6

Controllo

E doveroso a questo punto vericare che non ci siano stati errori in tutte queste fasi di sviluppo. Attraverso una funzione di Encounter possibile vericare che non ci siano errori di connessione o che non sia stata violata qualche regola di processo:

Figura 4.6: Verica della geometria del circuito.

4.7

Salvataggio nale

Per porre ne al processo di P&R utilizziamo lo script outputs.cmd in cui viene fatta unultima analisi dei ritardi, viene generata una descrizione di tipo LEF (che permette di istanziare il nostro datapath in un circuito pi grande), una descrizione Liberty e la descrizione GDS (contiene tutti i layer del layout ed il formato principale di rappresentazione del layout dei circuiti integrati). Viene eettuata anche unanalisi (con approccio statistico) della potenza dissipata dal circuito. Con i diversi colori sono messe in evidenza le celle che dissipano pi potenza: 42

4 Esercitazione 4 - Placement e Routing del Datapath

Figura 4.7: Analisi della potenza dissipata.

4.8

Aumento delloccupazione

Adesso analizziamo cosa comporta la modica di un parametro impostato durante la creazione del oorplan, ovvero la percentuale doccupazione. Vogliamo trovare dei parametri per 4 diversi valori di occupazione: [60%;65%,70%,75%]. Per fare ci stato creato uno script chiamato ow.cmd che permette di iterare quanto stato fatto per il completamento della fase di P&R:

source source source source source source source source source source source source

scripts/load_libs.cmd scripts/config.cmd scripts/floor_power_planning.cmd scripts/place.cmd scripts/ipo.cmd scripts/cts.cmd scripts/route1.cmd scripts/route2.cmd scripts/route3.cmd scripts/route4.cmd scripts/analyze.cmd scripts/outputs.cmd

In particolare viene modicato lo script oor_power_planning.cmd per inserire il valore doccupazione. In tabella sono riassunti le principali caratteristiche dei circuiti ottenuti con diversa % di occupazione: 43

4 Esercitazione 4 - Placement e Routing del Datapath

Occupazione Area (%) (m2 x 103 ) 0.6 0.65 0.7 0.75 3,155 2,921 2,719 2,545

Potenza dissipata (mW ) 2,9754 2,9982 3,0476 3,0738

Slack (ns)

Minimo Totale periodo di Albero clock (ns) di clock 0,050 0,183 0,096 0,021 2,450 2,317 2,404 2,479

9,9807 x 102 9,6336 x 102 9,7134 x 102 1,1078 x 101

I dati sono stati estrapolati dai report nal_vdd.power , datapath_postRoute.summary e dal report presente in Encounter:

Figura 4.8: Report di Encounter.

Proviamo adesso ad inserire una percentuale doccupazione troppo grande [90%] anch avvenga un corretto P&R; in questo caso infatti non ci sar spazio suciente per linserimento dellalbero di clock e per i collegamenti. Nel log generato dopo il comando place.cmd indicata la presenza di cammini con slack negativo e che il software non riesce a risolvere:
-----------------------------------------------------------timeDesign Summary -----------------------------------------------------------+--------------------+---------+---------+---------+---------+---------+---------+ | Setup mode | all | reg2reg | in2reg | reg2out | in2out | clkgate | +--------------------+---------+---------+---------+---------+---------+---------+ | WNS (ns):| -0.019 | -0.019 | 0.285 | 1.445 | N/A | N/A | | TNS (ns):| -0.059 | -0.059 | 0.000 | 0.000 | N/A | N/A | | Violating Paths:| 7 | 7 | 0 | 0 | N/A | N/A | | All Paths:| 65 | 32 | 32 | 33 | N/A | N/A | +--------------------+---------+---------+---------+---------+---------+---------+

44

4 Esercitazione 4 - Placement e Routing del Datapath

Figura 4.9: P&R con 90% doccupazione.

Dopo aver ripristinato la percentuale doccupazione al 65% (miglior trade o tra potenza dissipata e slack) ed aver eettuato nuovamente il P&R, si possono individuare i registri per i quali il ritardo sul clock assume il valore minimo e massimo:

Figura 4.10: Cella con ritardo ????????? sul clock.

45

4 Esercitazione 4 - Placement e Routing del Datapath

Figura 4.11: Cella con ritardo ????????? sul clock.

X Primo registro Secondo registro 25,712 5,718

Y 1,673 5,949

46

Capitolo 5 Esercitazione 5 - Simulazione a livello transistor


Nelle esercitazioni precedenti abbiamo visto come simulare circuiti descritti con linguaggi HDL e come stimare le loro prestazioni sulla base di una caratterizzazione di alto livello come quella del formato liberty o del formato SDF. Per avere una stima pi precisa dei ritardi di un circuito e della sua dissipazione di potenza buona norma eettuare una simulazione pi accurata possibile, che modelli il funzionamento dei singoli transistor. Nel caso particolare dei circuiti VLSI la fase di simulazione deve, da un lato, garantire una stima delle prestazioni del circuito sucientemente accurata, dallaltro deve permettere la simulazione di circuiti molto grandi in tempi ragionevoli. Per garantire laccuratezza della simulazione utilizzeremo per i MOSFET una caratterizzazione basata su modello BSIM versione 4. Lacronimo BSIM sta per Berkeley Short-channel IGFET (Insulated Gate FET ) Model. Tale modello stato sviluppato al ne di avere un modello compatto che permetta di portare in conto tutti i fenomeni presenti nei MOSFET con gate sub-micrometrica. Nella cartella tran_models possibile trovare i vari modelli di transistor per il caso nominale, il caso fast ed il caso slow. Nella tabella che segue sono riportati i parametri fondamentali del MOSFET a canale n e p che utilizzeremo. Dispositivo Processo Low eld mobility Eletrical gate equivalent Oxide thickness TOXE Silicon Oxide Dieletric Constant 3.9
0

Longchannel threshold voltage VTH0 [V] k [A/V 2 ] ID,SAT [A]

u0 NMOS_VTL Nominale 0.04359 PMOS_VTL Nominale 0.00432

[m2 /V s] [m]

[F/m]

1.75e 09 34e 12 0.471 1.85e 09 34e 12 0.423

0.423e3 3.35e 4 0.491e3 2.28e 3

La corrente di drain in pinch-o stata calcolta in via analitica, trascurando leetto di modulazione di canale, con Vgs=Vdd=1.1V, L=45nm, W=90nm. Il modello Level1 permette di ricavare la corrente ID con la seguente relazione: ID = Kn (V gs V t)2 47

5 Esercitazione 5 - Simulazione a livello transistor

5.1

Simulazione con Spectre

Il miglior livello di accuratezza si ottiene utilizzando simulatori circuitali che risolvono tutte le equazioni che descrivono il funzionamento dei dispositivi nelle varie regioni di funzionamento. Il pi conosciuto il simulatore denominato SPICE, sviluppato anni addietro presso luniversit di Berkeley. Esistono numerose varianti commerciali di questo simulatore; quella che utilizzeremo in questa esercitazione denominata spectre. Vedremo puoi lutilizzo del simulatore ultrasim, che consente di velocizzare notevolmente i tempi di calcolo, con una certa riduzione della precisione.

5.2

Analisi statica

Attraverso il simulatore SPICE spectre, eettuiamo unanalisi delle caratteristiche DC dei MOSFET, variando sia sulla tensione di Gate sia su quella di Drain. Il risultato poi visualizzato in maniera graca attraverso il software wavescan.

Figura 5.1: Caratteristica NMOS L=45nm W=90nm.

E possibile notare un eetto di modulazione del canale abbastanza accentuato. La corrente perVgs=Vdd=1.1V risulta essere pari a 116,5A. Successivamente stato modicato il listato aggiungendo un nuovo dispositivo con W= 1 ed L= 0.5. Tale dispositivo viene confrontato con quello mostrato in Fig.5.1 di seguito: 48

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.2: NMOS L=45nm W=90nm

NMOS L=0.5m W=1m.

Osservando la zona di pinch-o del nuovo MOS sulla destra, possibile notare un minore eetto di modulazione del canale e di conseguenza un avvicinamento allidealit. Successivamente stato modicato il listato spice per visualizzare la transcaratteristica del dispositivo con Vds costante e Vgs variabile tra 0 e 1.1V che varia con legge quadratica come possibile vedere di seguito.

Figura 5.3: Transcaratteristica del MOS. Vds costante e Vgs variabile tra 0 e 1.1V.

49

5 Esercitazione 5 - Simulazione a livello transistor

A parit di dimensioni e di polarizzazionecon il primo NMOS viene simulato un PMOS:

Figura 5.4: Caratteristica PMOS L=45nm W=90nm.

Il rapporto tra la corrente nel dispositivo N e quella nel dispositivo P, a parit di dimensioni, di circa 2,5.

50

5 Esercitazione 5 - Simulazione a livello transistor

5.3

Leakage

Per valutare la corrente di leakage, cio la corrente che scorre nel dispositivo quando questo in interdizione, stato simulato un dispositivo a canale N con L=45nm e W=90nm, con tensione Vds variabile tra 0V e 1.1V e Vgs=0. Tale simulazione stata rifatta su un dispositivo analogo eccetto per L che viene raddoppiata.

Figura 5.5: Corrente di leakage rispettivamente per L=45nm e L=90nm.

Come possibile vedere per Vgs=0 e Vds=1.1V si passa da un valore di 10,4 nA nel primo caso a 553,0 pA. Successivamente si passati alla simulazione del dispositivo a dierenti temperature, modicando la parte del listato relativa alle temperature: .temp -40 25 125 Cos facendo possibile visualizzare come la temperatura inuenza la corrente di leakage. 51

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.6: Corrente di leakage a dierenti temperature.

In ultima fase nellanalisi statica stata simulato un dispositivo L=45nm e W=90nm con il modello fast.

Figura 5.7: NMOS L=45nm W=90nm modello fast.

Con questo modello le correnti di leakage sono leggermente maggiori a causa della frequenza operativa maggiore. 52

5 Esercitazione 5 - Simulazione a livello transistor

5.4

Analisi Dinamica

Per lanalisi dinamica stato simulato il seguente circuito in cui linvertitore pilota un carico di 5fF:

Figura 5.8: Circuito utilizzato nellanalisi dinamico.

Utilizzando wavescan stato possibile visualizzare landamento dei segnali di ingresso uscita, in modo da poter stimare dai graci i tempi di propagazione del circuito.

Figura 5.9: Andamento dinamico ingresso/uscito.

Utilizzando i comandi di wavescan possibile ricavare i ritardi di propagazione: 53

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.10: tplh e tphl del circuito.

Tramite i ritardi di propagazione possibile calcolare analaticamente le resistenze equivalenti dei dispositivi utilizzando il modello switch- level:

pHL RN,eq = 0.69 = 8.559K CL tpLH RP,eq = 0.69CL = 10.365K

Modicando il listato stato simulato il circuito eettuando uno sweep sulla capacit di carico da 2fF a 20fF. Di seguito viene mostrata la caratteristica ricavata:

Figura 5.11: Variazione dei tempi di propagazione al variare della capacit di carico.

Analogamente sono stati simulati i ritardi del circuito eettuando uno sweep fra 5ps e 50ps dei tempi di salita/discesa dellingresso. 54

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.12: Variazione dei tempi di propagazione al variare dello slew.

5.5

Netlist gerarchiche

Nel listato seguente viene utilizzato la netlist a livello transistor dellinvertitore X1 della libreria di celle standard per realizzare il circuito mostrato in 5.21.

XINV1 in1 XINV2 in2 XINVload1 XINVload2 XINVload3 XINVload4

VSS VDD in2 INV_X1 VSS VDD out2 INV_X1 out2 VSS VDD Ntmp1 INV_X1 out2 VSS VDD Ntmp2 INV_X1 out2 VSS VDD Ntmp3 INV_X1 out2 VSS VDD Ntmp4 INV_X1

Figura 5.13: Circuito in esame.

Ponendo in ingresso una tensione lineare a tratti stata simulata la caratteristica del secondo invertitore. 55

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.14: Andamento ingresso/uscita dellinvertitore in esame.

Con i seguenti ritardi:

Figura 5.15: Ritardi di propagazione dellinvertitore in esame.

possibile calcolare analiticamente i valori dei tempi di propagazione, al ne di ottenere un confronto con i valori ricavati dalla simulazione. Sono pertanto necessari una stima della capacit di carico dellinvertitore e delle resistenze equivalenti dei dispositivi. Per quanto riguarda la capacit di carico, si assume pari alla capacit di gate di un singolo invertitore, moltiplicata per 4. Dal le di libreria INV_X1 possibile estrapolare le dimensioni dei dispositivi impiegati, in particolare: N M OS : W = 90nm L = 45nm P M OS : W = 135nm L = 50nm Inne, tenendo conto dei parametri calcolati in precedenza, ed eettuando il calcolo secondo una simulazione switch-level: COX = 56
OX tOX

5 Esercitazione 5 - Simulazione a livello transistor

CL = 4[(Wp Lp ) COXN + (Wn Ln ) COXN ] = 0.846f F Rn =


Rn W L
W L

= 9.5k

Rp =

Rp W L
W L

= 15.4k

tP HL = 0.69 Rn CL = 5.5ps

tP LH = 0.69 Rp CL = 9ps

Con le approssimazioni eettuate nel modello switch-level si ottengono tempi molto dierenti da quelli ottenuti in simulazione spice. Questo risultato indicativo della scarsa accuratezza del modello analitico utilizzato.

5.6

Tempi di setup e di hold di un registro

Per la valtazione del tempo di setup stato utilizzato un clock con periodo di 1np e tempi di salita /discesa di 10ps inserendo due capacit di 5fF a caricare le uscite Q e Qn. Utilizzati gli stessi tempi di salita /discesa per il segnale D, stato simulato i due segnali facendo precedere il segnale D al clock di un tempo compreso fra 100ps e 0ps.

Figura 5.16: Tempi di setup del ip op.

Se, attraverso una netlist SPICE, si valuta landamento delluscita, e in particolare il ritardo clock to Q Tcq , chiaro che lultima commutazione del dato in uscita corrisponde al segnale in ingresso che commutato nel limite del tempo di setup, mentre non vi commutazione dopo che il segnale commutato. Nella gura seguente viene dimostrato che il tempo di setup pari a 15,7ps. 57

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.17: Valutazione del tempo di setup del ip op.

Allo stesso modo, per valutare il tempo di hold, si fa commutare un segnale dai 50ps prima ai 50ps dopo il fonte di clock. La prima uscita osservata sar quella corrispondente al tempo di hold dei ip op. In particolare, il componente che si sta caratterizzando risulta avere un tempo di hold negativo: anche se il dato commuta prima del fronte del clock, luscita tende lo stesso a portarsi al valore logico alto. Un comportamento simile probabilmente dovuto al fatto che il segnale dato D in ingresso al ip op opportunamente buerizzato e quindi ritardato. Il tempo di hold dunque negativo e risulta essere -8,7ps come mostrato in gura.

Figura 5.18: Valutazione del tempo di hold del ip op.

58

5 Esercitazione 5 - Simulazione a livello transistor

Simulando con spectre e gracando attraverso wavescan landamento del ritardo clock to Q in funzione della distanza tra i fronti di discesa si ottengono i seguenti risultati

Figura 5.19: Variazione uscita in funzione dellistante di commutazione del segnale D in ingresso.

5.7

Simulazione con Ultrasim

Per poter eettuare simulazioni di circuiti contenenti migliaia di transistors, utilizzeremo il simulatore ultrasim, della CADENCE. Ultrasim in grado di simulare sia netlist a livello transistor con sintassi spice e spectre, che netlist realizzate con linguaggi per la descrizione dellhardware di pi alto livello, come verilog e verilogA. Una caratteristica molto utile di ultrasim che esso permette di simulare un circuito scegliendo tra sei dierenti modalit di simulazione cui corrispondono sei diversi livelli di accuratezza. A livelli di accuratezza maggiore corrisponde un maggiore tempo di simulazione. In questo modo il progettista pu simulare circuiti di grandi dimensioni scegliendo il giusto compromesso tra tempi di simulazione ed accuratezza dei risultati. Le sei modalit di simulazione di ultrasim sono illustrati nella seguente gura: 59

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.20: Modalita di simulazione di Ultrasim.

Nella modalit SPICE si ottengono i risultati pi accurati, ma la simulazione pu richiedere tempi molto lunghi. La modalit Analog pensata per applicazioni che richiedono unaccuratezza elevata. Grazie allutilizzo di un modello proprietario per la simulazione dei transistor la CADENCE dichiara, per questa modalit di simulazione, unaccuratezza del 2% rispetto alla modalit SPICE ed una riduzione del tempo di simulazione di un fattore che va da 3 a 10. Le altre modalit di simulazione permettono di ottenere vantaggi via via crescenti in termini di velocit utilizzando tecniche avanzate di partizionamento e modelli semplicati per i transistor. Le modalit di simulazione pi veloci sono la Digital Fast e la Digital Accurate, per le quali la CADENCE dichiara una precisione di calcolo rispettivamente del 10 Modicando il le test_inv.spice, eseguendo la simulazione con ultrasim dopo aver decommentato volta per volta la relativa simulazione in esame, abbiamo calcolato i seguenti ritardi: Simulatore Spectre Ultrasim Spice Ultrasim Mixed signal Ultrasim Digital accurate Ultrasim Digital fast Tphl [ps] 15,00 15,380 14,533 14,366 14,541 Tplh [ps] 23,54 23,707 23,115 23,554 21,635

Inne il simulatore consente di visualizzare attraverso Simvision le forme donda, sia in formato analogico che digitale. interessante notare che nellintervallo di tensioni analogiche comprese tra 0.5V e 0.6V indicato come indenito nel graco delle tensioni digitali. 60

5 Esercitazione 5 - Simulazione a livello transistor

Figura 5.21: Simulazione Digital fast in Simvision.

61

Potrebbero piacerti anche