Pulse is een in C++ geschreven multiplatform simulatie-engine voor VHDL, waarmee VHDL-broncode kan worden getransformeerd naar een simulatiemodel van logische componenten voor debugging-doeleinden.
Technische werking De software maakt gebruik van een volledige compilatiepijplijn (lexer, AST-parser, semantische analyse en linker) en een efficiënte dataflow-simulatie-engine. Deze engine ondersteunt multi-waarde IEEE 1164-logische toestanden en asynchrone processen. De resultaten worden gepresenteerd als waveforms in een interactieve Terminal User Interface (TUI).
Installatie en Gebruik Voor installatie zijn een C++20 compiler en CMake vereist. Pulse wordt bediend via de command-line, waarbij gebruikers opties hebben om recursief te zoeken naar bestanden, de top-level entity te specificeren en de simulatietijd te bepalen.
Ondersteuning en Roadmap Momenteel ondersteunt Pulse diverse signaaltypes (zoals std_logic), architecturen, processen met gevoeligheidslijsten en diverse logische en rekenkundige operatoren. Toekomstige verbeteringen omvatten:
- Ondersteuning voor generics en complexere VHDL-constructies.
- Een optionele web-gebaseerde GUI (bijv. met React).
- Ondersteuning voor Verilog en mixed-language simulaties.
Pulse
De software beschikt over een volledige VHDL-compilatiepijplijn, inclusief een lexer, AST-parser, semantische analyse en een multi-file AST-linker om complexe module-hiërarchieën op te lossen. Het resulterende ontwerp wordt gebouwd met een hoogefficiënte dataflow-simulatie-engine die multi-waarde IEEE 1164-logische toestanden en asynchrone processen ondersteunt.
Het resultaat is een waveform die wordt weergegeven in een interactieve terminal-gebaseerde gebruikersinterface (TUI), waardoor gebruikers door de simulatieresultaten kunnen navigeren en signaalwaarden op verschillende tijdstappen kunnen inspecteren.
Installatie
Voorvereisten
Om Pulse te kunnen bouwen, moeten de volgende tools op uw systeem zijn geïnstalleerd:
- C++20 Compiler
- CMake (v3.14 of hoger)
Bouwinstructies
Begin met het klonen van de repository en het navigeren naar de projectmap:
git clone https://github.com/oscar30gt/pulse.git
cd pulse
Configureer en bouw het project vervolgens met cmake:
cmake -B build
cmake --build build --config Release
De resulterende binaries bevinden zich in build/bin.
Gebruik
Het pulse binary kan vanuit de opdrachtregel worden uitgevoerd door de VHDL-projectmap als argument mee te geven:
./build/bin/pulse test-project
Opties voor de opdrachtregel
| Optie | Beschrijving |
-h, --help | Toont het helpbericht en sluit af |
-v, --version | Toont versie-informatie en sluit af |
-R, --recursive | Zoekt recursief naar VHDL-bestanden in submappen |
--top <entity> | Specificeert de top-level entity om te simuleren (standaard: top) |
--end <time> | Specificeert de eindtijd van de simulatie (standaard: 1000fs) |
--arch <arch> | Specificeert de architectuur om te bouwen (standaard: behavioral) |
Voorbeelden
# Voer simulatie uit op een projectmap (standaard top-level entity "top")
$ pulse ./examples/counter
# Specificeer top-level entity, simulatie-architectuur en eindtijd
$ pulse ./examples/counter --top CounterTop --arch Behavioral --end 2000fs
# Zoek recursief naar VHDL-bronbestanden
$ pulse ./examples/my_project -R
Let op: Deze voorbeelden gaan ervan uit dat het pulse-binary in uw huidige pad staat. Daarnaast is er geen examples-map in deze repository opgenomen; dit is enkel een gebruiksvoorbeeld.
TUI-besturing
| Toets | Actie |
| Links / Rechts | Tijdcursor naar voren of achteren verplaatsen |
| Omhoog / Omlaag | Focus omhoog of omlaag verplaatsen |
| Spatie / Enter | Een knoop inklappen of uitvouwen |
| Q / Esc | Interactieve debugger afsluiten |
Ondersteunde Syntaxis
De VHDL-taal is zeer uitgebreid. Hieronder volgt een lijst van de syntaxis die momenteel wordt ondersteund in Pulse:
- Libraries: Voor compatibiliteit met andere VHDL-simulatoren geeft Pulse geen compilerfouten bij het gebruik van libraries, maar library-declaraties worden genegeerd.
- Signaaltypes: IEEE 1164 logische types worden native ondersteund, inclusief
stdlogic and stdlogic_vector. Voor vectorbereiken kunnen to en downto worden gebruikt.
- Architecturen: Architecturen kunnen component-declaraties, signaaldeclaraties, processen, combinatorische statements en component-instantiaties bevatten.
- Signaaldeclaraties: Werkt hetzelfde als bij ports. Geldige types zijn
stdlogic en stdlogic_vector; standaardwaarden worden momenteel niet ondersteund.
- Signaaltoewijzingen: Toewijzingen met behulp van de
<= operator. Toewijzingen kunnen worden gedaan aan een enkel bit of een bereik van het doelsignaal.
- Processen: Processen met gevoeligheidslijsten (sensitivity lists) en
wait-statements. Voorwaardelijke statements met if, elsif en else worden ondersteund. Toegestane wait-statements zijn WAIT FOR <time> en WAIT (forever). Loops en case-statements worden in de toekomst toegevoegd.
- Component-instantiaties: Component-instantiaties met port-mappings. Port-mappings worden op naam gedaan; positionele port-mapping wordt niet ondersteund.
- Functies: De type-conversiefuncties
signed() en unsigned() worden ondersteund voor vergelijkingen en rekenkundige bewerkingen.
- Operatoren:
- Logisch:
and, or, not, xor, nand, nor, xnor
- Shifts:
sll, srl, sra, rol, ror
- Rekenkundig:
+, -, *
- Vergelijking:
=, /=, <, >, <=, >=
- Concatenatie:
&
- Tijdeenheden: Eenheden van femtoseconden tot seconden (
fs, ps, ns, us, ms, s). Tijdwaarden kunnen worden gespecificeerd als integers of floating-point getallen.
- Commentaren: Enkelregelige commentaren met
--.
- Bestandsextensies: Bij het zoeken naar VHDL-bestanden worden bestanden met de extensies
.vhd en .vhdl meegenomen.
In de toekomst zullen meer functies worden toegevoegd, waaronder ondersteuning voor generics, sequentiële logica en complexere VHDL-constructies.
Compilatiepijplijn
De compilatiepijplijn van Pulse bestaat uit de volgende fasen:
- Parsing Pipeline: Verantwoordelijk voor het parsen en analyseren van de VHDL-broncode, waarbij een tussenrepresentatie (intermediate representation) van het ontwerp wordt gegenereerd.
- Engine Core: Neemt de tussenrepresentatie en bouwt voor elk component in het ontwerp een "blueprint". De blueprint beschrijft het fysieke circuit (een graaf bestaande uit poorten, comparatoren, draden, etc.) dat het VHDL-ontwerp implementeert. De blueprint wordt gebruikt om een functionele versie van het ontwerp te instantiëren.
- Debugging & Visualization: Een gesimuleerd circuit produceert een waveform, die representeert hoe signalen in de tijd veranderen. Deze waveform wordt weergegeven in een interactieve terminal-gebaseerde UI waar waarden op verschillende tijdstappen kunnen worden geïnspecteerd.
Roadmap
Pulse zal in de loop van de tijd verder evolueren. De volgende functies en verbeteringen zijn gepland:
- Uitgebreide ondersteuning voor VHDL-constructies, inclusief generics, types en complexere logica.
- Verbeterde simulatie-engine voor betere prestaties en ondersteuning voor grotere ontwerpen.
- Verbeterde TUI met meer interactieve functies en betere visualisatie-opties.
- Een optionele web-gebaseerde GUI voor waveform-visualisatie met een modern webframework zoals React.
- Verilog-ondersteuning en uiteindelijk mogelijkheden voor simulatie in gemengde talen (VHDL + Verilog).
Licentie
MIT
Pulse
De software beschikt over een volledige VHDL-compilatiepijplijn, inclusief een lexer, AST-parser, semantische analyse en een multi-file AST-linker om complexe module-hiërarchieën op te lossen. Het resulterende ontwerp wordt gebouwd met een hoogefficiënte dataflow-simulatie-engine die multi-waarde IEEE 1164-logische toestanden en asynchrone processen ondersteunt.
Het resultaat is een waveform die wordt weergegeven in een interactieve terminal-gebaseerde gebruikersinterface (TUI), waardoor gebruikers door de simulatieresultaten kunnen navigeren en signaalwaarden op verschillende tijdstappen kunnen inspecteren.
Installatie
Voorvereisten
Om Pulse te kunnen bouwen, moeten de volgende tools op uw systeem zijn geïnstalleerd:
- C++20 Compiler
- CMake (v3.14 of hoger)
Bouwinstructies
Begin met het klonen van de repository en het navigeren naar de projectmap:
git clone https://github.com/oscar30gt/pulse.git
cd pulse
Configureer en bouw het project vervolgens met cmake:
cmake -B build
cmake --build build --config Release
De resulterende binaries bevinden zich in build/bin.
Gebruik
Het pulse binary kan vanuit de opdrachtregel worden uitgevoerd door de VHDL-projectmap als argument mee te geven:
./build/bin/pulse test-project
Opties voor de opdrachtregel
| Optie | Beschrijving |
-h, --help | Toont het helpbericht en sluit af |
-v, --version | Toont versie-informatie en sluit af |
-R, --recursive | Zoekt recursief naar VHDL-bestanden in submappen |
--top <entity> | Specificeert de top-level entity om te simuleren (standaard: top) |
--end <time> | Specificeert de eindtijd van de simulatie (standaard: 1000fs) |
--arch <arch> | Specificeert de architectuur om te bouwen (standaard: behavioral) |
Voorbeelden
# Voer simulatie uit op een projectmap (standaard top-level entity "top")
$ pulse ./examples/counter
# Specificeer top-level entity, simulatie-architectuur en eindtijd
$ pulse ./examples/counter --top CounterTop --arch Behavioral --end 2000fs
# Zoek recursief naar VHDL-bronbestanden
$ pulse ./examples/my_project -R
Let op: Deze voorbeelden gaan ervan uit dat het pulse-binary in uw huidige pad staat. Daarnaast is er geen examples-map in deze repository opgenomen; dit is enkel een gebruiksvoorbeeld.
TUI-besturing
| Toets | Actie |
| Links / Rechts | Tijdcursor naar voren of achteren verplaatsen |
| Omhoog / Omlaag | Focus omhoog of omlaag verplaatsen |
| Spatie / Enter | Een knoop inklappen of uitvouwen |
| Q / Esc | Interactieve debugger afsluiten |
Ondersteunde Syntaxis
De VHDL-taal is zeer uitgebreid. Hieronder volgt een lijst van de syntaxis die momenteel wordt ondersteund in Pulse:
- Libraries: Voor compatibiliteit met andere VHDL-simulatoren geeft Pulse geen compilerfouten bij het gebruik van libraries, maar library-declaraties worden genegeerd.
- Signaaltypes: IEEE 1164 logische types worden native ondersteund, inclusief
stdlogic and stdlogic_vector. Voor vectorbereiken kunnen to en downto worden gebruikt.
- Architecturen: Architecturen kunnen component-declaraties, signaaldeclaraties, processen, combinatorische statements en component-instantiaties bevatten.
- Signaaldeclaraties: Werkt hetzelfde als bij ports. Geldige types zijn
stdlogic en stdlogic_vector; standaardwaarden worden momenteel niet ondersteund.
- Signaaltoewijzingen: Toewijzingen met behulp van de
<= operator. Toewijzingen kunnen worden gedaan aan een enkel bit of een bereik van het doelsignaal.
- Processen: Processen met gevoeligheidslijsten (sensitivity lists) en
wait-statements. Voorwaardelijke statements met if, elsif en else worden ondersteund. Toegestane wait-statements zijn WAIT FOR <time> en WAIT (forever). Loops en case-statements worden in de toekomst toegevoegd.
- Component-instantiaties: Component-instantiaties met port-mappings. Port-mappings worden op naam gedaan; positionele port-mapping wordt niet ondersteund.
- Functies: De type-conversiefuncties
signed() en unsigned() worden ondersteund voor vergelijkingen en rekenkundige bewerkingen.
- Operatoren:
- Logisch:
and, or, not, xor, nand, nor, xnor
- Shifts:
sll, srl, sra, rol, ror
- Rekenkundig:
+, -, *
- Vergelijking:
=, /=, <, >, <=, >=
- Concatenatie:
&
- Tijdeenheden: Eenheden van femtoseconden tot seconden (
fs, ps, ns, us, ms, s). Tijdwaarden kunnen worden gespecificeerd als integers of floating-point getallen.
- Commentaren: Enkelregelige commentaren met
--.
- Bestandsextensies: Bij het zoeken naar VHDL-bestanden worden bestanden met de extensies
.vhd en .vhdl meegenomen.
In de toekomst zullen meer functies worden toegevoegd, waaronder ondersteuning voor generics, sequentiële logica en complexere VHDL-constructies.
Compilatiepijplijn
De compilatiepijplijn van Pulse bestaat uit de volgende fasen:
- Parsing Pipeline: Verantwoordelijk voor het parsen en analyseren van de VHDL-broncode, waarbij een tussenrepresentatie (intermediate representation) van het ontwerp wordt gegenereerd.
- Engine Core: Neemt de tussenrepresentatie en bouwt voor elk component in het ontwerp een "blueprint". De blueprint beschrijft het fysieke circuit (een graaf bestaande uit poorten, comparatoren, draden, etc.) dat het VHDL-ontwerp implementeert. De blueprint wordt gebruikt om een functionele versie van het ontwerp te instantiëren.
- Debugging & Visualization: Een gesimuleerd circuit produceert een waveform, die representeert hoe signalen in de tijd veranderen. Deze waveform wordt weergegeven in een interactieve terminal-gebaseerde UI waar waarden op verschillende tijdstappen kunnen worden geïnspecteerd.
Roadmap
Pulse zal in de loop van de tijd verder evolueren. De volgende functies en verbeteringen zijn gepland:
- Uitgebreide ondersteuning voor VHDL-constructies, inclusief generics, types en complexere logica.
- Verbeterde simulatie-engine voor betere prestaties en ondersteuning voor grotere ontwerpen.
- Verbeterde TUI met meer interactieve functies en betere visualisatie-opties.
- Een optionele web-gebaseerde GUI voor waveform-visualisatie met een modern webframework zoals React.
- Verilog-ondersteuning en uiteindelijk mogelijkheden voor simulatie in gemengde talen (VHDL + Verilog).
Licentie
MIT