Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Elaborato in
Federico Iaccarino
M61/150
A cura di:
Alessio Sellaroli
M61/177
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 . . .
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
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
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
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.
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.
1.2
Unit logica
La parte logica viene realizzata utilizzando un numero di 16 multiplexer 4/1 pilotati dai segnali A e B.
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
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 ;
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.
1 Esercitazione 1 - 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 ;
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
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
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
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.
In SimVision possibile visualizzare in forma schematica i blocchi realizzati. In questa maniera sono ben distinguibili tutti i blocchi utlizzati nella descrizione gerarchica dellALU.
14
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
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
10
12
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
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
| 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
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
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
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
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
21
36
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
22
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
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
24
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
63
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
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
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.1
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:
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
+--------------------------------------------+ | 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
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
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
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
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
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
33
11
13
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
35
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.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.
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
## 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:
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
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
*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:
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.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
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:
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.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
Occupazione Area (%) (m2 x 103 ) 0.6 0.65 0.7 0.75 3,155 2,921 2,719 2,545
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
I dati sono stati estrapolati dai report nal_vdd.power , datapath_postRoute.summary e dal report presente in 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
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:
45
Y 1,673 5,949
46
[m2 /V s] [m]
[F/m]
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.1
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.
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
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
Il rapporto tra la corrente nel dispositivo N e quella nel dispositivo P, a parit di dimensioni, di circa 2,5.
50
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.
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
In ultima fase nellanalisi statica stata simulato un dispositivo L=45nm e W=90nm con il modello fast.
Con questo modello le correnti di leakage sono leggermente maggiori a causa della frequenza operativa maggiore. 52
5.4
Analisi Dinamica
Per lanalisi dinamica stato simulato il seguente circuito in cui linvertitore pilota un carico di 5fF:
Utilizzando wavescan stato possibile visualizzare landamento dei segnali di ingresso uscita, in modo da poter stimare dai graci i tempi di propagazione del circuito.
Tramite i ritardi di propagazione possibile calcolare analaticamente le resistenze equivalenti dei dispositivi utilizzando il modello switch- level:
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.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.
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
Ponendo in ingresso una tensione lineare a tratti stata simulata la caratteristica del secondo invertitore. 55
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
= 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
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.
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
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.
58
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
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
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
61