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

Last change on this file since 100 was 100, checked in by rosiere, 15 years ago

1) Bug fix (Operation, Instruction)
2) Modif Return Address Stack
3) Add Soft Test
4) Add Soc Test

  • Property svn:keywords set to Id
File size: 6.6 KB
Line 
1%------------------------------------------------------------------------------
2% $Id: document-morpheo-vhdl_generation-fr-02_vhdl_declaration.tex 100 2009-01-08 13:06:27Z rosiere $
3%------------------------------------------------------------------------------
4
5\Section{VHDL : déclaration}\label{vhdl_declaration}
6
7Les déclarations se font dans le fichier {\it Component\_vhdl\_declaration.cpp}.
8
9\subSection{Interfaces}
10L'interface est définie dans le modèle SystemC. Il n'est pas nécessaire de la redéfinir pour le modèle VHDL.
11
12La nomenclature est la suivante :
13\begin{itemize}
14\item La direction en minuscule ({\it in}, {\it out}).
15\item Le nom de l'interface en majuscule ({\it READ}, {\it PUSH}, \dots).
16\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).
17\item Le nom du signal en majuscule ({\it VAL}, {\it ADDRESS}, \dots).
18\end{itemize}
19
20Par exemple pour la 2 ème interface de lecture d'un banc de registre :
21\lstparam{VHDL}
22\begin{lstlisting}
23 in_READ_1_VAL     : in  std_logic;
24out_READ_1_ACK     : out std_logic;
25 in_READ_1_ADDRESS : in  std_logic_vector(8 downto 0);
26out_READ_1_DATA    : out std_logic_vector(31 downto 0);
27\end{lstlisting}
28
29Chaque composant (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 tous les deux le même nom quelque soit le composant.
30\lstparam{VHDL}
31\begin{lstlisting}
32 in_CLOCK  : in std_logic;
33 in_NRESET : in std_logic;
34\end{lstlisting}
35
36\subSection{Types}
37
38Le 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 :
39
40\lstparam{C++}
41\begin{lstlisting}
42std::string std_logic (uint32_t size);
43\end{lstlisting}
44
45Pour accéder à une partie du vecteur, on utilise la fonction {\it std\_logic\_range}. Elle a les prototypes suivant :
46\lstparam{C++}
47\begin{lstlisting}
48std::string std_logic_range  (uint32_t size,
49                              uint32_t max ,
50                              uint32_t min);
51std::string std_logic_range  (uint32_t max ,
52                              uint32_t min);
53std::string std_logic_range  (uint32_t size);
54std::string _std_logic_range (uint32_t size,
55                              uint32_t max ,
56                              uint32_t min);
57std::string _std_logic_range (uint32_t max ,
58                              uint32_t min);
59std::string _std_logic_range (uint32_t size);
60\end{lstlisting}
61
62La première fonction fait un test sur la taille que la seconde ne fait pas.
63L'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).
64Toutes les fonctions préfixées par un underscore n'effectuent pas de test sur les bornes.
65
66Par exemple :
67\begin{verbatim}
68 std_logic_range(4) renvoie "(3 downto 0)".
69 std_logic_range(1) renvoie "(0)".
70_std_logic_range(1) renvoie "(0 downto 0)".
71\end{verbatim}
72
73Pour les types plus complexes, 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.
74
75\lstparam{C++}
76\begin{lstlisting}
77void set_type (std::string name,
78               std::string type);
79\end{lstlisting}
80
81L'exemple suivant définit un type représentant un tableau de {\it nb\_word} mots de {\it size\_word} bit chacun :
82\lstparam{C++}
83\begin{lstlisting}
84vhdl->set_type ("Tregfile",
85                "array "+std_logic_range(nb_word)+" of "+std_logic(size_word));
86\end{lstlisting}
87
88\subSection{Constantes}
89
90La 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}.
91
92\lstparam{C++}
93\begin{lstlisting}
94void set_constant (std::string name,
95                   std::string type,
96                   std::string init);
97void set_constant (std::string name,
98                   uint32_t    size,
99                   std::string init);
100void set_constant (std::string name,
101                   uint32_t    size,
102                   uint32_t    init);
103\end{lstlisting}
104
105Par exemple pour coder les états d'un automate à 5 états en One Hot :
106\lstparam{C++}
107\begin{lstlisting}
108vhdl->set_constant ("State_idle",5,1);
109\end{lstlisting}
110
111Dans 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.
112La première est {\it std\_logic\_others}. Elle permet de définir des constantes dont soit les bits sont à plein un soit à plein zéro.
113
114\lstparam{C++}
115\begin{lstlisting}
116std::string std_logic_others (uint32_t size,
117                              bool cst  );
118\end{lstlisting}
119
120Pour toutes les autres constantes, la méthode {\it std\_logic\_conv} transforme un entier en {\it std\_logic\_vector}.
121
122\lstparam{C++}
123\begin{lstlisting}
124std::string std_logic_conv (uint32_t    size,
125                            std::string value);
126std::string std_logic_conv (uint32_t    size,
127                            uint32_t    value);
128\end{lstlisting}
129
130
131\subSection{Signaux internes}
132
133Les signaux internes sont définis grâce à la 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}).
134\lstparam{C++}
135\begin{lstlisting}
136void set_signal (std::string name,
137                 std::string type);
138void set_signal (std::string name,
139                 uint32_t    size);
140\end{lstlisting}
141
142La méthode est également surchargée si le signal a besoin d'une initialisation.
143
144\lstparam{C++}
145\begin{lstlisting}
146void set_signal (std::string name,
147                 std::string type,
148                 std::string init);
149void set_signal (std::string name,
150                 uint32_t    size,
151                 std::string init);
152void set_signal (std::string name,
153                 uint32_t    size,
154                 uint32_t    init);
155\end{lstlisting}
156
157En vhdl il est possible de renommer un champ d'un signal. Ceci se 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 renommé. Les deux derniers concernés le signal à renommé : le nom de ce dernier ainsi que l'intervalle. Pour le dernier paramètre, il est recommandé d'utiliser la fonction {\it std\_logic\_range}.
158
159\lstparam{C++}
160\begin{lstlisting}
161void set_alias (std::string name1 ,
162                std::string type1 ,
163                std::string name2 ,
164                std::string range2);
165void set_alias (std::string name1 ,
166                uint32_t    size1 ,
167                std::string name2 ,
168                std::string range2);
169\end{lstlisting}
Note: See TracBrowser for help on using the repository browser.