source: trunk/IPs/systemC/processor/Morpheo/Documentation/doc/document-morpheo-vhdl_generation/tex/document-morpheo-vhdl_generation-fr.tex @ 95

Last change on this file since 95 was 95, checked in by rosiere, 16 years ago

1) Update Prediction Table - New architecture (systemC) done (and tested) -> need change interface in top level
2) Change documentation on VHDL generation
3) Change VHDL constant (case std_logic and std_logic_vector)

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 16.5 KB
Line 
1%------------------------------------------------------------------------------
2% $Id: document-morpheo-vhdl_generation-fr.tex 95 2008-12-16 16:24:26Z rosiere $
3%------------------------------------------------------------------------------
4
5\SEction{Introduction}
6
7Ce document est une aide pour les développeur des générateurs de modèles VHDL de \cpu.
8Il est décomposé en 6 sections :
9\begin{itemize}
10\item Dans la section \ref{tree}, nous présentons l'arborescence des répertoires.
11\item Dans la section \ref{vhdl_declaration}, nous expliciterons l'API ({\it Application Programming Interface}) pour la déclaration des signaux et des types du VHDL.
12\item Dans la section \ref{vhdl_body}, nous présenterons l'API pour générer le comportement des composants.
13\item Dans la section \ref{vhdl_structural}, nous expliquerons la manière de créer des sous composants.
14\item Dans la section \ref{example}, nous montrerons quelques exemples.
15\item Dans la section \ref{testbench}, nous présenterons la méthodologie de test.
16\end{itemize}
17
18\Section{Arborescence}\label{tree}
19
20Dans le répertoire contenant le projet, nous avons les répertoires suivant :
21\begin{description}
22\item[IPs/systemC/processor/Morpheo/Documentation/ :] Contient différent document décrivant certain point du projet, dont cette documentation.
23\item[IPs/systemC/processor/Morpheo/Behavioural/ :] 
24\item[IPs/systemC/processor/Morpheo/Behavioural/include/ :]
25  \begin{description}
26  \item [Parameters.h :] Contient la classe {\it Parameters}, cette classe définit les paramètres constants.
27  \item [Vhdl.h :] Contient la classe {\it Vhdl}.
28  \end{description}
29\item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component :] Chaque composant est inclue dans un répertoire spécifique.
30\item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/include :]
31  \begin{description}
32  \item [Parameters.h :] Contient la classe {\it Parameters}, elle dérive de la classe contenu dans le fichier le répertoire {\it \dots/Behavioural/include/}.
33  \item [Component.h  :] Contient la classe {\it Component}. Il définit l'interface, les registres ainsi que les méthodes du modèle systemC.
34  \item [Types.h      :] Contient les types spéciaux.
35  \end{description}
36\item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/src :]
37  \begin{description}
38  \item [Component\_transition.cpp :]
39  \item [Component\_genMoore.cpp :]
40  \item [Component\_genMealy\_XXX.cpp :]
41
42  \item [Component\_vhdl\_declaration.cpp :]
43  \item [Component\_vhdl\_body.cpp :]
44  \end{description}
45\item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/Selftest :]
46\end{description}
47
48\Section{VHDL : déclaration}\label{vhdl_declaration}
49
50Les déclarations ce font dans le fichier {\it Component\_vhdl\_declaration.cpp}.
51
52\subSection{Interfaces}
53L'interface est définit dans le modèle SystemC. Il n'ont pas nécessaire de la redéfinir pour le modèle VHDL.
54
55La nomenclature est la suivante :
56\begin{itemize}
57\item La direction en minuscule ({\it in}, {\it out}).
58\item Le nom de l'interface en majuscule ({\it READ}, {\it PUSH}, \dots).
59\item Le numéro de l'interface (la première interface aura le numéro 0. S'il n'y a qu'une interface, celle ci aura tout de même le numéro 0).
60\item Le nom du signal en majuscule ({\it VAL}, {\it ADDRESS}, \dots).
61\end{itemize}
62
63Par exemple pour la 2 ème interface de lecture d'un banc de registre :
64\begin{verbatim}
65 in_READ_1_VAL     : in  std_logic;
66out_READ_1_ACK     : out std_logic;
67 in_READ_1_ADDRESS : in  std_logic_vector(8 downto 0);
68out_READ_1_DATA    : out std_logic_vector(31 downto 0);
69\end{verbatim}
70
71Chaque composent (aussi bien combinatoire que séquentielle) possède un signal d'horloge et un signal de reset. (Ce dernier est actif à l'état bas). Ils ont tout les deux le même nom quelque soit le composant.
72\begin{verbatim}
73 in_CLOCK  : in std_logic;
74 in_NRESET : in std_logic;
75\end{verbatim}
76
77\subSection{Types}
78
79Le type de base utilisé est le {\it std\_logic\_vector} (ou std\_logic si le vecteur est sur un seul bit). Pour cela on utilise la fonction suivante :
80
81\begin{verbatim}
82std::string std_logic (uint32_t size);
83\end{verbatim}
84
85Pour accéder à une partie du vecteur on utilise la fonction {\it std\_logic\_range}. Elle a les prototypes suivant :
86\begin{verbatim}
87std::string std_logic_range (uint32_t size,
88                             uint32_t max ,
89                             uint32_t min ,
90                             bool force=false);
91std::string std_logic_range (uint32_t max ,
92                             uint32_t min ,
93                             bool force=false);
94std::string std_logic_range (uint32_t size,
95                             bool force=false);
96\end{verbatim}
97
98La première fonction fais un test sur la taille que la seconde ne fait pas.
99L'argument de la troisième définit la taille (ce qui implique que la borne minimum est 0 et la borne maximum est size-1).
100Toute les surcharges ont le bolléen optionnel {\it force}. S'il est à faux, alors des tests seront effectués sur les bornes et la taille, sinon aucun test n'est effectué.
101
102Par exemple :
103\begin{verbatim}
104std_logic_range(4,false) renvoie "(3 downto 0)".
105std_logic_range(1,false) renvoie "(0)".
106std_logic_range(1,true ) renvoie "(0 downto 0)".
107\end{verbatim}
108
109Pour les types plus complexe, la classe {\it Vhdl} possède une méthode générique. Le premier argument est le nom du type le second est le type.
110
111\begin{verbatim}
112void set_type (std::string name,
113               std::string type);
114\end{verbatim}
115
116L'exemple suivant définit un type représentat un tableau de {\it nb\_word} mots de {\it size\_word} bit chacun :
117\begin{verbatim}
118vhdl->set_type ("Tregfile",
119                "array "+std_logic_range(nb_word)+" of "+std_logic(size_word));
120\end{verbatim}
121
122\subSection{Constantes}
123
124La déclaration de constante, ce fait avec la méthode {\it set\_constant} de la classe {\it Vhdl}. Les différentes surcharges de cette méthode est le type des arguments {\it type} et {\it init}.
125
126\begin{verbatim}
127void set_constant (std::string name,
128                   std::string type,
129                   std::string init);
130void set_constant (std::string name,
131                   uint32_t    size,
132                   std::string init);
133void set_constant (std::string name,
134                   uint32_t    size,
135                   uint32_t    init);
136\end{verbatim}
137
138Par exemple pour coder les états d'un automate à 5 états en One Hot :
139\begin{verbatim}
140vhdl->set_constant ("State_idle",5,1);
141\end{verbatim}
142
143Dans le cas de signaux de type {\it std\_logic}, au lieu de déclarer des constantes, il existe deux fonctions permettant d'utiliser des constantes directement dans le corps du composant.
144La première est {\it std\_logic\_others}. Elle permet de définir des constantes dont soit les bits sont à pleins un soit à plein zéro.
145
146\begin{verbatim}
147std::string std_logic_others (uint32_t size,
148                              bool cst  );
149\end{verbatim}
150
151Pour toute les autres constantes, la méthode {\it std\_logic\_conv} transforme un entier en {\it std\_logic\_vector}.
152
153\begin{verbatim}
154std::string std_logic_conv (uint32_t    size,
155                            std::string value);
156std::string std_logic_conv (uint32_t    size,
157                            uint32_t    value);
158\end{verbatim}
159
160
161\subSection{Signaux internes}
162
163Les signaux internes sont définit grâce au méthode {\it set\_signal}. Le premier argument est le nom du signal. Le second est soit un type soit une taille (dans le cas où le type est un  {\it std\_logic\_vector}).
164\begin{verbatim}
165void set_signal (std::string name,
166                 std::string type);
167void set_signal (std::string name,
168                 uint32_t    size);
169\end{verbatim}
170
171La méthode est également surchargé si le signal à besoin d'une initialisation.
172
173\begin{verbatim}
174void set_signal (std::string name,
175                 std::string type,
176                 std::string init);
177void set_signal (std::string name,
178                 uint32_t    size,
179                 std::string init);
180void set_signal (std::string name,
181                 uint32_t    size,
182                 uint32_t    init);
183\end{verbatim}
184
185En vhdl il est possible de renommer une champ d'un signal. Ceci ce fait à l'aide de la fonction {\it set\_alias}. Elle prend 4 arguments. Le premier étant le nom du signal après le renommage. le second est soit le type, soit la taille du {\it std\_logic\_vector} du signal rénommé. Les deux derniers conserné le signal à renommé : le nom de ce dernier ainsi que l'intervalle. Pour le dernier paramètre il est recommandé d'utilisé la fonction {\it std\_logic\_range}.
186
187\begin{verbatim}
188void set_alias (std::string name1 ,
189                std::string type1 ,
190                std::string name2 ,
191                std::string range2);
192void set_alias (std::string name1 ,
193                uint32_t    size1 ,
194                std::string name2 ,
195                std::string range2);
196\end{verbatim}
197
198
199\Section{VHDL : comportement}\label{vhdl_body}
200
201Le comportement du composant est définit dans le fichier  {\it Component\_vhdl\_body.cpp}.
202
203Il n'y a pas de fonction aidant à l'écriture du Vhdl.
204La méthode {\it set\_body} permet de définir une ligne de code VHDL. Un retour à la ligne est automatiquement inséré. Le premier argument est pour l'indentation.
205\begin{verbatim}
206void set_body (uint32_t    depth,
207               std::string text );
208void set_body (std::string text );
209\end{verbatim}
210
211Pour les commentaires, il y a la fonction {\it set\_comment}.
212\begin{verbatim}
213void set_comment (uint32_t    depth,
214                  std::string text );
215void set_comment (std::string text );
216\end{verbatim}
217
218
219
220\Section{VHDL : structurelle}\label{vhdl_structural}
221
222\Section{Exemples}\label{example}
223
224\subSection{Banc de Registres Monolithique}
225
226\subsubSection{Fichier RegisterFile\_Monolithic\_vhdl\_declaration.cpp}
227\begin{verbatim}
228void RegisterFile_Monolithic::vhdl_declaration (Vhdl * & vhdl)
229{
230  vhdl->set_type ("Tregfile", "array " + std_logic_range(_param->_nb_word,true)+
231                              " of "+
232                              std_logic(_param->_size_word));
233
234  vhdl->set_signal ("reg_DATA", "Tregfile");
235};
236\end{verbatim}
237\subsubSection{Fichier RegisterFile\_Monolithic\_vhdl\_body.cpp}
238\begin{verbatim}
239void RegisterFile_Monolithic::vhdl_body (Vhdl * & vhdl)
240{
241  vhdl->set_body   (0,"");
242  vhdl->set_comment(0,"---------------------------------------------------");
243  vhdl->set_comment(0," Ackitement");
244  vhdl->set_comment(0,"---------------------------------------------------");
245  vhdl->set_body   (0,"");
246
247  for (uint32_t i = 0; i < _param->_nb_port_read; i++)
248    vhdl->set_body   (0,"out_READ_"+toString(i)+"_ACK  <= '1';");
249  for (uint32_t i = 0; i < _param->_nb_port_write; i++)
250    vhdl->set_body   (0,"out_WRITE_"+toString(i)+"_ACK <= '1';");
251
252  vhdl->set_body   (0,"");
253  vhdl->set_comment(0,"---------------------------------------------------");
254  vhdl->set_comment(0," Read RegisterFile");
255  vhdl->set_comment(0,"---------------------------------------------------");
256  vhdl->set_body   (0,"");
257 
258  for (uint32_t i = 0; i < _param->_nb_port_read; i++)
259    {
260      std::string str_address;
261      if (_param->_have_port_address)
262        str_address = "conv_integer(in_READ_"+toString(i)+"_ADDRESS)";
263      else
264        str_address = "0";
265
266      vhdl->set_body   (0,"out_READ_"+toString(i)+"_DATA <= reg_DATA ("+str_address+
267                           ") when in_READ_"+toString(i)+"_VAL = '1' else "+
268                           std_logic_others(_param->_size_word,0)+";");
269    }
270
271  vhdl->set_body   (0,"");
272  vhdl->set_comment(0,"---------------------------------------------------");
273  vhdl->set_comment(0," Write RegisterFile");
274  vhdl->set_comment(0,"---------------------------------------------------");
275  vhdl->set_body   (0,"");
276
277  vhdl->set_body   (0,"RegisterFile_write: process (in_CLOCK)");
278  vhdl->set_body   (0,"begin  -- process RegisterFile_write");
279  vhdl->set_body   (1,"if in_CLOCK'event and in_CLOCK = '1' then");
280 
281  for (uint32_t i = 0; i < _param->_nb_port_write; i++)
282    {
283      std::string str_address;
284      if (_param->_have_port_address)
285        str_address = "conv_integer(in_WRITE_"+toString(i)+"_ADDRESS)";
286      else
287        str_address = "0";
288
289      vhdl->set_body   (2,"if (in_WRITE_"+toString(i)+"_VAL = '1') then");
290      vhdl->set_body   (3,"reg_DATA("+str_address+") <= in_WRITE_"+toString(i)+"_DATA;");
291      vhdl->set_body   (2,"end if;");
292    }
293
294  vhdl->set_body   (1,"end if;");
295  vhdl->set_body   (0,"end process RegisterFile_write;");
296};
297\end{verbatim}
298
299\subsubSection{Fichier RegisterFile\_Monolithic.vhdl}
300\begin{verbatim}
301library ieee;
302  use ieee.numeric_bit.all;       
303  use ieee.numeric_std.all;       
304  use ieee.std_logic_1164.all;   
305  use ieee.std_logic_arith.all;   
306  use ieee.std_logic_misc.all;   
307--use ieee.std_logic_signed.all; 
308  use ieee.std_logic_unsigned.all;
309--use ieee.std_logic_textio.all; 
310
311
312library work;
313use work.RegisterFile_Monolithic_Pack.all;
314
315
316entity RegisterFile_Monolithic is
317  port ( in_CLOCK          : in  std_logic;
318         in_NRESET         : in  std_logic;
319         in_READ_0_VAL     : in  std_logic;
320        out_READ_0_ACK     : out std_logic;
321         in_READ_0_ADDRESS : in  std_logic_vector(8 downto 0);
322        out_READ_0_DATA    : out std_logic_vector(31 downto 0);
323         in_WRITE_0_VAL    : in  std_logic;
324        out_WRITE_0_ACK    : out std_logic;
325         in_WRITE_0_ADDRESS: in  std_logic_vector(8 downto 0);
326         in_WRITE_0_DATA   : in  std_logic_vector(31 downto 0)
327       );
328end RegisterFile_Monolithic;
329
330architecture behavioural of RegisterFile_Monolithic is
331  type Tregfile   is array (511 downto 0) of std_logic_vector(31 downto 0);
332
333  signal reg_DATA : Tregfile;
334
335begin
336  -----------------------------------------------------
337  -- Ackitement
338  -----------------------------------------------------
339 
340  out_READ_0_ACK  <= '1';
341  out_WRITE_0_ACK <= '1';
342 
343  -----------------------------------------------------
344  -- Read RegisterFile
345  -----------------------------------------------------
346 
347  out_READ_0_DATA <= reg_DATA (conv_integer(in_READ_0_ADDRESS))
348                     when in_READ_0_VAL = '1'
349                     else (others => '0');
350 
351  -----------------------------------------------------
352  -- Write RegisterFile
353  -----------------------------------------------------
354 
355  RegisterFile_write: process (in_CLOCK)
356  begin  -- process RegisterFile_write
357    if in_CLOCK'event and in_CLOCK = '1' then
358      if (in_WRITE_0_VAL = '1') then
359        reg_DATA(conv_integer(in_WRITE_0_ADDRESS)) <= in_WRITE_0_DATA;
360      end if;
361    end if;
362  end process RegisterFile_write;
363end behavioural;
364
365\end{verbatim}
366
367\Section {Test du VHDL}\label{testbench}
368
369Lors d'une simulation systemC, \cpu va générer des fichiers de tests pour le modèle VHDL de chaque composant interne.
370Ces tests sont tous écrit de la même façon. Soit l'interface X et le signal Y :
371\begin{itemize}
372\item Une variable {\it counter} indique le numéro de cycle courant. Elle est initialisé à 0. Elle est incrémenté à chaque cycle.
373\item Le composant est instancé avec des signaux internes de même nom.
374\item Pour chaque cycle, on affecte à chaque entrée la valeur obtenu lors de la simulation systemC.
375\item Pour chaque sortie, on définit un signal dont le nom est {\it out\_X\_Y\_test}. Ces signaux sont affecté au valeur obtenu des sorties lors la simulation systemC.
376\item Le signal {\it interface\_X\_test\_ok} est égal à 1 si chaque sortie calculé par la simulation VHDL est égal au sortie attendu (calculé par la simulation systemC).
377\item Le signal {\it interface\_X\_test\_transaction} est à 1 si tous les signaux de validité et d'aquittement sont à 1.
378\item Le signal {\it interface\_X\_test\_tmp} est à 1 si la simulation systemC indique qu'il y a une transaction et que la simulation vhdl indique également une transaction et que toute les sortie sont bien les sorties obtenu. Si la simulation systemC n'indique pas de transaction, on vérifie que c'est également le cas pour la simulation VHDL.
379\item Le signal {\it interface\_X\_test} est égal au signal {\it interface\_X\_test\_tmp} quand il n'y a pas de reset. sinon il est positionné à 1.
380\item Le signal {\it test} est un et logique entre tout tous les signaux {\it interface\_X\_test}.
381\item La simulation VHDL ce termine si le signal {\it test} vaut 0 (dans ce cas, le test est un échec), ou que le registre {\it counter} vaut le nombre de cycle requis par la simulation systemC (dans ce cas, le test est un succès).
382\end{itemize}
383
384Nous pouvons remarquer que :
385\begin{itemize}
386\item Nous vérifions la compatibilité au cycle des transactions entre le modèle systemC et le modèle VHDL.
387\item Nous vérifions la compatibilité au bit près des données échangé lors qu'il y a une transaction sur une interface.
388\item Nous ne vérifions pas la compatibilité au bit près des données présente sur une interface qui ne fait pas de transaction lors d'un cycle.
389\end{itemize}
Note: See TracBrowser for help on using the repository browser.