Skip to content

Commit a0d6934

Browse files
authored
Merge pull request #5 from meiniKi/dev
Updates flows, ci, small fixes
2 parents 4aaf243 + 977d355 commit a0d6934

33 files changed

Lines changed: 1002 additions & 1348 deletions

.github/workflows/impl.yml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717

1818
- uses: actions/setup-python@v5
1919
with:
20-
python-version: '3.10'
20+
python-version: '3.12'
2121
cache: 'pip'
2222

2323
- name: pip packages
@@ -30,8 +30,8 @@ jobs:
3030
3131
- name: Run implementation
3232
run: |
33-
make report.soc.all TARGET_ARCH=ice40
34-
make report.md TARGET_ARCH=ice40 >> $GITHUB_STEP_SUMMARY
33+
make summary.soc.all TARGET_ARCH=ice40
34+
cat work/soc_ice40.md >> $GITHUB_STEP_SUMMARY
3535
3636
impl_ecp5:
3737
name: ECP5 Reference Implementation
@@ -47,7 +47,7 @@ jobs:
4747

4848
- uses: actions/setup-python@v5
4949
with:
50-
python-version: '3.10'
50+
python-version: '3.12'
5151
cache: 'pip'
5252

5353
- name: pip packages
@@ -60,6 +60,5 @@ jobs:
6060
6161
- name: Run implementation
6262
run: |
63-
make report.soc.all TARGET_ARCH=ecp5
64-
make report.md TARGET_ARCH=ecp5 >> $GITHUB_STEP_SUMMARY
65-
63+
make summary.soc.all TARGET_ARCH=ecp5
64+
cat work/soc_ecp5.md >> $GITHUB_STEP_SUMMARY

.github/workflows/track_area.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@ jobs:
2222

2323
- uses: actions/setup-python@v5
2424
with:
25-
python-version: '3.10'
25+
python-version: '3.12'
2626
cache: 'pip'
2727

2828
- name: pip packages
2929
run: pip install -r requirements.txt
3030

31+
- name: Actions checkout
32+
uses: actions/checkout@v3
33+
3134
- name: fusesoc library
3235
run: |
3336
fusesoc library add fazyrv .
3437
fusesoc library add fsoc .
3538
36-
- name: Actions checkout
37-
uses: actions/checkout@v3
38-
3939
- name: Run implementation
40-
run: make track.sizes.synth COMMIT=$(git rev-parse --short "$GITHUB_SHA")
40+
run: make track.sizes COMMIT=$(git rev-parse --short "$GITHUB_SHA")
4141

4242
- name: Plot artifact
4343
uses: actions/upload-artifact@v4

.github/workflows/verif.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: Verification
22

3-
on: [push, pull_request]
3+
on: [pull_request]
44

55
jobs:
66
rvtests:
@@ -34,7 +34,7 @@ jobs:
3434

3535
- uses: actions/setup-python@v5
3636
with:
37-
python-version: '3.10'
37+
python-version: '3.12'
3838
cache: 'pip'
3939

4040
- name: pip packages

Makefile

Lines changed: 19 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
11

22
CUR_DIR := $(shell pwd)
33
SCRIPT := $(CUR_DIR)/script
4-
WORKFLOW_SCRIPT := $(SCRIPT)/workflow
54

65
YOSYS := yosys
76
SVLINT := svlint
87
SLANG := slang
9-
PYTHON := python3
8+
PYTHON := python
109
MAKE := make
1110
BASH := bash
1211
VERILATOR := verilator
1312

14-
NEXTPNR_ICE40 := nextpnr-ice40
15-
NEXTPNR_ECP5 := nextpnr-ecp5
16-
NEXTPNR_GOWIN := nextpnr-gowin
17-
GATEMATE_PR := p_r
18-
1913
TARGET_ARCH ?= ice40
14+
COMMIT ?= n/a
2015

2116
################################
2217
# Synthesis combinations
2318
#
2419

