Brevet FR2812417A1 — publié le 20020201

PROCESSEUR DSP A ARCHITECTURE PARALLELE La présente invention concerne les processeurs de traitement du signal numérique, ou processeur DSP ("Digital Signal Processors"). La présente invention concerne plus particulièrement les processeurs DSP à architecture parallèle, ou processeurs VLIW ("Very Large Instruction Word"). Comme cela est bien connu de l'homme de l'art, les processeurs de type VLIW sont des processeurs hérités des processeurs RISC qui se distinguent des processeurs DSP conventionnels par le fait qu'ils comprennent plusieurs unités d'exécution agencées en parallèle. Chaque unité d'exécution est l'équivalent d'un coeur de processeur RISC (Reduced Instruction Set Computer) et exécute des codes instruction de format réduit, généralement de 16 bits, en exploitant les ressources offertes par une banque de registres. Chaque unité d'exécution pouvant exécuter un code instruction simultanément aux autres unités d'exécution, les processeurs VLIW sont donc capables d'exécuter simultanément une instruction large comprenant plusieurs codes "équivalents" RISC en parallèle. Pour fixer les idées, la figure 1 représente schématiquement la structure classique d'un processeur 10 de type VLIW, dont les éléments essentiels sont représentés sous forme de blocs. Le processeur 10 comprend une mémoire programme PMEM, une mémoire de données 12, un registre d'instructions IR agencé à la sortie de la mémoire PMEM, un décodeur d'instructions IDEC agencé à la sortie du registre IR, une banque de registres RBANK, prévue notamment pour l'exécution de codes instruction de type RISC, des unités d'exécution EU0 à EU3, ainsi qu'un circuit BMC formant l'interface 2 2812417 entre les sorties des unités d'exécution UE1-EU3 et les entrées/sorties de la mémoire de données DMEM. Les unités d'exécution, ici quatre unités EU0, EU1, EU2, EU3, sont agencées en parallèle pour assurer le traitement simultané de quatre codes instruction lus simultanément dans la mémoire PMEM, formant ensemble une instruction large. La nature des unités d'exécution peut varier en fonction de l'application à laquelle le processeur est destiné. Les unités d'exécution comprennent par exemple une unité ALU (unité arithmétique et logique), une unité MAC (multiplication/adition), une unité CU (unité de contrôle, gérant le compteur ordinal PC et les branchements) et une unité CO-PRO (coprocesseur) pour effectuer certains calculs spécifiques à l'application visée. Un tel processeur est ainsi capable d'assurer l'exécution d'instructions larges constituées ici au maximum par quatre codes. A chaque nouveau cycle d'horloge H, le compteur ordinal PC ("Program Counter") du processeur est augmenté d'un incrément n qui est égal à 1, sauf en cas de saut ou de branchement, et les registres d'instructions IR0-IR3 reçoivent simultanément en parallèle quatre nouveaux codes destinés à être exécutés par les unités EU0-EU3. L'architecture d'un tel processeur 10 se distingue ainsi d'un processeur RISC conventionnel par son parallélisme, qui se retrouve dans tous les étages de traitement des instructions. Toutefois, les possibilités offertes par ce parallélisme sont rarement exploitées au maximum et les programmes compilés stockés dans la mémoire programme PMEM comprennent généralement un nombre élevée de codes de non-opération, ou codes "NOP" ("No Operation"). En effet, la transformation d'un programme écrit en langage de haut niveau, par exemple en langage C/C++, en une suite de codes de type RISC regroupés en paquets est effectuée de façon automatique par un programme de compilation qui connaît la structure du 3 2812417 processeur et essaie de former des paquets ayant la plus grande taille possible (comprenant quatre codes au maximum dans l'exemple de processeur décrit) afin d'exploiter au maximum le parallélisme du processeur.5 Cette optimisation est faite en tenant compte des conflits entre les codes, de la disponibilité des unités d'exécution et des dépendances de données lors de l'exécution pipeline des codes. Ainsi, par exemple, deux codes destinés à être exécutés par la même unité d'exécution ne peuvent être parallélisés dans le même paquet. Egalement, un code utilisant une opérande qui est le résultat d'une opération visée par un autre code ne peut être exécuté tant que le code dont il dépend n'est pas lui-même exécuté.15 A titre d'exemple, considérons la séquence de programme suivante: /p co /p cl p c2 /p c3 p c41p c51p c61 /p c7 P c85p c9 qui comprend des codes instruction cO à c9 comportant chacun un bit de parallélisme /p ou p. Les codes instruction, appelés "syllabes" dans le langage de l'homme de l'art, sont regroupés en "paquets" ("bundle") pour former des instructions larges. La séparation des instructions (paquets) au sein d'un programme est effectuée au moyen des bits de parallélisme "p" affectés à chacun des codes. Les deux valeurs possibles "/p" ou "p" d'un bit de parallélisme, par exemple 0 et 1, permettent de savoir si un code appartient ou non à une nouvelle instruction. Plus, particulièrement, un code précédé d'un bit de parallélisme "p" (par exemple 1) appartient à la même instruction que le code précédent, tandis qu'un code précédé d'un bit de parallélisme "/p" (par exemple 0) appartient par convention à un nouveau paquet. 4 2812417 Dans la séquence de programme mentionnée ci-dessus, les bits de parallélisme permettent ainsi de distinguer quatre instructions larges INST1 à INST4: INST1 = cO INST2 = cl c2 INST3 = c3 c4 c5 c6 INST4 = c7 c8 c9 Pour pouvoir être exécutées par le processeur 10, ces instructions INST1 à INST4 sont enregistrées dans la mémoire programme PMEM du processeur comme représenté en figure 1 et décrit par le tableau 1 ciaprès: Tableau 1 /p cO NOP NOP NOP /p cl NOP NOP NOP /p c3 p c4 p c5 p c6 /p c7 p c8 p c9 NOP En conséquence, les compilateurs pour processeurs VLIW classiques génèrent un grand nombre de codes de non- opération qui ont pour but de maintenir certaines unités d'exécution inactives pendant que d'autres exécutent des codes. Il en résulte un encombrement inutile de la mémoire programme, qui peut représenter en pratique entre % et 70% de l'espace mémoire selon l'efficacité du compilateur et l'adéquation entre le programme à compiler et les ressources offertes par le processeur. Cet encombrement de l'espace mémoire par des codes NOP, qui est considérable au regard des codes instruction réellement nécessaires à l'exécution des programmes, augmente la surface de la mémoire PMEM pour une application donnée, donc entraîne une baisse de performance (mémoire plus lente avec la taille qui augmente) , un surcroît de consommation (lignes de mots et lignes de bits plus longues dans le plan mémoire) et de coût (surface de silicium). 2812417 La présente invention vise à pallier cet inconvénient. Plus particulièrement, la présente invention vise un processeur de type VLIW qui puisse recevoir dans sa mémoire programme des paquets de codes ne comportant pas de codes de non-opération. Cet objectif est atteint par la prévision d'un processeur de traitement du signal prévu pour exécuter des instructions de taille variable pouvant comprendre jusqu'à N codes instruction élémentaires, le processeur comprenant une mémoire programme comprenant I bancs mémoire en parallèle adressables individuellement, I étant au moins égal à N, dans lesquels les codes d'un programme sont enregistrés de façon entrelacée à raison d'un code par banc et par adresse appliquée au banc, des moyens de lecture de la mémoire programme agencés pour lire un code dans chacun des I bancs mémoire au cours d'un cycle de lecture d'une instruction, un cycle de lecture d'une instruction dans la mémoire programme comprenant la lecture d'une suite de codes comprenant le ou les codes de l'instruction à lire et pouvant également comprendre, quand le nombre de codes de l'instruction lue est inférieur à I, des codes appartenant à une instruction suivante. Selon un mode de réalisation, les moyens de lecture comprennent des moyens pour appliquer aux bancs mémoire des adresses individuelles générées à partir d'une valeur collective de compteur ordinal, qui est incrémentée, avant le commencement d'un cycle de lecture d'une instruction, d'une valeur égale au nombre de codes que comprend l'instruction précédente. Selon un mode de réalisation, les moyens pour appliquer des adresses sont agencés pour appliquer à chacun des bancs mémoire une adresse de lecture individuelle égale à P0 ou PO+l, P0 étant le quotient de la division par I de la valeur du compteur ordinal. 6 2812417 Selon un mode de réalisation, les moyens pour appliquer des adresses sont agencés pour appliquer à un banc mémoire de rang i une adresse égale à P0 quand i est strictement supérieur à R, ou appliquer à un banc mémoire5 de rang i une adresse égale à PO+l quand i est inférieur ou égal à R, étant le reste de la division par I de la valeur du compteur ordinal. Selon un mode de réalisation, les moyens de lecture comprennent des moyens pour réorganiser les codes de la suite de codes lue dans la mémoire programme, conformément à l'algorithme suivant: [c' (j) = c(i), avec i = (j+R') modulo I], dans lequel "i" et "j" désignent les rangs des codes avant et après réorganisation, c(i) désigne des codes de rang i dans leur agencement après lecture dans la mémoire, c' (j) désigne des codes de rang j après réorganisation, R' étant le reste de la division par I de la valeur que présentait le compteur ordinal au cours du cycle d'horloge précédent. Selon un mode de réalisation, les moyens pour réorganiser sont agencés pour appliquer aux codes de la suite de codes lue dans la mémoire programme une permutation circulaire comprenant un nombre de permutations circulaires élémentaires égal à R' ou à [I- R'] selon le sens dans lequel est réalisée la permutation circulaire. Selon un mode de réalisation, les permutations circulaires sont effectuées par un barillet à décalage recevant sur une entrée de commande le paramètre R' Avantageusement, les moyens de lecture comprennent des moyens pour filtrer les codes n'appartenant pas à l'instruction à lire, au moyen de bits de parallélisme accompagnant les codes. Selon un mode de réalisation, les codes filtrés sont remplacés par des codes de non-opération. Selon un mode de réalisation, les moyens de filtrage de codes sont agencés pour exécuter l'algorithme suivant: [Pour j = 0, val(j=0) = "v", s(j=0) = c'(j=0); 7 2812417 Pour j allant de 1 à I, val(j) = "v" si val(j-l) = "v" et si bit de parallélisme de c' (j)="p", sinon val(j-l) = "/v"; s(j) = c' (j) si val(j) = "v"; s(j) = NOP si val(j) = "/v"], dans lequel val(j) est un terme de validation associé à chaque code c' (j) de rang j, pouvant présenter deux valeurs "v" et "/v", s(j) désigne des sorties de rang j des moyens de filtrage, correspondant à des entrées de même rang recevant un code c' (j), "NOP" est un code de non-opération. Selon un mode de réalisation, les codes non filtrés sont envoyés à des unités d'exécution de type RISC agencées en parallèle. La présente invention concerne également un procédé de lecture d'instructions de taille variable pouvant comprendre jusqu'à N codes instruction élémentaires, applicable à un processeur de traitement du signal, comprenant les étapes consistant à prévoir une mémoire programme comprenant I bancs mémoire en parallèle adressables individuellement, I étant au moins égal à N, enregistrer les codes d'un programme dans la mémoire programme de façon entrelacée, à raison d'un code par banc et par adresse appliquée au banc, et au cours d'un cycle de lecture d'une instruction, lire dans les I bancs mémoire une suite de codes comprenant le ou les codes de l'instruction à lire et pouvant également comprendre, quand le nombre de codes de l'instruction lue est inférieur à I, des codes appartenant à une instruction suivante. Selon un mode de réalisation, le procédé comprend une étape consistant à appliquer aux bancs mémoire des adresses individuelles générées à partir d'une valeur collective de compteur ordinal, qui est incrémentée, avant le commencement d'un cycle de lecture d'une instruction, d'une valeur égale au nomcre de codes que comprend l'instruction précédente. Selon un mode de réalisation, le procédé comprend une étape consistant à appliquer à chacun des bancs 8 2812417 mémoire une adresse de lecture individuelle égale à P0 ou PO+l, P0 étant le quotient de la division par I de la valeur du compteur ordinal, un banc mémoire de rang i recevant une adresse égale à P0 quand i est strictement supérieur à R, ou une adresse égale à PO+l quand i est inférieur ou égal à R, R étant le reste de la division par I de la valeur du compteur ordinal. Selon un mode de réalisation, le procédé comprend une étape de réorganisation des codes de la suite de codes lue dans la mémoire programme, conformément à l'algorithme mentionné plus haut. Selon un mode de réalisation, le procédé comprend une étape de filtrage des codes lus n'appartenant pas à l'instruction à lire, au moyen de bits de parallélisme accompagnant les codes. Selon un mode de réalisation, des codes filtrés sont remplacés par des codes de non-opération. Selon un mode de réalisation, les codes sont filtrés conformément à l'algorithme mentionné plus haut. Selon un mode de réalisation, les codes non filtrés sont envoyés à des unités d'exécution de type RISC agencées en parallèle. Ces objets, caractéristiques et avantages ainsi que d'autres de la présente invention seront exposés plus en détail dans la description suivante d'un exemple de réalisation d'un processeur selon l'invention, faite à titre non limitatif en relation avec les figures jointes parmi lesquelles: - la figure 1 précédemment décrite représente sous forme de blocs l'architecture d'un processeur VLIW classique, - la figure 2 représente sous forme de blocs l'architecture d'un processeur selon l'invention, - les figures 3 et 4 représentent des modes de réalisation d'éléments représentés sous forme de blocs en figure 2. La figure 2 représente schématiquement l'architecture d'un processeur de traitement du signal 20 9 2812417 selon l'invention. Le processeur 20 comprend, comme le processeur classique de la figure 1, une mémoire programme PMEM1, une mémoire de données DMEM, un registre d'instructions IR, un décodeur d'instructions IDEC agencé à la sortie du registre IR, une banque de registres RBANK, des unités d'exécution, ici quatre unités EUO à EU3, ainsi qu'un circuit BMC ("Built-In Self Test/Mapping/Conflicts") prévu pour lire ou écrire des données dans la mémoire de données DMEM ou dans la banque10 de registres RBANK et assurant diverses autres fonctions comme l'autotest des mémoires ("Built-In Self Test" ou "BIST") et la gestion des conflits d'adresses. Le registre d'instructions IR comprend quatre registres IRO à IR3 en parallèle, prévus pour recevoir à chaque cycle de lecture d'une instruction (cycle "fetch") quatre codes instruction c' (0) à c'(3) délivrés par la mémoire programme PMEM1. Le décodeur d'instructions IDEC assure le décodage des codes c'(O)-c'(3) ainsi que la distribution des opérandes en direction des unités d'exécution concernées. Ces éléments sont en soi classiques et constituent le coeur du processeur, représenté schématiquement sous la forme d'un bloc. Le processeur 20 selon l'invention se distingue d'un processeur classique par le fait que la mémoire programme PMEM1 est constituée par plusieurs bancs mémoire agencés en parallèle, ici quatre bancs MO, Ml, M2, M3 adressables individuellement et recevant respectivement des adresses aO, al, a2, a3. Dans ce qui suit, on désignera par "I" le nombre de bancs mémoire adressables individuellement présents dans un processeur selon l'invention, et par "N" le nombre maximal de codes instruction pouvant être contenus dans une instruction large (paquet), I devant au moins être égal à N. Ici, I est égal à N qui est égal à 4 puisque le processeur comprend quatre unités d'exécution. Selon l'invention, les codes instruction (syllabes) d'un programme sont enregistrés dans la mémoire PMEM1 de 2812417 façon entrelacée, de telle sorte que deux codes se succédant dans le programme soient agencés dans deux bancs mémoire contigus de rangs croissants, avec la même adresse ai dans chaque banc. Lorsqu'un code est enregistré dans le dernier banc mémoire M3, à une adresse a3 = "x", le code suivant est enregistré dans le banc mémoire M0 à l'adresse aO = "x+ l", et les codes suivants sont enregistrés dans les bancs Ml, M2, M3 aux adresses al = a2 = a3 = "x+l", etc.. Pour fixer les idées, considérons que la séquence de programme suivante, déjà décrite au préambule, est stockée dans la mémoire virtuelle PMEM1: INSTl = cO INST2 = cl c2 INST3 = c3 c4 c5 c6 INST4 = c7 c8 c9 A la différence d'un processeur classique, les codes constituant les instructions larges INSTl à INST4 sont enregistrés dans les bancs mémoire les uns après les autres sans injection de codes de non-opération NOP, comme cela apparaît dans le tableau 2 ci-après, la séparation des instructions étant assurée exclusivement par les bits de parallélisme. Tableau 2 Adresses Banc MO Banc M1 Banc M2 Banc M3 x /p co /p cl p c2 /p c3 x+l p c4 p c5 p c6 /p c7 x+2 p c8 p c9 /p... Notons ici que les bits de parallélisme sont représentés ici comme des éléments extérieurs aux codes cO à c9 pour faciliter la compréhension de l'invention. En pratique, les bits de parallélisme font partie intégrante des codes stockés en mémoire et sont éliminés il 2812417 au moment de l'exécution des codes. Par exemple, les codes c0-c9 comprennent 16 bits parmi lesquels un bit est utilisé en tant que bit de parallélisme. Ainsi, avantageusement, le processeur selon l'invention reçoit des programmes compactés ne comportant pas de codes NOP. Il en résulte une diminution substantielle de l'encombrement de l'espace mémoire entraînant une baisse de la surface nécessaire au stockage du programme et une diminution de la consommation. On va maintenant décrire des moyens de lecture de la mémoire PMEM1, prévus pour "désentrelacer" les codes instruction afin d'en extraire des instructions larges, ou "paquets", comprenant plusieurs codes ou "syllabes" destinés à être exécutés simultanément. Selon l'invention, ces moyens de lecture comprennent essentiellement un circuit de gestion d'adresses IAC, un circuit de permutation de codes PCC et un circuit de sélection de codes CSC, et consistent également dans une gestion particulière du compteur ordinal PC ("program counter") du processeur 20, qui sera tout d'abord décrite. Le compteur ordinal PC est incrémenté de façon classique à chaque cycle d'horloge, par exemple au moyen d'un additionneur ADDl recevant sur une entrée la valeur courante du compteur ordinal et sur une autre entrée un incrément n, la sortie de l'additionneur étant appliquée à un tampon LTl piloté par le signal d'horloge H. Selon l'invention, le compteur ordinal PC est incrémenté d'une valeur n qui n'est pas constante comme dans l'art antérieur. L'incrément n est égal au nombre de codes instruction exécutables que comprend l'instruction précédente et est ici délivré par le circuit CSC décrit plus loin. Cette règle d'incrémentation du compteur ordinal concerne bien entendu la lecture séquentielle des instructions d'un programme et ne s'applique pas lors de 12 2812417 l'exécution d'instructions spéciales comme des instructions de saut ou de branchement, pour lesquelles l'incrément de saut ou la valeur de branchement est imposé par le programme. Le circuit de gestion d'adresses IAC mentionné plus haut assure le calcul des adresses individuelles aO-a3 appliquées aux bancs mémoire à partir de la valeur courante du compteur ordinal PC, incrémentée de la manière qui vient d'être décrite. Plus particulièrement, le circuit IAC calcule les adresses aO-a3 en appliquant l'algorithme Al suivant: Al: Pour i allant de O à I-1, ai= PO+l si i R dans lequel: 1) "i" est l'indice désignant le rang des bancs mémoire MO-M3 et le rang des adresses correspondantes aO-a3, 2) PO est le quotient de la division par I du compteur ordinal PC, soit: PO = Quotient (PC/I) soit ici, I étant égal à 4: PO = Quotient (PC/4) 3) R est le reste de la division par I du compteur ordinal PC, soit: R = PC - P0 = PC modulo I, soit ici, I étant égal à 4: 13 2812417 R = PC modulo 4 Des exemples de mise en oeuvre de cet algorithme, ainsi qu'un exemple de réalisation du circuit IAC seront décrits plus loin. Le circuit de permutation de codes PCC mentionné plus haut est relié à la sortie de la mémoire programme PMEM1 et comprend des entrées eO à e3 connectées respectivement aux sorties des bancs mémoire MO à M3 et recevant respectivement des codes c(O), c(l), c(2), c(3) lus dans la mémoire programme. Le circuit PCC comprend également quatre sorties sO, sl, s2, s3 délivrant respectivement des codes c'(O), c'(l), c'(2), c'(3). Les codes délivrés sont égaux aux codes reçus en entrée mais sont réorganisés par le circuit PCC selon l'algorithme A2 suivant: A2: Pour i allant de O à N-1 et j allant de O à N-1 c'(j) = c(i), avec i = (j + R') modulo I dans lequel: 1) "i" est l'indice mentionné plus haut, désignant ici le rang des codes d'entrée c(O)-c(3) délivrés par les bancs mémoire MO-M3, 2) "j" est un indice désignant le rang des codes de sortie c'(O)c'(3), 3) R' est le reste de la division par I du compteur ordinal PC, calculé au cycle d'horloge précédent. Comme représenté en figure 2, le circuit PCC peut être réalisé simplement au moyen d'un barillet à décalage ("Barrel Shifter") d'un type connu en soi. L'algorithme A2 est mis en oeuvre en appliquant sur l'entrée de 14 2812417 commande du barillet, par l'intermédiaire d'un tampon LT2, le paramètre R calculé et délivré par le circuit IAC. Le tampon LT2 étant piloté par le signal d'horloge, le paramètre R qui est appliqué au barillet après chaque front du signal d'horloge est décalé d'un cycle d'horloge relativement au paramètre R du cycle en cours et est donc égal au paramètre R' mentionné plus haut. Le barillet PCC est agencé pour décaler ses sorties relativement à ses entrées par permutation circulaire à gauche (sens des poids forts vers les poids faibles), en effectuant un nombre de décalages à gauche égal à R'. Dans une variante de réalisation, le barillet reçoit sur son entrée de commande le complément de R' à I, soit la valeur [I-R'], et est agencé pour décaler ses sorties relativement à ses entrées par permutation circulaire à droite (sens des poids faibles vers les poids forts) en effectuant un nombre de décalages à droite égal à [I-R']. Le circuit de sélection de codes CSC mentionné plus haut est connecté en entrée à la sortie du circuit PCC et comprend des entrées eO à e3 recevant respectivement les codes c' (0) à c'(3). Le circuit CSC comprend également quatre sorties sO à s3 qui recopient le code reçu sur l'entrée de même rang dans des conditions prévues par l'algorithme A3 suivant: A3: Pour j = 0 val(j=0) = "v" s(j=0) = c' (j=0) Pour j allant de 1 à I val(j) = "v" si val(j-l) = "v" et si bit de parallélisme de c' (j)="p" sinon val(j-l) = "/v" s(j) = c' (j) si val(j) = "v", s(j) = NOP si val(j) = "/v" 2812417 dans lequel val(j) est un terme de validation récursif de type "daisy chain", associé à chaque sortie s(j) de rang j, pouvant présenter deux valeurs "v" et "/v", par exemple "1" et "0". Pour les sorties de rang "j" allant de 1 à I, ce terme permet de déterminer si une sortie s(j) doit recopier le code c' (j) reçu sur l'entrée de rang correspondant ou doit au contraire délivrer un code NOP. Ce choix est fonction de la valeur du terme de validation val(j), qui est elle-même fonction de la valeur du terme de validation précédent val(j-l) et de la valeur "p" ou "/p", par exemple "1" ou "0", du bit de parallélisme présent dans le code c' (j). En d'autres termes, en attribuant par convention la valeur 1 à "p" et "v" et la valeur "0" à "/p" et "/v", la sortie sO recopie le code c' (0) reçu sur l'entrée eO et chacune des autres sorties s(j) recopie le code c' (j) reçu sur l'entrée correspondante e(j) si le code c' (j) comprend un bit de parallélisme égal à "1" et si le bit de validation val(j-l) de la sortie de rang précédent est aussi égal à "1". Quand le bit de parallélisme d'un code c' (j) est égal à "0", la sortie correspondante s(j) et toutes les sorties suivantes délivrent un code NOP. Le système de lecture de la mémoire programme PMEM1 fonctionne ainsi comme suit: Etape El: au cours d'un premier cycle d'horloge, le circuit IAC applique aux bancs mémoire MO-M3 des adresses aO-a3 assurant la lecture de quatre codes instruction a(0)-a(3), qui se suivent dans la mémoire PMEM1 selon l'entrelacement décrit plus haut; Etape E2-l: au cours du cycle d'horloge suivant, un signal de lecture READ est appliqué aux bancs mémoire et les codes sont lus dans un ordre qui peut ne pas correspondre, en raison de leur entrelacement, à leur rang effectif prévu dans le programme. Ils sont remis dans l'ordre par le circuit PCC en application de l'algorithme A2, au moyen du paramètre R' calculé au 16 2812417 cycle d'horloge précédent (c'est-à-dire au moment de l'élaboration des adresses aO-a3); Etape E2-2: au cours du même cycle d'horloge, le circuit de sélection CSC identifie les codes qui ne correspondent pas à l'instruction à exécuter, grâce à leur bit de parallélisme "/p" et les remplace par des codes de non-opération NOP; Etape E2-3: au cours du même cycle d'horloge le registre d'instructions IRO reçoit le code c' (0) et les registres IR1-IR3 reçoivent les codes filtrés (NOP) ou non filtrés selon la sélection faite par le circuit CSC; Etape E3 et suivantes: les codes non filtrés sont décodés par le décodeur IDEC et exécutés par les unités EUO-EU4. Ainsi, la lecture d'une instruction large est faite en deux cycles d'horloge comme dans l'art antérieur, et comprend un cycle pour l'élaboration des adresses aO-a3 et un cycle pour la lecture des codes. Les codes lus sont réorganisés et filtrés au cours du cycle de lecture, l'opération étant "transparente" pour le fonctionnement de l'ensemble. Ces étapes sont effectuées avec chevauchement, selon les règles classiques de fonctionnement pipeline, les registres pipeline n'ayant pas été décrits et représentés dans un souci de simplicité. Le tableau 3 figurant en Annexe fait partie intégrante de la description et illustre le fonctionnement du processeur pour la lecture des instructions INST1 à INST4 décrites plus haut. Les paramètres PC, R, R' et PO intervenant dans l'exécution des algorithmes sont mentionnés dans les premières colonnes. On considère dans cet exemple que les codes des instructions INST1 à INST3 sont stockés dans la mémoire programme PMEM1 à partir de l'adresse O et que le compteur ordinal est égal à O au commencement du processus de lecture. Les colonnes aO-a3 donnent les valeurs des adresses calculées à partir de la valeur 17 2812417 courante du compteur ordinal PC. Les colonnes c(0)-c(3) donnent les valeurs des codes lus dans la mémoire dans l'ordre dans lequel ils setrouvent. Les colonnes c' (0) c'(3) donnent les valeurs des codes après réorganisation5 par le circuit PCC. Les quatre dernières colonnes c' (0)c' (3) donnent les valeurs des codes après filtrage dans le circuit CSC. En observant les quatre dernières colonnes du tableau 3, il apparaît que les codes qui y figurent sont équivalents, en agencement et en valeur, aux codes qui se trouvaient dans la mémoire du processeur classique décrit au préambule (voir le tableau 1 au préambule). Ainsi, le système de lecture selon l'invention reconstitue les codes NOP qui étaient, dans l'art antérieur, enregistrés dans la mémoire programme. De façon générale, la réalisation des circuits IAC et CSC est à la portée de l'homme de l'art, notamment grâce aux techniques de conception automatique de circuits logiques à partir du langage VHDL. Les algorithmes Al et A3 mentionnés plus haut sont exprimés en langage VHDL et les circuits IAC et CSC sont générés automatiquement par un compilateur de langage VHDL, sous forme de circuits à logique câblée. On décrira toutefois à titre non limitatif, en relation avec les figures 3 et 4, des exemples de réalisation des circuits IAC et CSC dans le cas o les paramètres I et N sont égaux à 4. Sur la figure 3, le circuit IAC reçoit en entrée un compteur ordinal PC codé sur 32 bits. Le résultat R est obtenu de façon simple en séparant les deux fils de poids faible de la ligne physique véhiculant le compteur ordinal PC, R étant ainsi égal aux deux bits de poids faible du compteur ordinal. De même, P0 est égal aux 30 bits de poids fort du compteur ordinal et est obtenu en séparant les 30 fils de poids fort. Le paramètre PO +1 est calculé par un additionneur recevant les valeurs P0 et "1" en entrée. Les adresses a0-a3 sont délivrées par des multiplexeurs MXAl-MXA3 recevant en entrée les 18 2812417 paramètres PO et PO+1. Ces multiplexeurs sont pilotés par des comparateurs CMPO-CMP3 recevant sur une première entrée l'indice "i" et sur une seconde entrée le paramètre R. Sur la figure 4, le circuit CSC est réalisé au moyen de quatre multiplexeurs MXBO-MXB3 recevant chacun un code c'(j) sur une première entrée et un code NOP sur une deuxième entrée. Chaque multiplexeur est piloté par un signal de validation valO, vall, val2, val3 dont la valeur détermine la sélection du code c' (j) ou du code NOP en sortie du multiplexeur. Les codes de validation sont générés par une cascade de portes ET formant une chaîne de type "Daisy Chain", chaque porte ET recevant en entrée le signal de validation du code précédent et le bit de parallélisme du code reçu par le multiplexeur auquel elle est rattachée. Ainsi, la présence d'un bit de parallélisme à O dans un code c' (j) entraîne le basculement de tous les signaux de validation suivants, de sorte que le code concerné et tous les codes suivants sont remplacés par des codes NOP. Le signal de validation valO du premier code c'(0) est généré par une porte inverseuse car le bit de parallélisme du premier code est en principe toujours égal à O ("/p"). Le multiplexeur MUXBO et le signal de sélection valO du premier code c'(0) sont en principe inutiles puisque le premier code c' (0) n'est, en principe, jamais filtré, une instruction large comprenant au moins un code instruction. Toutefois, la prévision de ce multiplexeur permet de détecter un éventuel défaut de lecture de la mémoire programme ou un défaut de fonctionnement du circuit à décalage PCC, qui apparaît quand le bit de parallélisme du premier code c'(0) est différent de 0. Dans ce cas, le signal de validation valO peut être utilisé en tant que signal d'erreur ERR. Le circuit CSC comprend également un additionneur ADD2 recevant en entrée les quatre signaux de validation valO à val3, dont la sortie délivre la valeur n qui est 19 2812417 appliquée à l'additionneur ADDl pour l'incrémentation du compteur ordinal (fig. 2). L'incrément n est ainsi égal au nombre de signaux de validation égaux à 1, et représente par conséquent le nombre de codes instruction qui n'ont pas été filtrés, c'est-à-dire le nombre effectif de codes que comprend l'instruction large qui vient d'être lue. La présente invention est bien entendu susceptible de diverses variantes et modes de réalisation. Notamment, il est envisageable en pratique d'incorporer le circuit de filtrage CSC dans le décodeur d'instructions IDEC. En effet, la fonction de ce circuit est de garantir que des codes n'appartenant pas à une instruction à exécuter ne seront pas envoyés aux unités d'exécution EUO-EU3. Le filtrage des codes indésirables peut ainsi être fait en aval du registre d'instructions IDEC, par le décodeur IDEC lui-même. De façon générale, l'agencement du circuit CSC dans les étages pipeline est dicté par les contraintes temporelles ("timing") concernant l'accès à la mémoire PMEM1 et par le temps de décodage dans de décodeur IDEC, et relève des compétences de l'homme de l'art. Il apparaîtra clairement à l'homme de l'art que la présente invention offre un large degré de liberté dans la conception d'un processeur de type VLIW. Il est notamment possible, comme on l'a indiqué plus haut, de prévoir un processeur ayant un nombre I de bancs mémoire et un nombre N d'unités d'exécution qui sont différents. Il est également possible de choisir de façon dynamique le nombre N d'unités d'exécution actives, selon l'application visée, en inhibant certaines unités d'exécution pour limiter la consommation de courant. Cette inhibition de certaines unités d'exécution peut être prévue programmable. L'architecture d'un processeur selon l'invention n'étant pas "figée" comme celle d'un processeur VLIW classique, grâce à la suppression de l'obligation de lire en bloc N codes instruction et de 2812417 l'obligation qui en résulte d'injecter des codes NOP dans un programme quand une instruction contient moins de N codes, la présente invention ouvre un large domaine de conception d'un nouveau type de processeurs conciliant5 des exigences de faible consommation, de faible encombrement en termes de surface de silicium, et offrant de hautes performances grâce à un parallélisme élevé. ANNEXE Rappels: I = 4; N= 4 P0 = Quotient PC/I5 R = PC[modulo I] R' = "R" du cycle d'horloge précédent ai = P0+l si i M1-M3) Cycle PC R R' PO aO al a2 a3 c(0) c(1) c(2) c(3) c' (0)c' (1)c' (2)c' (3) c' (0)c' (1)c' (2)c' (3) 1 0 - 0 0 0 0 0... 2 1 1 0 0 1 0 0 0 cO cl c2 c3 cO cl c2 c3 cO NOP NOP NOP 3 3 3 1 0 1 1 1 0 c4 cl c2 c3 cl c2 c3 c4 cl c2 NOP NOP 4 7 3 3 1 2 2 2 1 c4 c5 c6 c3 c3 c4 c5 c6 c3 c4 c5 c6 8 0 3 2 c8 c9... c7 c7 c8 c9... c7 c8 c9 NOP OD 22 2812417 REVENDICATIONS 1. Processeur (20) de traitement du signal prévu pour exécuter des instructions (Il-I4) de taille variable pouvant comprendre jusqu'à N codes instruction élémentaires (c(0)-c(3)), caractérisé en ce qu'il comprend: une mémoire programme (PMEMl) comprenant I bancs mémoire (MO- M3) en parallèle adressables individuellement, I étant au moins égal à N, dans lesquels les codes (cO-c9) d'un programme sont enregistrés de façon entrelacée à raison d'un code par banc et par adresse appliquée au banc, des moyens de lecture (IAC, PCC, CSC) de la mémoire programme agencés pour lire un code dans chacun des I bancs mémoire au cours d'un cycle de lecture d'une instruction, un cycle de lecture d'une instruction (Il) dans la mémoire programme comprenant la lecture d'une suite de codes (cO- c3) comprenant le ou les codes (cO) de l'instruction à lire (Il) et pouvant également comprendre, quand le nombre de codes de l'instruction lue est inférieur à I, des codes (cl-c3) appartenant à une instruction suivante. 2. Processeur selon la revendication 1, caractérisé en ce que les moyens de lecture comprennent des moyens (IAC) pour appliquer aux bancs mémoire des adresses individuelles (aO-a3) générées à partir d'une valeur collective (PC) de compteur ordinal, qui est incrémentée, avant le commencement d'un cycle de lecture d'une instruction, d'une valeur (n) égale au nombre de codes que comprend l'instruction précédente. 3. Processeur selon la revendication 2, caractérisé en ce que les moyens pour appliquer des adresses (IAC) sont agencés pour appliquer à chacun des bancs mémoire 23 2812417 une adresse de lecture individuelle égale à P0 ou PO+l, P0 étant le quotient de la division par I de la valeur du compteur ordinal. 4. Processeur selon la revendication 3, caractérisé en ce que les moyens pour appliquer des adresses (IAC) sont agencés pour: - appliquer à un banc mémoire de rang i une adresse égale à P0 quand i est strictement supérieur à R, ou - appliquer à un banc mémoire de rang i une adresse égale à PO+l quand i est inférieur ou égal à R, R étant le reste de la division par I de la valeur du compteur ordinal. 5. Processeur selon l'une des revendications 1 à 4, caractérisé en ce que les moyens de lecture comprennent des moyens (PCC) pour réorganiser les codes de la suite de codes lue dans la mémoire programme, conformément à l'algorithme suivant: Ic'(j) = c(i) avec i = (j+ R')modulo I] dans lequel "i" et "j" désignent les rangs des codes avant et après réorganisation, c(i) désigne des codes de rang i dans leur agencement après lecture dans la mémoire, c'(j) désigne des codes de rang j après réorganisation, R' étant le reste de la division par I de la valeur que présentait le compteur ordinal au cours du cycle d'horloge précédent. 6. Processeur selon la revendication 5, caractérisé en ce que les moyens pour réorganiser (PCC) sont agencés pour appliquer aux codes de la suite de codes lue dans la mémoire programme une permutation circulaire comprenant un nombre de permutations circulaires élémentaires égal à 24 2812417 R' ou à [I-R'] selon le sens dans lequel est réalisée la permutation circulaire. 7. Processeur selon la revendication 6, caractérisé en ce que les permutations circulaires sont effectuées par un barillet à décalage recevant sur une entrée de commande le paramètre R'. 8. Processeur selon l'une des revendications 1 à 7, caractérisé en ce que les moyens de lecture comprennent des moyens (CSC) pour filtrer les codes (cl-c3) n'appartenant pas à l'instruction à lire (Il), au moyen de bits de parallélisme ("p", "/p") accompagnant les codes. 9. Processeur selon la revendication 8, caractérisé en ce que les codes filtrés sont remplacés par des codes de non-opération (NOP). 10. Processeur selon la revendication 9, dans lequel les moyens de filtrage de codes (CSC) sont agencés pour exécuter l'algorithme suivant: [Pour j = 0, val(j=0) = "v" s(j=0) = c' (j=0); Pour j allant de 1 à I val(j) = "v" si: val(j-l) = "v" et si bit de parallélisme de c' (j)="p", sinon val(j-l) = "/v"; s(j) = c' (j) si val(j) = "v"; s(j) = NOP si val(j) = "/v"] dans lequel val(j) est un terme de validation associé à chaque code c'(j) de rang j, pouvant présenter deux valeurs 'v" et "/v", s(j) désigne des sorties de rang j des moyens de filtrage, correspondant à des entrées de 2812417 même rang recevant un code c' (j), "NOP" est un code de non-opération. 11. Processeur selon l'une des revendications 8 à 10, caractérisé en ce que les codes non filtrés sont envoyés à des unités d'exécution de type RISC (EUO-EU3) agencées en parallèle. 12. Procédé de lecture d'instructions (Il-I4) de taille variable pouvant comprendre jusqu'à N codes instruction élémentaires (c(O)-c(3)), applicable à un processeur de traitement du signal (20), caractérisé en ce qu'il comprend les étapes consistant à: - prévoir une mémoire programme (PMEM1) comprenant I bancs mémoire (MO-M3) en parallèle adressables individuellement, I étant au moins égal à N, - enregistrer les codes (cO-c9) d'un programme dans la mémoire programme (PMEM1) de façon entrelacée, à raison d'un code par banc et par adresse appliquée au banc, et - au cours d'un cycle de lecture d'une instruction, lire dans les I bancs mémoire (MO-M3) une suite de codes (cO- c3) comprenant le ou les codes (cO) de l'instruction à lire (Il) et pouvant également comprendre, quand le nombre de codes de l'instruction lue est inférieur à I, des codes (cl-c3) appartenant à une instruction suivante. 13. Procédé selon la revendication 12, comprenant une étape consistant à appliquer aux bancs mémoire des adresses individuelles (a0-a3) générées à partir d'une valeur collective (PC) de compteur ordinal, qui est incrémentée, avant le commencement d'un cycle de lecture d'une instruction, d'une valeur (n) égale au nombre de codes que comprend l'instruction précédente. 14. Procédé selon la revendication 13, comprenant une étape consistant à appliquer à chacun des bancs mémoire une adresse de lecture individuelle égale à PO ou 26 2812417 P0+1, PO étant le quotient de la division par I de la valeur du compteur ordinal, un banc mémoire de rang i recevant une adresse égale à P0 quand i est strictement supérieur à R, ou une adresse égale à P0+l quand i est inférieur ou égal à R, R étant le reste de la division par I de la valeur du compteur ordinal. 15. Procédé selon l'une des revendications 12 à 14, caractérisé en ce qu'il comprend une étape de réorganisation des codes de la suite de codes lue dans la mémoire programme, conformément à l'algorithme suivant: [c'(j) = c(i) avec i = (j+R')modulo I] dans lequel "i" et "j" désignent les rangs des codes avant et après réorganisation, c(i) désigne des codes de rang i dans leur agencement après lecture dans la mémoire, c'(j) désigne des codes de rang j après réorganisation, R' étant le reste de la division par I de la valeur que présentait le compteur ordinal au cours du cycle d'horloge précédent. 16. Procédé selon l'une des revendications 12 à 15, caractérisé en ce qu'il comprend une étape de filtrage des codes lus (clc3) n'appartenant pas à l'instruction à lire (I1), au moyen de bits de parallélisme ("p", "/p") accompagnant les codes. 17. Procédé selon la revendication 16, caractérisé en ce que des codes filtrés sont remplacés par des codes de non-opération (NOP). 18. Procédé selon la revendication 17, dans lequel les codes sont filtrés conformément à l'algorithme suivant: 27 2812417 [Pour j = 0, val(j=0) = "v" s(j=O) = c' (j=O) Pour j allant de 1 à I val(j) = "v"' si: val(j-1) = "v" et si bit de parallélisme de c' (j)="p", sinon val(j-1) = "/v"; s(j) = c'(j) si val(j) = "v"; s(j) = NOP si val(j) = "/v"] dans lequel val(j) est un terme de validation associé à chaque code c' (j) de rang j, pouvant présenter deux valeurs "v" et "/v", s(j) désigne des sorties de rang j des moyens de filtrage, correspondant à des entrées de même rang recevant un code c' (j), "NOP" est un code de nonopération. 19. Procédé selon l'une des revendications 16 à 18, caractérisé en ce que les codes non filtrés sont envoyés à des unités d'exécution de type RISC (EU0-EU3) agencées en parallèle.