Conception et exploitation des processeurs

Transcription

Conception et exploitation des processeurs
Conception et exploitation des processeurs
Chargé de cours : Frédéric Pétrot
Équipe pédagogique :
Stéphane Mancini, Luc Michel, Olivier Muller,
Christophe Rippert, Sebastien Viardot
Année universitaire 2012-2013
Conception et exploitation des processeurs
Structure du cours
C1
C2
C3
C4
Introduction aux langages d’assemblage
pour les ISA x86_64 et MIPS
Présentation du projet CEP
VHDL
Conventions pour les appels de fonctions
en assembleur x86_64 et MIPS
2 / 23
Conception et exploitation des processeurs
Introduction
Plan
1
Introduction
2
Description structurelle
3
Description comportementale
3 / 23
Conception et exploitation des processeurs
Introduction
Introduction
VHDL : VHDL is a Hardware Description Language
Descriptions synthétisables
structurelles
comportementales
flot de données
séquentielles
Les descriptions peuvent ne pas être réalisables en matériel !
4 / 23
Conception et exploitation des processeurs
Description structurelle
Plan
1
Introduction
2
Description structurelle
3
Description comportementale
5 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle
De base : Déjà vue moult fois
entity BOX is
port(A, B, C : in
std_logic;
D
: out
std_logic);
end BOX;
architecture STRUCTURAL of BOX is
signal S1 : std_logic;
component XOR2
port(I0, I1 : in
std_logic;
O
: out
std_logic);
end component;
component AND2
port(I0, I1 : in
std_logic;
O
: out
std_logic);
end component;
begin
BLOC1 : XOR2
port map(B, A, S1);
BLOC2 : AND2
port map(I0=>C, I1=>S1, O=>D);
end STRUCTURAL;
B
A
D
C
Ou plus aisément :
D <= C and (A xor B);
Mais comment faire simplement la même chose sur n
bits ?
(le couper/coller n’est pas
une option !)
6 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle générique
Déclarations :
entity GBOX is
generic(N: positive range 1 to 16);
port
(A, B, C: in
std_logic_vector(N-1 downto 0);
D
: out
std_logic_vector(N-1 downto 0));
end GBOX;
Généricité
N est un paramètre générique
Doit être fixé lors de l’instanciation du composant
architecture ...
signal X, Y, Z, T: std_logic_vector(11 downto 0);
begin ...
IGBOX : GBOX
generic map (12)
port map(A=>X, B=>Y, C=>Z, D=>T);
...
7 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle générique
Réplication : for ... generate ...
architecture STRUCTURAL of GBOX is
signal S : std_logic_vector(N-1 downto 0);
component XOR2 ... end component;
component AND2 ... end component;
begin
XOB: for I in 0 to N-1 generate
BLOC1 : XOR2
port map(I0=>B(I), I1=>A(I), I2=>S1(I));
BLOC2 : AND2
port map(I0=>C(I), I1=>S(I), O=>D(I));
end generate XOB;
end STRUCTURAL;
for ... generate ...
Déroulement de boucle exécutée lors de la synthèse
Mène à la réplication n fois du corps de boucle
8 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle générique
Additionneur à propagation de retenue :
entity RC_ADDER is
generic(N = 8);
port (A,B : in unsigned(N-1 downto 0);
CI : in std_logic;
SUM : out unsigned(N-1 downto 0);
CO : out std_logic);
end entity;
component FA
port(A, B, CI : in std_logic;
S, C0
: out std_logic);
end component;
architecture STRUCTURAL of RC_ADDER is
signal C : unsigned(N downto 0);
begin
C(0) <= CI;
CO
<= C(N);
RCA: for I in 0 to N-1 generate
ADDER : FA port map(A(I), B(I), C(I), SUM(I), C(I+1));
end generate RCA;
end STRUCTURAL;
9 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle générique
Prise de décisions : if ... generate ...
entity ADDER_OPT is
generic(N);
port (A,B : in unsigned(N-1 downto 0);
CI : in std_logic;
SUM : out unsigned(N-1 downto 0);
CO : out std_logic);
end entity;
component RIPPLE_CARRY_ADDER ...
port (A,B : in unsigned(N-1 downto 0);
CI : in std_logic;
SUM : out unsigned(N-1 downto 0);
CO : out std_logic);
end component;
component CARRY_SAVE_ADDER ...
port (A,B : in unsigned(N-1 downto 0);
CI : in std_logic;
SUM : out unsigned(N-1 downto 0);
CO : out std_logic);
end component;
10 / 23
Conception et exploitation des processeurs
Description structurelle
Description structurelle générique
if ... generate ...
Décision de synthétiser ou non une partie lors de la synthèse
architecture STRUCTURAL of ADDER_OPT is
signal C : unsigned(N downto 0);
begin
RC: if N <= 7 generate
ADDER : RIPPLE_CARRY_ADDER
generic map(N) port map(A, B, C, SUM, C);
end generate RC;
RC: if N > 8 generate
ADDER : CARRY_SAVE_ADDER
generic map(N) port map(A, B, C, SUM, C);
end generate RC;
end STRUCTURAL;
11 / 23
Conception et exploitation des processeurs
Description comportementale
Plan
1
Introduction
2
Description structurelle
3
Description comportementale
12 / 23
Conception et exploitation des processeurs
Description comportementale
Description comportementale
Exprime un comportement séquentiel ou concurrent
Séquentiel
processus, avec liste de sensibilité
process(i0, i1, sel) ...
instructions similaires à celles d’Ada :
instructions conditionnelles : if, case
boucles : loop, for, while
variables internes au processus
x := y; affecte immédiatement y dans x
Concurrent
affectations hors de tout processus :
a <= b xor c;
instructions spécifiques :
sélection combinatoire : with ... select ...,
when ... else ...
13 / 23
Conception et exploitation des processeurs
Description comportementale
Description comportementale
Attention !
Production de matériel lors de la synthèse
ifs produisent des multiplexeurs, cases produisent des
décodeurs, ...
loop, for, while produisent autant d’éléments que
d’itérations de boucles, ...
Si cœur de boucles complexes, alors beaucoup de matériel
14 / 23
Conception et exploitation des processeurs
Description comportementale
Description comportementale
Notion fondamentale : l’assignation notée <=
Assignation dite postée
<= prend effet lorsque tous les membres de droite ont été évalués
a <= b; b <= a échangent les contenus de a et b
Temps de l’évaluation = ∆-cycle
B
A
C
D
D <= C and
peut s’écrire
X <= A xor
D <= C and
ou encore
D <= C and
X <= A xor
(A xor B);
B;
X;
X;
B;
Assignation ré-évaluée si événement sur membre de droite
=> Comportement idem portes logiques
15 / 23
Conception et exploitation des processeurs
Description comportementale
Description comportementale
Notion fondamentale : liste de sensibilité
process(a, b, c, d, ...) :
process ré-évalué si événement sur signal de la liste de sensibilité
Tous signaux lus dans le process
⇒ processus combinatoire
Typique pour fonction de transistion/generation de machines d’états
process(CUR_STATE, A, B, C, D)
begin
case CUR_STATE is
when S0 => if A ... then
NXT_STATE <= S1
else
NXT_STATE <= S2
end if;
when S1 => ...
end case;
end process;
Quelques signaux lus dans le process
⇒ processus mémorisant
entity DFF is ... end DFF;
architecture SEQ of dff is
begin
process(ck)
begin
if rising_edge(ck) then
q <= d
end if;
end process;
end SEQ;
16 / 23
Conception et exploitation des processeurs
Description comportementale
Exemple : MUX 1 parmi 4
Séquentiel
Concurrent
architecture SEQ of MUX is
begin
process(I0, I1, I2, I3, SEL)
begin
case SEL is
when 0 => O <= I0;
when 1 => O <= I1;
when 2 => O <= I2;
when others =>
O <= I3;
end case;
end process;
end SEQ;
architecture CUR of MUX is
begin
with SEL select
O <= I0 when 0,
I1 when 1,
I2 when 2,
I3 when others;
end CUR;
Note : affectation concurrente
≡ process avec membres de
droite dans liste de sensibilité
et affectant membre de gauche
17 / 23
Conception et exploitation des processeurs
Description comportementale
Autres éléments mémorisants
Reset synchrone
entity DFF is ... end DFF;
architecture SEQ of dff is
begin
process(ck)
begin
if rising_edge(ck) then
if reset = ’1’ then
q <= ’0’;
else
q <= d
end if;
end process;
end SEQ;
Reset asynchrone, à éviter, en
particulier sur FPGA
entity DFF is ... end DFF;
architecture SEQ of dff is
begin
process(ck, reset)
begin
if reset = ’1’ then
q <= ’0’;
elsif rising_edge(ck) then
q <= d
end if;
end process;
end SEQ;
Attention !
Vérifiez que les affections de q sont toutes conditionnées par le
même front d’horloge, sinon latches => pas bon !
18 / 23
Conception et exploitation des processeurs
Description comportementale
Types et attributs
Participent à et facilitent la notion de « généricité »
subtype TRIBYTE is std_logic_vector(23 downto 0);
type VIDEO_MEM is array(positive range <>, positive range <>) of TRIBYTE;
variable SCREEN : VIDEO_MEM(1 to 640, 1 to 480);
variable PIXEL : TRIBYTE;
...
PIXEL <= VIDEO_MEM(I, J);
PIXEL’length
PIXEL’left
PIXEL’right
PIXEL’range
:
:
:
:
24
23
0
23 downto 0
SCREEN’range(1)
SCREEN’range(2)
SCREEN’right(1)
SCREEN’left(2)
:
:
:
:
1 to 640
1 to 480
640
1
19 / 23
Conception et exploitation des processeurs
Description comportementale
Fonctions
Fonction : intégrées 1 et évaluées lors de la synthèse
Calcul de l’index du premier bit à 1 d’un mot en partant des poids
forts
library ieee;
use ieee.math_real.all;
function LOP(A: std_logic_vector) return std_logic_vector is
variable R:
std_logic_vector(integer(ceil(log2(real(A’length))))-1 downto 0);
begin
R := R’right;
for I in A’left downto A’right loop
if A(i) = ’1’ then
exit;
end if;
R := R - 1;
end loop;
return R;
end;
20 / 23
Conception et exploitation des processeurs
Description comportementale
Exemple
Décaleur à barillet
Description non synthétisable, ...
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.math_real.all;
use IEEE.numeric_std.all;
Entity barrel_shifter is
generic (n : integer := 32);
port (direc
: in std_logic; -- ’0’ gauche, ’1’ droite
arith
: in std_logic; -- ’0’ logique, ’1’ arithmetique
shamt
: in
-- shift amount
std_logic_vector(integer(ceil(log2(real(n))))-1 downto 0);
input
: in std_logic_vector(31 downto 0);
yield
: out std_logic_vector(31 downto 0));
end entity barrel_shifter;
21 / 23
Conception et exploitation des processeurs
Description comportementale
Exemple
architecture behavior of barrel_shifter is
begin -- behavior
process(direc, arith, input, shamt)
variable shift : integer;
begin
shift := to_integer(unsigned(shamt));
if arith = ’1’ then
-- à droite dans le cas arithmétique
yield <= (n-1 downto n-shift => input(n-1)) & input(n-1 downto shift);
else
if direc = ’1’ then -- à droite
yield <= (n-1 downto n-shift => ’0’) & input(n-1 downto shift);
else
-- à gauche
yield <= input(n-1-shift downto 0) & (shift-1 downto 0 => ’0’);
end if;
end if;
end process;
end architecture behavior; -- of barrel_shifter
22 / 23
Conception et exploitation des processeurs
Description comportementale
Résumé
Langage spécifique
à la production de matériel
avec une sémantique du temps
simulable
synthétisable (sous ensemble que nous utiliserons)
23 / 23