2520
SYNTH_CHUNKSIZES := 1 2 4 8
26-
SYNTH_CONFS := MIN INT
27-
SYNTH_RF := BRAM BRAM_BP BRAM_DP BRAM_DP_BP
21+
SYNTH_CONFS := MIN
22+
SYNTH_RF := LOGIC BRAM BRAM_BP BRAM_DP BRAM_DP_BP
2823

2924
# Synth param: <CHUNKSIZE>-<CONF>-<RFTYPE>
3025
SYNTH_PARAMS := $(foreach bdwidth,$(SYNTH_CHUNKSIZES),\
@@ -81,10 +76,8 @@ TOP_MODULE_TOP := fazyrv_top
8176

8277
WORK_DIR_MAIN := work
8378

84-
WORK_DIR_TOP := $(WORK_DIR_MAIN)/work_top
8579
WORK_DIR_CORE := $(WORK_DIR_MAIN)/work_core
8680
WORK_DIR_SOC := $(WORK_DIR_MAIN)/work_soc
87-
WORK_DIR_EMBENCH := $(WORK_DIR_MAIN)/work_rvtests
8881
WORK_DIR_RISCOF := $(WORK_DIR_MAIN)/work_riscof
8982

9083
SUMMARY_DIR_SOC := $(WORK_DIR_MAIN)/summary_fsoc_soc
@@ -139,7 +132,7 @@ sim.riscvtests.%: $(SRC_DESIGN) $(SRC_SYNTH)
139132

140133
report.riscvtests.all: $(addprefix sim.riscvtests., $(RVTESTS_PARAMS))
141134
@echo "${BLUE}Generating riscvtests table for all combinations${RESET}"
142-
$(WORKFLOW_SCRIPT)/rvtests_table.sh $(SUMMARY_DIR_RISCVTESTS)
135+
$(SCRIPT)/rvtests_table.sh $(SUMMARY_DIR_RISCVTESTS)
143136

144137

145138
################
@@ -267,8 +260,7 @@ embench.run: embench.prepare
267260
#
268261

269262
# param: <ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
270-
# Via fusesoc whenever possible.
271-
_impl.soc.%: $(SRC_DESIGN) $(SRC_SYNTH)
263+
impl.soc.%:
272264
@echo "${BLUE}Synthesizing for $*...${RESET}"
273265
$(eval ARCH=$(word 1,$(subst -, ,$*)))
274266
$(eval CHUNKSIZE=$(word 2,$(subst -, ,$*)))
@@ -278,71 +270,37 @@ _impl.soc.%: $(SRC_DESIGN) $(SRC_SYNTH)
278270
@echo "ARCH: $(ARCH)"
279271
@echo "CONF: $(CONF)"
280272
@echo "RF: $(RF)"
281-
mkdir -p $(WORK_DIR_SOC)/$*
282-
@case ${ARCH} in \
283-
gatemate) $(YOSYS) -l $(WORK_DIR_SOC)/$*/yosys_$*.log -p "read_verilog -sv -defer $^; chparam -set CHUNKSIZE $(CHUNKSIZE) $(TOP_MODULE_SOC); chparam -set GPOCNT 1 $(TOP_MODULE_SOC); chparam -set MEMDLY1 0 $(TOP_MODULE_SOC); chparam -set CONF \"$(CONF)\" $(TOP_MODULE_SOC); chparam -set RFTYPE \"$(RF)\" $(TOP_MODULE_SOC); synth_$(ARCH) -top $(TOP_MODULE_SOC); synth_$(ARCH) -top $(TOP_MODULE_SOC) -json $(WORK_DIR_SOC)/$*/$*.json -vlog $(WORK_DIR_SOC)/$*/$*.v" && \
284-
$(GATEMATE_PR) --speed 10 -tm 2 -ccf soc/synth/gatemate_ref.ccf -i $(WORK_DIR_SOC)/$*/$*.v > $(WORK_DIR_SOC)/$*/gm_pr_$*.log ;; \
285-
gowin) fusesoc run --target=$(ARCH)_ref --build --work-root=$(WORK_DIR_SOC)/$* fsoc --CHUNKSIZE=$(CHUNKSIZE) --CONF=$(CONF) --RFTYPE=$(RF) --GOWIN ;; \
286-
*) fusesoc run --target=$(ARCH)_ref --build --work-root=$(WORK_DIR_SOC)/$* fsoc --CHUNKSIZE=$(CHUNKSIZE) --CONF=$(CONF) --RFTYPE=$(RF) ;; \
287-
esac
273+
fusesoc run --target=$(ARCH)_ref --build --work-root=$(WORK_DIR_SOC)/$* fsoc --CHUNKSIZE=$(CHUNKSIZE) --CONF=$(CONF) --RFTYPE=$(RF)
288274

