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

OptieBeschrijving
-h, --helpToont het helpbericht en sluit af
-v, --versionToont versie-informatie en sluit af
-R, --recursiveZoekt 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

ToetsActie
Links / RechtsTijdcursor naar voren of achteren verplaatsen
Omhoog / OmlaagFocus omhoog of omlaag verplaatsen
Spatie / EnterEen knoop inklappen of uitvouwen
Q / EscInteractieve 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:

  1. Parsing Pipeline: Verantwoordelijk voor het parsen en analyseren van de VHDL-broncode, waarbij een tussenrepresentatie (intermediate representation) van het ontwerp wordt gegenereerd.
  2. 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.
  3. 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