Commit f474ef1d authored by Andy XU's avatar Andy XU
Browse files

vpu verbose description

parent 06abf8ba
......@@ -31,11 +31,11 @@
## Utilisation des branches
Afin de pouvoir travailler à plusieurs sur des versions différentes du projet, il peut être utile d'utiliser des branches.
Cette fonctionnalité de git permet de développer en parallèle des fonctionnalités et/ou blocs différents dans un même projet mais sans entrer en conflit.
Afin de pouvoir travailler à plusieurs sur des versions différentes du projet, il peut être utile d'utiliser des branches.
Cette fonctionnalité de git permet de développer en parallèle des fonctionnalités et/ou blocs différents dans un même projet mais sans entrer en conflit.
Voici ci-dessous une liste des différentes commandes pour travailler simplement avec les branches.
Premièrement, il est nécessaire de créer une branche pour chaque version du projet.
Premièrement, il est nécessaire de créer une branche pour chaque version du projet.
Ceci ne doit être effectué qu'une seule fois au début:
```
git checkout -b <nom-de-la-branche>
......
......@@ -31,14 +31,14 @@ Enfin, GtkWave pour visualiser les chronogrammes:
- build.sbt: fichier de configuration de l'outil sbt.
### Conception
Un exemple de module nommé Adder est présent dans le fichier *src/main/scala/adder/adder.scala*.
Un exemple de module nommé Adder est présent dans le fichier *src/main/scala/adder/adder.scala*.
Pour générer le Verilog correspondant, le format de la commande du terminal est le suivant:
```
sbt "runMain <nom-librairie>.<nom-design> --target-dir <destination>"
```
*--target-dir* esy une option permettant de choisir le répertoire où sera généré le module Verilog correspondant.
*--target-dir* esy une option permettant de choisir le répertoire où sera généré le module Verilog correspondant.
Dans l'exemple Adder, il est possible de générer le module Verilog avec la commande suivante:
```
......@@ -48,8 +48,8 @@ Dans l'exemple Adder, il est possible de générer le module Verilog avec la com
Dans le répertoire *output/*, on trouve alors un fichier *Adder.v* correspondant au module décrit dans le fichier Chisel.
### Simulation
De la même manière qu'en Verilog ou VHDL, le langage contient des commandes dédiées pour réaliser des testbenchs.
Deux exemples existent ici pour le module Adder dans *src/test/scala/adder/test0.scala* et *src/test/scala/adder/test1.scala*.
De la même manière qu'en Verilog ou VHDL, le langage contient des commandes dédiées pour réaliser des testbenchs.
Deux exemples existent ici pour le module Adder dans *src/test/scala/adder/test0.scala* et *src/test/scala/adder/test1.scala*.
Il est possible d'exécuter individuellement un test avec la commande suivante:
```
......@@ -63,16 +63,16 @@ Dans l'exemple Adder, on a donc le choix entre deux tests différents:
sbt "test:runMain vpu.example.AdderTest1 --target-dir output"
```
On retrouve alors les résultats dans le répertoire *output/*.
Les chronogrammes correspondants à chaque test se trouvent dans des fichiers *.vcd*.
On retrouve alors les résultats dans le répertoire *output/*.
Les chronogrammes correspondants à chaque test se trouvent dans des fichiers *.vcd*.
Pour les visualiser, il est alors nécessaire d'utiliser l'outil **GtkWave**:
```
gtkwave <chemin-vcd>/<fichier>.vcd
```
Le Chisel fournit également une infrastructure pour effectuer des tests unitaires.
Cela permet donc de lancer rapidement l'ensemble des tests et de s'assurer que tout fonctionne correctement après une modification.
Le Chisel fournit également une infrastructure pour effectuer des tests unitaires.
Cela permet donc de lancer rapidement l'ensemble des tests et de s'assurer que tout fonctionne correctement après une modification.
Le format de la commande est le suivant:
```
......@@ -86,17 +86,16 @@ Pour lancer l'exécution des tests, il faut alors utiliser la commande suivante:
testOnly vpu.example.UnitTester"
```
Ici, le répertoire de destination *output* est spécifié directement dans le fichier.
Ici, le répertoire de destination *output* est spécifié directement dans le fichier.
On retrouve ensuite dans le terminal le résultat des différents tests.
### Références
- Langage Chisel :
- [Informations](https://github.com/freechipsproject/chisel3)
- [Livre tutoriel](https://github.com/schoeberl/chisel-book)
- [Tutoriel](https://github.com/ucb-bar/chisel-tutorial)
- [Livre tutoriel](https://github.com/schoeberl/chisel-book) [(pdf)](http://www.imm.dtu.dk/~masca/chisel-book.pdf)
- [Bootcamp](https://mybinder.org/v2/gh/freechipsproject/chisel-bootcamp/master)
- VPU et RISC-V:
- [Spécification RISC-V](docs/riscv-spec.pdf)
- [Spécification RISC-V "V" Vector](docs/riscv-v-spec-1.0.pdf)
- Livre architecture: Computer Organization and Design RISC-V Edition
- Livre architecture: [Computer Organization and Design RISC-V Edition (pdf)](http://home.ustc.edu.cn/~louwenqi/reference_books_tools/Computer%20Organization%20and%20Design%20RISC-V%20edition.pdf)
# VPU
## Specs def (Extension V)
- vector registers: 32reg _(v0-v31)_
- VLEN: vector register length = 128 bits
- ELEN: maximum size in bits of a vector element = 64 bits
- SEW: selected element width _(8, 16, 32, 64)_
- LMUL: length multiplier _(1/8, 1/4, 1/2, 1, 2, 4, 8)_
- EEW: effective element width
- VL: vector length = number of element
- AVL: application vector length = total number of element app want to be processed
- VLMAX: maximal vector length = max number of element hardware can process at one time
> VLMAX = LMUL*VLEN/SEW
### Units
- CSRs: Control Status Registers
[x] _@0x008_ vstart: vector start position _(7bits)_
[ ] _@0x00A_ vxsat: Fixed-Point Saturate Flag _(1bit)_
[ ] _@0x00F_ vxrm: Fixed-Point Rounding Mode _(2bits)_
[ ] _@0x00F_ vcsr: Vector control and status register _(vxsat+vxrm)_
[x] _@0xC20_ vl: vector length
[x] _@0xC21_ vtype: vector data type register _[lmul(3bits), sew(3bits), vta(1bit), vma(1bit)]_
[x] _@0xC22_ vlenb: vector length in byte _(VLEN/8=16)_
- Register controler (RegFile): addresses vector registers
---
## Implementation
### vset{i}vl{i}
1. Decode instruction: @vl_dest, @avl/#AVL, vtype setting (#imm) / vtype value (@rs2)
2. Modify vtype accordingly _(sew, lmul, vma, vta)_
3. Compare AVL with hardware capability (VLMAX)
4. Return computable vl
### ADD
1. Decode instruction: @vd, @vs2, @rs1/@vs1
2. Check used vl and vtype _(sew, lmul)_
3. Feed operands with correct EEW to ALU
4. Compute #VL EEW elements
> for(#VL): vd[i] = v1[i] + v2[i]
5. Return result in vd
### LOAD
1. Decode instruction: @vd, width, @rs1 _{@rs2(stride)/@vs2(offset)}_
2. Check used vl
3. Retrieve #VL width sized elements at @rs1 in memory {every #r2 byte}
> for(#VL): vd[i] = mem[@rs1 + i {+r2}]
4. Return result in vd
### STORE
1. Decode instruction: @vs3, width, @rs1 _{@rs2(stride)/@vs2(offset)}_
2. Check used vl
3. Store #VL width sized elements from vs3 to @rs1 in memory
> for(#VL): mem[@rs1 + i {+r2}] = v3[i]
---
## Questions
- **Control unit**
Need for instructions gathering unit for further redirection
- **Number of fonctionnal unit**
Simultaneous execution of multiple elements (SIMD) to improve performance
How to feed the correct element for each unit at each time
- **Pipeline**
Increase performance with chaining
Sequencer for instruction parallelism and data conflict
- **VL**
How to process n element in vector register
> loop #VL times for each address of each element
- **EEW**
How to modulate size of an element in vector register
> consider each vector register as 16\*8bits registers
How to address one element at a time
> address one element by grouping each byte according to need
- **BUS (64bits)**
Number of buses: number of data bus for parallel execution
> at least one data bus for each functional unit
How to map registers with modular size elements to units (8-64bits)
> demux for each bit
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment