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