289275
# param: <ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
290-
# TODO: Use Edalize reporting instead of custom scripts
291-
_report.soc.%: _impl.soc.%
276+
report.soc.%: impl.soc.%
292277
@echo -e "${GREEN}Report for $*...${RESET}"
293278
$(eval ARCH=$(word 1,$(subst -, ,$*)))
294-
mkdir -p $(SUMMARY_DIR_SOC)
295-
@case ${ARCH} in \
296-
xilinx) \
297-
$(WORKFLOW_SCRIPT)/report_vivado_util.sh $(WORK_DIR_SOC)/$*/*.runs/impl_1/fsoc_utilization_placed.rpt > $(SUMMARY_DIR_SOC)/summary_util_$*; \
298-
$(WORKFLOW_SCRIPT)/report_vivado_timing.sh $(WORK_DIR_SOC)/$*/*.runs/impl_1/fsoc_timing_summary_routed.rpt > $(SUMMARY_DIR_SOC)/summary_wns_$*; \
299-
$(WORKFLOW_SCRIPT)/report_vivado_timing_to_fmax.sh $(SUMMARY_DIR_SOC) 100 \
300-
;; \
301-
gatemate) \
302-
$(WORKFLOW_SCRIPT)/report_gatemate_util.sh $(WORK_DIR_SOC)/$*/gm_pr_$*.log > $(SUMMARY_DIR_SOC)/summary_util_$*; \
303-
$(WORKFLOW_SCRIPT)/report_gatemate_timing.sh $(WORK_DIR_SOC)/$*/gm_pr_$*.log > $(SUMMARY_DIR_SOC)/summary_fmax_$*; \
304-
;; \
305-
*) \
306-
$(WORKFLOW_SCRIPT)/report_yosys_$(ARCH).sh $(WORK_DIR_SOC)/$*/yosys.log > $(SUMMARY_DIR_SOC)/summary_yosys_$*; \
307-
$(WORKFLOW_SCRIPT)/report_nextpnr_timing.sh $(WORK_DIR_SOC)/$*/next.log > $(SUMMARY_DIR_SOC)/summary_fmax_$*; \
308-
$(WORKFLOW_SCRIPT)/report_nextpnr_util.sh $(WORK_DIR_SOC)/$*/next.log > $(SUMMARY_DIR_SOC)/summary_util_$*; \
309-
;; \
310-
esac
279+
$(PYTHON) $(SCRIPT)/reporting.py $(ARCH) $(WORK_DIR_SOC)/$* -o $(SUMMARY_DIR_SOC)/$*.json
311280

312281
# param: set TARGET_ARCH
313-
report.soc.all: $(addprefix _report.soc.$(TARGET_ARCH)-, $(SYNTH_PARAMS))
314-
$(PYTHON) $(WORKFLOW_SCRIPT)/summary_table.py $(SUMMARY_DIR_SOC) $(TARGET_ARCH)
282+
summary.soc.all: $(addprefix report.soc.$(TARGET_ARCH)-, $(SYNTH_PARAMS))
283+
$(PYTHON) $(SCRIPT)/summary.py $(SUMMARY_DIR_SOC) -o $(WORK_DIR_MAIN)/soc_$(TARGET_ARCH).md
315284

316-
report.md:
317-
$(PYTHON) $(WORKFLOW_SCRIPT)/summary_table_md.py $(SUMMARY_DIR_SOC) $(TARGET_ARCH)
318285

319286
#######################
320287
# Track and plot sizes
321288
#
322289

323290
# param: <ARCH>-<CHUNKSIZE>-<CONF>-<RF>
324-
_track.sizes.synth.%: $(SRC_DESIGN) $(SRC_SYNTH)
291+
_track.sizes.impl.%:
325292
@echo -e "${BLUE}Synthesizing for $*...${RESET}"
326293
$(eval ARCH=$(word 1,$(subst -, ,$*)))
327294
$(eval CHUNKSIZE=$(word 2,$(subst -, ,$*)))
328295
$(eval CONF=$(word 3,$(subst -, ,$*)))
329296
$(eval RF=$(word 4,$(subst -, ,$*)))
330-
@echo "CHUNKSIZE: $(CHUNKSIZE)"
331-
@echo "ARCH: $(ARCH)"
332-
@echo "CONF: $(CONF)"
333-
@echo "RF: $(RF)"
334-
mkdir -p $(WORK_DIR_CORE)/$*
335-
mkdir -p $(WORK_DIR_SOC)/$*
336-
$(YOSYS) -q -l $(WORK_DIR_CORE)/$*/yosys_$*.log -p "read_verilog -sv -defer $^; chparam -set CHUNKSIZE $(CHUNKSIZE) $(TOP_MODULE_CORE); chparam -set CONF \"$(CONF)\" $(TOP_MODULE_CORE); chparam -set RFTYPE \"$(RF)\" $(TOP_MODULE_CORE); synth_$(ARCH) -top $(TOP_MODULE_CORE)"
337-
$(YOSYS) -q -l $(WORK_DIR_SOC)/$*/yosys_$*.log -p "read_verilog -sv -defer $^; chparam -set CHUNKSIZE $(CHUNKSIZE) $(TOP_MODULE_SOC); chparam -set CONF \"$(CONF)\" $(TOP_MODULE_SOC); chparam -set RFTYPE \"$(RF)\" $(TOP_MODULE_SOC); synth_$(ARCH) -top $(TOP_MODULE_SOC)"
338-
mkdir -p $(SUMMARY_DIR_CORE)
339-
mkdir -p $(SUMMARY_DIR_SOC)
340-
$(WORKFLOW_SCRIPT)/report_yosys_$(ARCH).sh $(WORK_DIR_CORE)/$*/yosys_$*.log > $(SUMMARY_DIR_CORE)/summary_yosys_$*
341-
$(WORKFLOW_SCRIPT)/report_yosys_$(ARCH).sh $(WORK_DIR_SOC)/$*/yosys_$*.log > $(SUMMARY_DIR_SOC)/summary_yosys_$*
342-
343-
344-
track.sizes.synth: $(addprefix _track.sizes.synth.$(TARGET_ARCH)-, $(PLOT_PARAMS))
345-
$(PYTHON) $(WORKFLOW_SCRIPT)/plot_track_sizes.py $(SUMMARY_DIR_CORE) $(SUMMARY_DIR_SOC) ./doc/area.svg ./doc/area.txt $(COMMIT)
297+
fusesoc run --target=$(ARCH)_ref --build --work-root=$(WORK_DIR_CORE)/$* fazyrv --CHUNKSIZE=$(CHUNKSIZE) --CONF=$(CONF) --RFTYPE=$(RF)
298+
$(PYTHON) $(SCRIPT)/reporting.py $(ARCH) $(WORK_DIR_CORE)/$* -o $(SUMMARY_DIR_CORE)/$*.json
299+
$(PYTHON) $(SCRIPT)/summary.py $(SUMMARY_DIR_CORE) -o $(SUMMARY_DIR_CORE)/core_ice40.md
300+
make report.soc.$(ARCH)-$(CHUNKSIZE)-$(CONF)-$(RF)
301+
302+
track.sizes: $(addprefix _track.sizes.impl.ice40-, $(PLOT_PARAMS))
303+
$(PYTHON) $(SCRIPT)/plot_track_sizes.py ice40 $(SUMMARY_DIR_CORE) $(SUMMARY_DIR_SOC) --svg ./doc/area.svg --ascii ./doc/area.txt --commit_hash $(COMMIT)
346304

