====== Tools ======
* **JTAG** \\ Joint Test Action Group
* **XSR** \\ Xilinx Synthesis Technology
* **RTL** \\ Register Transfer Level
===== IDE =====
Projekt anlegen
* **Family:** Spartan3E
* **Device:** XC3S500E
* **Package:** FG320
* **Speed:** -4
* **Preferred Language:** VHDL
===== Compilation =====
==== Files ====
* **UCF** \\ User Constraint File
* **NGC** \\ Native Generic Circuit: Netlist = Kombination aus ... (bei anderen Herstellern getrennt) (Technology Viewer: LUTs, carry logic, I/O buffers)
* **EDIF**: logical design
* **NCF**: constraints
* **NGD** \\ Natice Generic Datatbase: Xilinx primitives
* **NCD** \\ Native Circuit Description: FPGA components (FPGA Editor)
* **NGR** (RTL Editor: Adders, multipliers, counters, AND gates, and OR gates)
* **SDF** \\ Standard Delay Format: Delays bei post-map (Komponenten) und post-route (Komponenten + Leitungen) simulationen
==== Refinement process ====
%%=%% Verbesserungsprozess
* synthesis (= logic synthesis)
* VHDL => NGC (Netlist)
* HDL Parsing: Syntax check
* HDL Synthesis: Komponenten identifizieren (RAM, Arithmetic, ...), Finite State Machine (FSM) identifizieren
* Low Level Optimization: Constraints beachten, Komponenten Identifizieren (RAM, Arithmetic, ...)
* implementation
* Translate
* NGC (Netlist) + Constraints => NGD (Xilinx primitives)
* Map
* NGD (Xilinx primitives) => NCD (FPGA components)
* Place and route
* NCD => NCD
* device configuration
* NCD => Bitstream
==== Validation process ====
Libs haben unterschiedliche Komponenten
* UNISIM: implementation & functional simulation
* SIMPRIM: timing simulation (kann nicht impementiert werden)
Phasen
* RTL simulation
* functional simulation
* Behavioral simulation
* timing simulation
* post-translate simulation (unterschied zu Behavioral simulation bei RSFF im Forbidden state: keine oszilation)
* post-map simulation
* post-rote simulation
===== Optimierung =====
==== Speed ====
=== Kritischer Pfad ===
Größter delay zwischen zwei FFs
=== Durchsatz ===
Wie //viele// kommen //pro Zeit// druch
* Lösungsschritte
- loop unrolling
- Pipelining (Mehr Register auf Kritischen Pfad)
* Register ausbalancieren (FFs gleichmäsig verteilen)
* Latzen bleibt gleich
=== Latenz ===
//Zeit// die //ein Datum// benötigt um //komplett bearbeitet// zu werden.
* Lösung
* Parallelisierung
* Logical short cuts
* Pipelines entferenen (also deren FFs, loop unrolling bleibt)
=== timing ===
//CPU Tackt//
* Pipelining (Mehr Register auf Kritischen Pfad)
* Parallelisierung
* Register ausbalancieren
==== Fläche ====
* Kein unrolling
* controll-based logic reuse
* controll logic mit
* Multiplexer
* state machines
* controll logic sollte kleiner sein als der gewinn
* resource sharing
* Komponenten näher an die wurzel bringen um sie (teilweise) von verschieden kompenenten nutze zu können
* Hard macros verwenden
===== Simulation =====
- Analysis
* Syntax
* Semantik
* unit => library
- Elaboration
* Hierarchie/Baum aufbauen
* ''component''s auflösen/instanziieren
* ''component'' => Baum aus ''process'' & ''signal''
- Execution
- initialization phase
- signal = default value
- process.start()
- Ende
* Alle Prozesse ''wait''
* Keine Signaländerungen
* Timeout, gesetzt von user
* functional simulatuion (synthesized)
* timing simulation (implemented)
===== Testbench =====
* top level module for simulation
* Leere entity (da signale selbst erzeugt werden)
* Nicht synthesierbar
library ieee;
use ieee.std_logic_1164.all;
entity testbench is
end testbench;
architecture tests of testbench is
component testee
port(...);
end component;
signal clk : std_logic;
begin
instance1: testee
port map(...);
end tests;
==== Stimuli ====
* Prozess des testbench
clkGen : process
begin
clk <= '1';
wait for 10 ns;
clk <= '0';
wait for 10 ns;
end process;
===== User Constraint File =====
* Nötig für Implementation
* Semikolon am Ende
* ''std_logic_vector sw(0)'' -> ''sw<0>''
* **INST** (instance): design components, macro cells, modules
* **NET**: signals und ports von entities
* **PIN**
^ Positionierung ^^^^^
^ NET ^ INST ^ PIN ^ Example ^ Kommentar ^
| X | X | | ''NET "sw<0>" LOC = A1 %%|%% DRIVE = 2 %%|%% FAST;'' | |
| X | X | | ''INST "instanceName" LOC = SLICE_X2Y2;'' | |
| X | X | | ''INST "instanceName" LOC = SLICE_X2Y2:SLICE_X3Y6;'' | |
| X | X | | ''INST "instanceName" LOC = RAMB16_x0_y6;'' | |
^ Timing ^^^^^
^ NET ^ INST ^ PIN ^ Example ^ Kommentar ^
| X | X | X | ''NET "reset" TIG;'' | Timing IGnore |
| X | X | X | ''INST "ff" TNM "ffs";'' | Timing NaMe: Element -> Gruppe |
| | | | ''TIMEGRP "superGroup" = "subGroup1" "subGroup2";'' | Timing Group: Gruppen -> Gruppe |
| | | | ''TIMESPEC "TS1" = FROM "groupA" TO "groupB" 5 ns;'' | Timing Specification: \\ Zeit zwischen Gruppen. \\ Muss mit "TS..." anfangen! |
^ Elektrisches ^^^^^
^ NET ^ INST ^ PIN ^ Example ^ Kommentar ^
| X | X | | ''NET "sw<0>" IOSTANDARD = lvTTL;'' | |
| X | X | | ''NET "sw<0>" IOSTANDARD = lvCMOS12;'' | |
| X | X | | ''NET "sw<0>" IOSTANDARD = lvCMOS15;'' | |
| X | X | | ''NET "sw<0>" IOSTANDARD = lvCMOS18;'' | |
| X | X | | ''NET "sw<0>" IOSTANDARD = lvCMOS25;'' | |
| X | X | | ''NET "sw<0>" IOSTANDARD = lvCMOS33;'' | |
| X | X | | ''NET "sw<0>" DRIVE = {2,4,6,8,12,16,24};'' | Default: 12mA|
| X | X | | ''NET "sw<0>" FAST;'' | More Power & Noise |
| X | X | | ''NET "sw<0>" SLOW;'' | Flanken drosselung |
| X | | | ''NET "sw<0>" PULLUP;'' | |
| X | | | ''NET "sw<0>" PULLDOWN;'' | |