Which error did you get?
Every wall hit while setting up the chain on a Mac, in the order of the guide, filed under the exact line the terminal printed. Press Cmd F and paste a piece of your error. Two of them, sections 3.1 and 3.4, print no error line; they are the places you get stuck with nothing to search for.
the obvious first try, 497 MB later. YosysHQ's bundle ships nextpnr for ice40, ecp5, nexus and Gowin. Not Xilinx.
pip, with Homebrew's Python on macOS. PEP 668. Homebrew's Python refuses a plain pip install. The chain needs a venv.
nextpnr-xilinx, while compiling on macOS. nextpnr's default build asks Apple's clang for OpenMP, which it does not have.
nextpnr-xilinx, the first time you run it. There is no prebuilt chipdb. It is generated per device from the prjxray data.
CMake, while configuring prjxray. prjxray was cloned without --recursive, so its submodules are empty.
CMake 4, while configuring prjxray. prjxray is written for an older CMake. CMake 4 refuses it without a policy flag.
make, on a Makefile copied from a PDF or a web page. The recipe lines lost their Tab characters when you copied them.
dewfpga bit, the XDC check before place and route (nextpnr alone prints the raw form below). A port in your design has no pin in the .xdc file. nextpnr names the wrong port.
dewfpga bit, the source scan before the tools run (Yosys alone prints the raw form below). The course's seven-segment module has a broken port line. Vivado accepts it, Yosys does not.
openFPGALoader, when you program the board. The programmer could not open the Basys3 USB interface. Check physical connection and, if macOS sees the device, the programming process's USB access.
dewfpga, before anything runs. The word after dewfpga is not one of its commands (install, check, new, sim, bit, flash, clean, uninstall).
dewfpga bit / sim / flash / install, before anything runs. A word starting with - after the command, or an argument after install: the commands take a module or file name at most, install takes nothing.
dewfpga sim / bit, before anything runs. The current folder holds no .sv or .v file; dewfpga works on the files in the folder you run it in.
dewfpga sim / bit, before anything runs. The argument holds a slash: the CLI takes a module or a file name in the current folder, not a path.
dewfpga sim / bit, before anything runs. A .sv, .v or .xdc file name with a space in it; yosys, iverilog and nextpnr take file lists split at spaces.
dewfpga, before anything runs. The CLI's own folder or FPGA_HOME has a space in its path; the build scripts hand those paths to make and the tools unquoted.
dewfpga sim / bit, before anything runs. The file starts with the three invisible bytes EF BB BF that Notepad and some editors write; yosys reads them as a token it does not know.
dewfpga new. The folder dewfpga new was told to create is already there; it never overwrites a design.
dewfpga bit / flash, before synthesis. The folder has no .xdc and some ports have names the board does not use, so nothing says which pin they go to; ports with the board's names get their pins without a file.
dewfpga bit / flash, before synthesis. Several .xdc files in the folder and none named after the top module; the CLI does not guess which one is the pin file.
dewfpga sim, before iverilog. No module without ports instantiates the top module, so there is nothing to simulate it with.
dewfpga sim / bit, before anything runs. The source scan ended without a top module and without a reason; naming the module on the command line settles it.
dewfpga check, or dewfpga bit / flash before synthesis. nextpnr-xilinx, the chip database or another tool is not under FPGA_HOME; the build needs all of them.
dewfpga check. The second reader is a plugin compiled against one yosys; after brew upgrade yosys it no longer loads.
dewfpga uninstall. FPGA_HOME points at your home folder or /; uninstall deletes what install.sh put under FPGA_HOME and will not touch those.
dewfpga uninstall. Not an error: uninstall found none of the six entries install.sh writes under FPGA_HOME.
dewfpga run / sim / bit, the source preparation before the tools run. Not an error: a port list in Vivado's netlist form names a port with an expression, .dp(\<const0> ), which Vivado builds and yosys' reader does not; the copy the tools read writes it as a plain port.
dewfpga run / sim / bit, the source scan before the tools run. A module's endmodule is missing or misspelled, so the module never ends; the scan stops here instead of naming the wrong top.
dewfpga sim / bit, the source scan before the tools run. Two or more design modules that nothing instantiates; the CLI does not pick one by file name (Lab 4 folders name the file after the wrong one).
dewfpga sim / bit, the source scan before the tools run. The module named on the command line has no ports, so it is a testbench; a bitstream needs a design with ports.
dewfpga sim / bit, the source scan before the tools run. The name on the command line is neither a module nor a file of this folder.
dewfpga sim / bit, the source scan before the tools run. Every module in the folder has no ports; there is nothing to build.
dewfpga sim / bit, the source scan before the tools run. Two files in the folder declare the same module; the tools would take the last one read, so a backup could be built instead of the design.
dewfpga sim / bit, the source scan before the tools run. A $finish or $stop inside a module with ports; there is no hardware for it, and yosys stops on it where Vivado drops it.
dewfpga sim / bit, the source scan before the tools run. `logic [3:0] sum = sw[3:0] + sw[7:4];` sets a power-up value from a signal; it is not a continuous assignment, and the board would show the value from time 0 forever.
dewfpga sim / bit, the source scan before the tools run. `inv(sw[0], led[0]);`, an instance without a name: Vivado accepts it, the standard and yosys do not, so the CLI names it u_inv in a temporary compiler copy and says so. Your saved source stays unchanged.
dewfpga sim / bit, the source scan before the tools run. A .v file whose header says it is a Vivado post-synthesis simulation netlist sits next to the sources; it is not a design and yosys cannot read it.
dewfpga bit, the XDC check before place and route. A port of the top module has no PACKAGE_PIN line in the XDC: the line is commented out, the index is missing, the name differs.
dewfpga bit, the XDC check before place and route (nextpnr alone prints the raw line below, with no file:line). A PACKAGE_PIN in the XDC names a pin the chip does not have: a typo, a pin of another board, a power pin, or a pin written in small letters (w5).
dewfpga bit, the XDC check before place and route (nextpnr alone prints the raw lines below). Two ports of the design have the same PACKAGE_PIN in the XDC: a copied line whose pin was not changed.
dewfpga bit, the XDC check before place and route. A get_ports with a wildcard, a list of several ports or an option (-regexp, -filter): Vivado expands those, this check reads one full port name per line.
dewfpga bit, the XDC check before place and route. An XDC line names a port that differs from the design's only in case; names are case-sensitive, so the line pins nothing.
dewfpga sim, iverilog. iverilog stopped with an error; its own lines are above, and this line names the first of them.
dewfpga sim, after iverilog refused a line of the design. Not an error: iverilog refused a construct in the design, so the testbench ran against the design as the build elaborates it, read by the reader the note names.
dewfpga sim, after iverilog refused a line of the design. iverilog refused the design and the testbench sets the top module's parameters; the simulation of the design as the build reads it cannot apply them, so it stops instead of testing another design.
dewfpga sim, after iverilog compiled the design. Not an error: a register or a memory of the design has no start value, and the simulation starts it where the board starts it (the reset value; 0 without a reset; a LUT RAM word at 0) instead of x, so a case or an if that reads it before the first reset takes the same branch in the simulation and on the board.
dewfpga sim, vvp. The testbench never called $finish, or needs longer than the timeout; the CLI killed the simulator.
dewfpga sim, vvp. vvp ended with a non-zero exit: a $fatal in the testbench, or a run that ended without $finish.
dewfpga sim, after vvp. The simulation ran to $finish, and the testbench printed ERROR: lines with $error: a check failed.
dewfpga sim / bit, the typedef scan before the tools run. A typedef of a two-dimensional packed array used to declare a parameter or a net; yosys flattens the type and every row index picks one bit.
dewfpga bit, the source scan before the tools run. A function or task argument passed by reference; yosys' reader stops on it and yosys-slang builds the call as nothing.
dewfpga sim / bit, the source scan before the tools run (or yosys). The package lives in a file the tools are not given: a .svh or .vh that no design file `includes, or a file outside the folder or the project.
dewfpga sim, the source scan before iverilog runs. The testbench `includes a file the simulation reads with the design already (a package file of the folder, or one the design `includes), so the package is declared twice and iverilog stops.
dewfpga sim / bit, the source scan before the tools run. An import or pkg::NAME names a package no file in the folder declares.
dewfpga bit, the source scan before yosys. $isunknown in synthesizable code; a chip has no x, and yosys folds the call to a constant that differs from the simulation.
dewfpga bit, yosys. A combinational block leaves a signal unassigned on some path, so it has to remember its value: a latch, built as Vivado builds it, with the same warning.
dewfpga bit, yosys. A latch the reader turned into a combinational loop instead of a latch cell; the loop does not behave like the simulation, so the build stops.
dewfpga sim and dewfpga bit, the source scan before the tools. Two items of a unique casez (or casex) can match the same value; the simulator takes the first, the hardware ORs both, so the board would not do what the simulation showed.
dewfpga bit, yosys. An always_latch whose gate and data come from the same inputs: when both change at once the board races, where the simulation keeps the old value; the build goes on with the warning.
dewfpga sim and dewfpga bit, yosys (or yosys-slang). A .* or .name port connection whose port and signal widths differ: the simulator pads or cuts and runs, neither synthesis reader builds it; the same line at sim and at bit names the port, the two widths and the fix.
dewfpga bit, yosys. In an always_ff with an asynchronous reset, the reset branch loads a register from a signal, or a signal is written outside the reset if/else; a flip-flop can only reset to a constant.
dewfpga bit, yosys. The sensitivity list names one edge of the reset and the first if tests the other level, so the reset edge lands in the else branch, which loads a signal.
dewfpga bit, yosys. The block has a clock and an asynchronous reset in its sensitivity list, but the first if tests the reset ORed with another signal.
dewfpga bit, yosys. One always block clocked on posedge and negedge of the same clock; the chip's flip-flops have one clock edge.
dewfpga bit, yosys. An initial block, or a declaration, sets a register's start value from a signal; power-up values are constants.
dewfpga bit, yosys. The same register is assigned in two always blocks; yosys resolves the conflict silently, Vivado refuses it.
dewfpga bit, yosys. A signal assigned both in an always block and with assign; two drivers on one wire.
dewfpga bit, yosys. A signal with two assign lines; two drivers on one wire.
dewfpga bit, yosys. A signal written from more than one place that the checker could not sort into always blocks and assigns; two drivers on one wire.
dewfpga bit, yosys. A name used but never declared; yosys' reader makes an implicit 1-bit wire with no driver, so the design would be built without it.
dewfpga bit, yosys (when yosys-slang is not installed). A signal reached through an instance name (u_cnt.count); yosys' own reader does not resolve it. With yosys-slang installed the design builds, with the read-with-slang note.
dewfpga bit, yosys (when yosys-slang is not installed). A member of an interface instance read in the module that declares the instance; yosys' own reader makes an undriven wire of it. With yosys-slang installed the design builds.
dewfpga bit, yosys. An instance of a module no file in the folder declares.
dewfpga bit, yosys-slang. The enum methods next() and prev(); neither reader builds them, Vivado does.
dewfpga bit, yosys-slang, after yosys' own reader refused the code. Both readers refused the code; yosys' own line is printed first, then yosys-slang's error with its caret.
dewfpga bit, yosys-slang, after yosys' own reader refused the code. yosys-slang stops on a construct it has no implementation for, without a line; the code line dump above it shows the construct.
dewfpga bit, yosys. yosys died with a signal instead of an error message; a real literal in a parameter is the known cause, and the line that holds one is named.
dewfpga bit, after yosys' own reader refused the code. The code needs the second reader, and it is not built; the error above it may go away with it.
dewfpga bit, synthesis. Not an error: yosys' own reader refused the code, yosys-slang read it, and synthesis went on as usual.
dewfpga bit, after both readers refused a .v file. A .v file that holds SystemVerilog; both readers, like Vivado, read .v as Verilog-2005, so logic and always_ff are syntax errors there.
dewfpga bit, synthesis, before yosys reads the design. Not an error: a state register carries an fsm_encoding attribute, and the build keeps the codes the declaration gives it instead of letting yosys re-encode the register, so it powers up in the state with code 0, where dewfpga sim starts it; the build goes on.
dewfpga bit, before place and route. Not an error: the XDC has no create_clock line, so every clock is checked at the board's 100 MHz.
dewfpga bit, nextpnr. A z driven onto an internal signal or a submodule port; the chip's tri-state buffers sit on pins only, and yosys keeps the buffer as a cell nextpnr cannot place.
dewfpga bit, yosys. Two z drivers on one internal bus in one module; yosys builds them as logic, as Vivado does, so the board never shows the z or x the simulation shows.
dewfpga bit, nextpnr. A wor or wand net with several drivers; yosys keeps the wired resolution as a $and/$or cell nextpnr cannot place.
dewfpga bit, nextpnr. The ** operator with a variable base; yosys builds only constant powers and 2 ** n.
dewfpga bit, nextpnr. An instance of a module with ports and no body; yosys keeps it as a black box, nextpnr has no cell of that type.
dewfpga bit, nextpnr. nextpnr ran out of a real resource of the chip; the counts are in the log.
dewfpga bit, nextpnr's timing report. The longest path between two registers is longer than the clock period; the CLI writes no bitstream where Vivado would, with a critical warning.
dewfpga bit, after place and route. The place-and-route output file is empty, usually from a build interrupted between nextpnr and the bitstream.
openFPGALoader, when you program the board. The board was found, and programming still failed; openFPGALoader's own lines above say why.
dewfpga, before choosing a project. More than one .xpr file is present, so the CLI cannot choose the intended project.
the Vivado project file list. An enabled source or constraint entry names a file that is absent from this checkout.
the Vivado XML reader. The project file is not parseable Vivado XML.
the Vivado source path reader. A listed path uses a Vivado variable that this CLI cannot resolve.
the active Vivado file-set selection. The project does not identify which of several source, constraint or simulation sets to use.
the user-task configuration reader. The task document or its ownership record cannot be interpreted safely.
the user-task ownership check. An existing task label or input id collides with the proposed configuration without verified ownership.
the user-task file writer. Writing or replacing the task document or ownership record failed.
the optional editor setup. The VS Code command is unavailable; the FPGA command-line toolchain can still be used.
the companion extension installer. The companion extension could not be built, installed or verified.
the companion extension ownership check. The companion is retained because a settings value still points to its linter shim, or settings cannot be checked safely.
private Verilog-2005 source wrappers. The build directory is not writable, or the disk has no space for the temporary source copies.
JSON command deadline. The JSON wrapper stopped a command that did not finish within its deadline.
JSON output capture. Starting the command, reading its output or another wrapper operation failed.
optional MCP SDK. The isolated MCP Python environment is missing or cannot import the required SDK.
Every SystemVerilog construct measured so far, with what Vivado does, what each stage does here and the code it prints: the probes, stage by stage.
Your error is not here?
Read the last lines in the terminal, not the first. Most tools print the real reason last. If it is still stuck, send the last ten lines and the section number on LinkedIn.
All of this was hit on an M2 with 8 GB, macOS 15, on 19 September 2026, with the tool versions listed in section 9 of the guide. Newer versions can move the walls.