From 3da204edd6f951b07056eb84c82a7d5766f06387 Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Fri, 14 Feb 2020 17:53:25 -0500 Subject: [PATCH] update to work with mac --- CONTRIBUTORS | 1 + README.md | 38 ++++++++++++++---- doc/bios_screenshot.png | Bin 0 -> 46287 bytes litex/build/sim/core/Makefile | 14 +++++-- .../build/sim/core/modules/ethernet/Makefile | 5 +++ litex/build/sim/core/modules/rules.mak | 6 +++ litex/build/sim/core/modules/variables.mak | 10 ++++- .../sim/core/modules/xgmii_ethernet/Makefile | 5 +++ 8 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 doc/bios_screenshot.png diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 882843529..3c932141f 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -70,3 +70,4 @@ Copyright (c) 2015-2019 William D. Jones Copyright (c) 2013-2014 Yann Sionneau Copyright (c) 2015 Yves Delley Copyright (c) 2015 Zach Smith +Copyright (c) 2020 Yehowshua Immanuel diff --git a/README.md b/README.md index 8bb0a4051..8c6d2ed31 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![LiteX](https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png) +![LiteX](doc/litex.png) ``` Copyright 2012-2020 / EnjoyDigital ``` @@ -95,6 +95,9 @@ Migen documentation can be found here: https://m-labs.hk/migen/manual # Quick start guide (for advanced users) 0. Install Python 3.5+ and FPGA vendor's development tools. 1. Install Migen/LiteX and the LiteX's cores: + +On MacOS, make sure you have [HomeBrew](https://brew.sh) installed. Then do, ``brew install wget``. + ```sh $ wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py $ chmod +x litex_setup.py @@ -105,28 +108,47 @@ $ ./litex_setup.py init install --user (--user to install to user directory) $ ./litex_setup.py update ``` 3. Install a RISC-V toolchain: + +For Linux: ```sh $ wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.1.0-2019.01.0-x86_64-linux-ubuntu14.tar.gz $ tar -xvf riscv64-unknown-elf-gcc-8.1.0-2019.01.0-x86_64-linux-ubuntu14.tar.gz $ export PATH=$PATH:$PWD/riscv64-unknown-elf-gcc-8.1.0-2019.01.0-x86_64-linux-ubuntu14/bin/ ``` +MacOS: +```sh +$ wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-apple-darwin.tar.gz +$ tar -xvf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-apple-darwin.tar.gz +$ export PATH=$PATH:$PWD/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-apple-darwin/bin/ +``` 4. Build the target of your board...: Go to litex-boards/litex_boards/xxyy/targets (xxyy being community/official/partner) and execute the target you want to build -5. ... and/or install Verilator and test LiteX on your computer: - Download and install Verilator: http://www.veripool.org/ - On Fedora: +5. ... and/or install [Verilator](http://www.veripool.org/) and test LiteX on your computer + +On Fedora: ```sh $ sudo dnf install libevent-devel json-c-devel ``` - On Ubuntu: +On Ubuntu: ```sh -$ sudo apt install libevent-dev libjson-c-dev +$ sudo apt install libevent-dev libjson-c-dev verilator +$ litex_sim +``` +On MacOS: + + +```sh +$ brew install json-c verilator libevent +$ brew cask install tuntap $ litex_sim ``` 6. Run a terminal program on the board's serial port at 115200 8-N-1. - You should get the BIOS prompt. + + You should get the BIOS prompt like the one below. + +![bios_screenshot](doc/bios_screenshot.png) # Contact -E-mail: florent@enjoy-digital.fr \ No newline at end of file +E-mail: florent@enjoy-digital.fr diff --git a/doc/bios_screenshot.png b/doc/bios_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8de4f862c70bfa5c5b4c33e42c8d761a8393341a GIT binary patch literal 46287 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

