FDE Tools & Documentation

A compiled list of required tools & software to work on a FDE project and maybe some tips & tricks or solutions to problems.

To work with the FDE board, we mainly need two things:

  • Synopsys DC compiler

    • Highly recommended to use an Intel x86 environment to run the DC virtual machine

    • Running the VM on a AMD processor might cause problems (no guarantee)

    • Also untested on Apple Silicon ARM CPUs (the VM performance would be terrible trying to emulate x86 architecture)

  • FDE workflow (import, map, pack, place, route, etc.)

    • The original FDE software is x86 Windows based

    • Modern version of FDE (UFDE+) is cross-platform compatible

      • Windows

      • MacOS (AARCH tested)

      • Linux (might has bugs?)

    • FDE-CLI (coming soon...)


FDE Tools

As mentioned above,

Original FDE tools (windows) & DC compiler VM

If you experience problems with the modern FDE tools, you can consider using the original FDE tools from 2019 or 2021.

FDE Workflow

UFDE+ (Import, map, pack, place, route, generate bitstream, & program)

  • Typescript & React frontend

  • Rust backend (FDE tools via FFI)

  • Cross-platform

Not found

Rabbit (GUI, virtual components)

  • C++

  • QT Framework

  • Windows, MacOS

Not found

FDE-CLI (CLI for debugging & interacting with FDE board with more advanced features)

  • Rust

  • SMIMS driver implemented in Rust

  • Cross-platform

Not found

Constraints

There are actually two types of IO ports on the FDE board: VeriComm & GPIO (general purpose IO)

VeriComm ports is what the SMIMS engine uses as input and outport ports for its SMIMS API. UFDE's constraints mapping & Rabbit's virtual components all depend on VeriComm ports because those are the only ports that the SMIMS engine can write and read to. SMIMS cannot write or read from other ports, such as GPIO.

VeriComm ports are also separated into two categories: input port and output ports. There roles are obvious, but keep in mind that it does not support inout ports. A port and only be strictly an input port or an output port.

Here is a chart of the SMIMS VeriComm input & output ports:

SMIMS INPUT
Physical Input
SMIMS OUTPUT
Physical Output

clk

P77

input 0

P151

output 0

P7

input 1

P148

output 1

P6

input 2

P150

output 2

P5

input 3

P152

output 3

P4

input 4

P160

output 4

P9

input 5

P161

output 5

P8

input 6

P162

output 6

P16

input 7

P163

output 7

P15

input 8

P164

output 8

P11

input 9

P165

output 9

P10

input 10

P166

output 10

P20

input 11

P169

output 11

P18

input 12

P173

output 12

P17

input 13

P174

output 13

P22

input 14

P175

output 14

P21

input 15

P191

output 15

P23

input 16

P120

output 16

P44

input 17

P116

output 17

P45

input 18

P115

output 18

P46

input 19

P114

output 19

P43

input 20

P113

output 20

P40

input 21

P112

output 21

P41

input 22

P111

output 22

P42

input 23

P108

output 23

P33

input 24

P102

output 24

P34

input 25

P101

output 25

P35

input 26

P100

output 26

P36

input 27

P97

output 27

P30

input 28

P96

output 28

P31

input 29

P95

output 29

P24

input 30

P89

output 30

P27

input 31

P88

output 31

P29

input 32

P87

output 32

P110

input 33

P86

output 33

P109

input 34

P81

output 34

P99

input 35

P75

output 35

P98

input 36

P74

output 36

P94

input 37

P70

output 37

P93

input 38

P69

output 38

P84

input 39

P68

output 39

P83

input 40

P64

output 40

P82

input 41

P62

output 41

P73

input 42

P61

output 42

P71

input 43

P58

output 43

P63

input 44

P57

output 44

P60

input 45

P49

output 45

P59

input 46

P47

output 46

P56

input 47

P48

output 47

P55

input 48

P192

output 48

P167

input 49

P193

output 49

P168

input 50

P199

output 50

P176

input 51

P200

output 51

P187

input 52

P201

output 52

P189

input 53

P202

output 53

P194

For more detailed documentation of both VeriComm & GPIO ports, refer to excel spreadsheet attached below:

VeriComm ports & GPIO documentation

Customizing your constraints file

The constraints file can be automatically generated by UFDE+, but you can also modify the generated constraints file by changing the port name or adding more ports depending on your needs as long as the file follows the XML syntax. The format should be quite straightforward so I will leave it to you to figure out how to create your own constraints file (hint: you only need to add, modify, or delete the <port ...> element & its name & position attributes).

  • The name attribute MUST match a port from your top module (it should match exactly and case sensitive too)

  • The position attribute also MUST match a physical port from the VeriComm documentation

    • The position attribute determines two things:

      • Input or output

      • The physical pin on the FPGA

    • Note: the position attribute can also be a GPIO pin if you wish to explore the unknown


Clocks

The FDE board actually has two onboard clocks:

  • A virtual clock generated by the SMIMS engine (P77)

  • A internal 30MHz clock (P185)

By default, UFDE+ only supports P77 in the constraints config and generation. But if you wish to use the internal clock, you can modify the position of the "clk" port in your constraints file to P185.

P77 — Using SMIMS clock
P185 — Using 30MHz clock

NOTE: Using the 30MHz clock to drive the FPGA, you will have to manage cross-clock domain data sharing because the SMIMS engine will be running at a different frequency than the internal clock, the engine is not in sync with the FPGA when writing to & sampling from the input and output pins (it would be a magnitude of times slower). You might have to consider using an asynchronous FIFO.


Common problems

Last updated