347305
clean:
348306
rm -vrf $(WORK_DIR_MAIN)

README.md

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,18 @@ ARCH := ice40 | ecp5 | gowin | xilinx | gatemate
126126

127127
```shell
128128
# run the flow only
129-
make _impl.soc.<ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
129+
make impl.soc.<ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
130130

131131
# run the flow and report a summary of the results
132-
make _report.soc.<ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
132+
make report.soc.<ARCH>-<CHUNKSIZE>-<CONF>-<RFTYPE>
133133

134134
# e.g.,
135-
make _report.soc.ice40-8-MIN-BRAM
135+
make report.soc.ice40-8-MIN-BRAM
136136

137-
# or
138-
make report.soc.all
137+
# Make a markdown summary of all configurations
138+
# given an architecture
139+
# pip install -r requirements.txt
140+
TARGET_ARCH=ice40 make summary.soc.all
139141
```
140142

141143
### Litex
@@ -256,16 +258,16 @@ Please cite the work as follows:
256258

257259
```
258260
@inproceedings{fazyrv2024kissich,
259-
title = {{FazyRV: Closing the Gap between 32-Bit and Bit-Serial RISC-V Cores with a Scalable Implementation}},
261+
title = {{FazyRV: Closing the Gap between 32-Bit and Bit-Serial RISC-V Cores with a Scalable Implementation}},
260262
booktitle = {Proc. of the 21st ACM International Conference on Computing Frontiers (CF ’24)},
261-
author = {Kissich, Meinhard and Baunach, Marcel},
262-
year = {2024},
263-
month = {May},
263+
author = {Kissich, Meinhard and Baunach, Marcel},
264+
year = {2024},
265+
month = {May},
264266
publisher = {Association for Computing Machinery},
265-
url = {https://doi.org/10.1145/3649153.3649195},
266-
doi = {10.1145/3649153.3649195},
267+
url = {https://doi.org/10.1145/3649153.3649195},
268+
doi = {10.1145/3649153.3649195},
267269
booktitle = {Proceedings of the 21st ACM International Conference on Computing Frontiers},
268-
pages = {240–248}
270+
pages = {240–248}
269271
}
270272
```
271273

@@ -277,22 +279,11 @@ Please cite the work as follows:
277279

278280
* YosysHQ invited us to contribute a blog post. Check out [our FazyRV community-spotlight blog post](https://blog.yosyshq.com/p/community-spotlight-fazyrv) and all the [amazing open-source projects](https://blog.yosyshq.com).
279281

282+
* [heichips25-fazyrv-exotiny](https://github.com/meiniKi/heichips25-fazyrv-exotiny) implements a FazyRV-based SoC as part of the [HeiChips 2025 Tapeout](https://github.com/FPGA-Research/heichips25-tapeout).
280283

284+
* [gf180mcu FazyRV Hachure SoC](https://github.com/meiniKi/gf180mcu-fazyrv-hachure) integrates several FazyRV instances.
281285

282286

283-
## TODOs
284-
285-
- [ ] Workflow: caching, tool versions, artifacts, dependence on some local tools
286-
- [ ] RVC extension (compressed instructions)
287-
- [ ] INT variant
288-
- [ ] CSR variant
289-
- [ ] CSR instructions in addition to `csrrw`(?)
290-
- [ ] Use edalize reporting instead of custom scripts
291-
- [ ] Optimization
292-
- [ ] More documentation
293-
294-
Please feel free to discuss and open an issue and/or pull request.
295-
296287
## Licensing
297288

298289
The FazyRV core (`rtl/*`) is licensed under the MIT license. This license may _not_ apply to the remainder of the repository.

0 commit comments

Comments
 (0)