iBfmy4?W*IN*5pS+AdTbTYE~fMf?CW!$ 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 IF+;z90bGsPc>n+a literal 0 HcmV?d00001 diff --git a/litex/build/sim/core/Makefile b/litex/build/sim/core/Makefile index b1c880280..28b45058f 100644 --- a/litex/build/sim/core/Makefile +++ b/litex/build/sim/core/Makefile @@ -1,8 +1,16 @@ include variables.mak +UNAME_S := $(shell uname -s) + +ifeq ($(UNAME_S),Darwin) + CFLAGS += -I/usr/local/include/ + LDFLAGS += -L/usr/local/lib + LDFLAGS += -lpthread -ljson-c -lm -lstdc++ -ldl -levent +else + CC ?= gcc + CFLAGS += -Wall -$(OPT_LEVEL) -ggdb $(if $(COVERAGE), -DVM_COVERAGE) + LDFLAGS += -lpthread -Wl,--no-as-needed -ljson-c -lm -lstdc++ -Wl,--no-as-needed -ldl -levent +endif -CC ?= gcc -CFLAGS += -Wall -$(OPT_LEVEL) -ggdb $(if $(COVERAGE), -DVM_COVERAGE) -LDFLAGS += -lpthread -Wl,--no-as-needed -ljson-c -lm -lstdc++ -Wl,--no-as-needed -ldl -levent CC_SRCS ?= "--cc dut.v" diff --git a/litex/build/sim/core/modules/ethernet/Makefile b/litex/build/sim/core/modules/ethernet/Makefile index 211b76d5e..d29bf1c24 100644 --- a/litex/build/sim/core/modules/ethernet/Makefile +++ b/litex/build/sim/core/modules/ethernet/Makefile @@ -1,5 +1,6 @@ include ../variables.mak CFLAGS += -Itapcfg/src/include +UNAME_S := $(shell uname -s) all: $(OBJ_DIR)/ethernet.so @@ -8,7 +9,11 @@ include ../rules.mak OBJS = $(addprefix $(OBJ_DIR)/, ethernet.o tapcfg.o taplog.o) $(OBJ_DIR)/ethernet.so: $(OBJS) +ifeq ($(UNAME_S),Darwin) + $(CC) $(LDFLAGS) -o $@ $^ +else $(CC) $(LDFLAGS) -Wl,-soname,$@ -o $@ $^ +endif $(OBJ_DIR)/tapcfg.o: tapcfg/src/lib/tapcfg.c $(CC) $(CFLAGS) -c -o $@ $< diff --git a/litex/build/sim/core/modules/rules.mak b/litex/build/sim/core/modules/rules.mak index 7cbe265c8..62ff24288 100644 --- a/litex/build/sim/core/modules/rules.mak +++ b/litex/build/sim/core/modules/rules.mak @@ -1,8 +1,14 @@ +UNAME_S := $(shell uname -s) + $(OBJ_DIR)/%.o: %.c $(CC) -c $(CFLAGS) -I../.. -o $@ $< $(OBJ_DIR)/%.so: $(OBJ_DIR)/%.o +ifeq ($(UNAME_S),Darwin) + $(CC) $(LDFLAGS) -o $@ $^ +else $(CC) $(LDFLAGS) -Wl,-soname,$@ -o $@ $< +endif .PHONY: clean clean: diff --git a/litex/build/sim/core/modules/variables.mak b/litex/build/sim/core/modules/variables.mak index 6c504f3c4..dee2a9832 100644 --- a/litex/build/sim/core/modules/variables.mak +++ b/litex/build/sim/core/modules/variables.mak @@ -1,5 +1,13 @@ CC ?= gcc -CFLAGS += -Wall -O3 -ggdb -fPIC -Werror +UNAME_S := $(shell uname -s) + +ifeq ($(UNAME_S),Darwin) + CFLAGS += -I/usr/local/include/ + LDFLAGS += -L/usr/local/lib -ljson-c + CFLAGS += -Wall -O3 -ggdb -fPIC +else + CFLAGS += -Wall -O3 -ggdb -fPIC -Werror +endif LDFLAGS += -levent -shared -fPIC OBJ_DIR ?= . diff --git a/litex/build/sim/core/modules/xgmii_ethernet/Makefile b/litex/build/sim/core/modules/xgmii_ethernet/Makefile index 39f54cd8e..ece1f013c 100644 --- a/litex/build/sim/core/modules/xgmii_ethernet/Makefile +++ b/litex/build/sim/core/modules/xgmii_ethernet/Makefile @@ -1,5 +1,6 @@ include ../variables.mak CFLAGS += -Itapcfg/src/include +UNAME_S := $(shell uname -s) all: $(OBJ_DIR)/xgmii_ethernet.so @@ -8,7 +9,11 @@ include ../rules.mak OBJS = $(addprefix $(OBJ_DIR)/, xgmii_ethernet.o tapcfg.o taplog.o) $(OBJ_DIR)/xgmii_ethernet.so: $(OBJS) +ifeq ($(UNAME_S),Darwin) + $(CC) $(LDFLAGS) -o $@ $^ +else $(CC) $(LDFLAGS) -Wl,-soname,$@ -o $@ $^ +endif $(OBJ_DIR)/tapcfg.o: tapcfg/src/lib/tapcfg.c $(CC) $(CFLAGS) -c -o $@ $<