Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
277 changes: 155 additions & 122 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,156 +6,189 @@ SHELL := /bin/bash
TOPDIR := .
INCDIRROOT := $(TOPDIR)/rtl/include
SCRIPTROOT := $(TOPDIR)/scripts
WAVEROOT := $(TOPDIR)/waves
WAVEROOT := $(TOPDIR)/waves
MODROOT := $(TOPDIR)/rtl/modules
TBROOT := $(TOPDIR)/tb
UVMTESTROOT := $(TBROOT)/uvm
UNITTESTROOT := $(TBROOT)/unit
SCRATCH := work

# Include directory setup
INCFLAGS := $(shell find $(INCDIRROOT) -type d -print0 2>/dev/null | xargs -0 -I{} echo +incdir+{})

PKG_SRCS := $(shell find $(TOPDIR)/rtl -type f \( -name "*_pkg.sv" -o -name "pkg_*.sv" \) 2>/dev/null | sort)

RTL_SRCS := $(shell \
find $(INCDIRROOT) $(MODROOT) -type f -name "*.sv" \
! -name "*_pkg.sv" ! -name "pkg_*.sv" 2>/dev/null | sort)

VLIB ?= vlib
VLOG ?= vlog
VSIM ?= vsim
GUI ?= OFF

.PHONY: setup lint test clean_lib
# --- Coverage Controls ---
COVERAGE ?= OFF # set to ON to enable coverage
VLOG_FLAGS ?=

ifeq ($(COVERAGE),ON)
# Questa coverage switches
VLOG_FLAGS += -cover bcesft
endif

# --- Target-Specific Variable Mappings ---
# Define specific DUT files for specific tests here
lane_sequencer.sim lane_sequencer.wav: dut := lane_sequencer.sv,lane.sv
veggie.sim veggie.wav: dut := veggie.sv

# For lane, only list "roots"; siblings will be auto-included
lane.sim lane.wav: dut := lane.sv,lane_fu_pt.sv,sqrt_bf16.sv,mul_bf16.sv,add_bf16.sv

# --- Pattern Rules for Module Testing ---
.PHONY: %.sim %.wav

%.sim:
@$(MAKE) test tb_file=$*_tb.sv GUI=OFF dut=$(dut)

%.wav:
@$(MAKE) test tb_file=$*_tb.sv GUI=ON dut=$(dut)

# --- Custom Test Shortcuts ---
.PHONY: test_lane_sequencer test_veggie test_lane cov_gsau

test_lane_sequencer:
@$(MAKE) lane_sequencer.sim

test_veggie:
@$(MAKE) veggie.sim

test_lane:
@$(MAKE) lane.sim

# Example dedicated coverage compile for another design tree
cov_gsau:
$(VLOG) $(VLOG_FLAGS) \
./src/modules/simple_systolic_model.sv \
./src/include/gsau_control_unit_if.vh \
./src/testbench/gsau_control_unit_tb.sv \
./src/modules/gsau_control_unit.sv \
./src/modules/sync_fifo.sv

# --- Targets ---

.PHONY: setup lint test clean

setup:
mkdir -p $(SCRATCH)
python3 scripts/setup.py
@echo "[setup] done"

# Usage: make lint folder=/sub/dir [file=name.sv[,name2.sv,...]] [include=/foo/bar,/baz/qux ...]
## Example:
## make lint folder=/memory/scratchpad
### -> `vlogs` all the files under rtl/include/memory/scratchpad and rtl/modules/memory/scratchpad
## make lint folder=/memory/scratchpad include=/network/xbar
### -> `vlogs` all the files under rtl/include/memory/scratchpad and rtl/modules/memory/scratchpad, and adds all the include paths under rtl/modules/network/xbar and rtl/include/network/xbar
## make lint folder=/memory/scratchpad file=scpad_cntrl.sv,tail.sv
### -> `vlogs` the files under rtl/include/memory/scratchpad and only the specified files under it
lint:
@if [ -z "$(folder)" ]; then
echo "Usage: make lint folder=/sub/dir [file=name.sv[,name2.sv,...]] [include=/foo/bar,/baz/qux ...]"; exit 1;
fi;

SEARCH_FIRST_IN_INCLUDE="$(INCDIRROOT)$(folder)";
[ -d "$$SEARCH_FIRST_IN_INCLUDE" ] || { echo "[lint] SEARCH_FIRST_IN_INCLUDE not found: $$SEARCH_FIRST_IN_INCLUDE"; exit 2; };

SRCS=$$(find "$$SEARCH_FIRST_IN_INCLUDE" -type f -name '*.sv' -print 2>/dev/null | sort);
[ -n "$$SRCS" ] || { echo "[lint] No .sv files under $$SEARCH_FIRST_IN_INCLUDE"; exit 4; };

NOW_SEARCH_IN_MODULES="$(MODROOT)$(folder)";

[ -d "$$NOW_SEARCH_IN_MODULES" ] || { echo "[lint] NOW_SEARCH_IN_MODULES not found: $$NOW_SEARCH_IN_MODULES"; exit 2; };

if [ -n "$(file)" ]; then
for f in $$(echo "$(file)" | tr ',' ' '); do
P="$$NOW_SEARCH_IN_MODULES/$$f";
[ -f "$$P" ] || { echo "[lint] Not found: $$P"; exit 3; };
SRCS="$$SRCS $$P";
done;
else
SRCS=$$(find "$$NOW_SEARCH_IN_MODULES" -type f -name '*.sv' -print 2>/dev/null | sort);
[ -n "$$SRCS" ] || { echo "[lint] No .sv files under $$NOW_SEARCH_IN_MODULES"; exit 4; };
fi;

PKGS=$$(printf '%s\n' $$SRCS | grep -E '_pkg\.sv$$' || true);
OTHERS=$$(printf '%s\n' $$SRCS | grep -Ev '_pkg\.sv$$' || true);

BASE_INCS="+incdir+$(INCDIRROOT)";
MOD_INCS=$$(find "$$NOW_SEARCH_IN_MODULES" -type d -print 2>/dev/null | sed 's/^/+incdir+/');
INC_INCS=$$(find "$(INCDIRROOT)$(folder)" -type d -print 2>/dev/null | sed 's/^/+incdir+/');

EXTRA_INCS="";
if [ -n "$(include)" ]; then
for p in $$(echo "$(include)" | tr ',' ' '); do
[ -d "$(MODROOT)$$p" ] && EXTRA_INCS="$$EXTRA_INCS $$(find "$(MODROOT)$$p" -type d -print 2>/dev/null | sed 's/^/+incdir+/')";
[ -d "$(INCDIRROOT)$$p" ] && EXTRA_INCS="$$EXTRA_INCS $$(find "$(INCDIRROOT)$$p" -type d -print 2>/dev/null | sed 's/^/+incdir+/')";
done;
fi;

ORDERED_SRCS="$$PKGS $$OTHERS";
INCFLAGS="$$BASE_INCS $$MOD_INCS $$INC_INCS $$EXTRA_INCS";

echo "[lint] compiling (in-order):";
printf ' %s\n' $$ORDERED_SRCS;

$(VLOG) -sv -mfcu -work work +acc $$INCFLAGS $$ORDERED_SRCS;
@if [ -z "$(folder)" ]; then \
echo "Usage: make lint folder=/sub/dir [file=name.sv] [include=/foo]"; exit 1; \
fi; \
SEARCH_FIRST_IN_INCLUDE="$(INCDIRROOT)$(folder)"; \
SRCS=$$(find "$$SEARCH_FIRST_IN_INCLUDE" -type f -name '*.sv' -print 2>/dev/null | sort); \
NOW_SEARCH_IN_MODULES="$(MODROOT)$(folder)"; \
if [ -n "$(file)" ]; then \
for f in $$(echo "$(file)" | tr ',' ' '); do \
P="$$NOW_SEARCH_IN_MODULES/$$f"; \
[ -f "$$P" ] && SRCS="$$SRCS $$P"; \
done; \
else \
SRCS=$$(find "$$NOW_SEARCH_IN_MODULES" -type f -name '*.sv' -print 2>/dev/null | sort); \
fi; \
PKGS=$$(printf '%s\n' $$SRCS | grep -E '_pkg\.sv$$' || true); \
OTHERS=$$(printf '%s\n' $$SRCS | grep -Ev '_pkg\.sv$$' || true); \
BASE_INCS="+incdir+$(INCDIRROOT)"; \
MOD_INCS=$$(find "$$NOW_SEARCH_IN_MODULES" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \
INC_INCS=$$(find "$(INCDIRROOT)$(folder)" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \
echo "[lint] compiling..."; \
$(VLOG) $(VLOG_FLAGS) -sv -mfcu -work work +acc $$BASE_INCS $$MOD_INCS $$INC_INCS $$PKGS $$OTHERS; \
echo "[lint] done"

# Similar to above!
## Example:
## make test folder=/common/xbar tb_file=batcher_xbar_tb.sv
test:
@if [ -z "$(folder)" ] || [ -z "$(tb_file)" ]; then \
echo "Usage: make $@ folder=/sub/dir tb_file=tb_top.sv [include=/foo,/bar]"; exit 1; \
@if [ -z "$(tb_file)" ]; then \
echo "Usage: make $@ tb_file=tb_top.sv [folder=/sub/dir] [dut=file1.sv,file2.sv] [GUI=ON/OFF]"; exit 1; \
fi; \

[ -d "$(INCDIRROOT)$(folder)" ] || { echo "[$@] Not found: $(INCDIRROOT)$(folder)"; exit 2; }; \
[ -d "$(MODROOT)$(folder)" ] || { echo "[$@] Not found: $(MODROOT)$(folder)"; exit 2; }; \
[ -d "$(UNITTESTROOT)$(folder)" ] || { echo "[$@] Not found: $(UNITTESTROOT)$(folder)"; exit 2; }; \
\
INCSRCS=$$(find "$(INCDIRROOT)$(folder)" -type f -name '*.sv' -print 2>/dev/null | sort); \

MODSRCS=$$(if [ -n "$(file)" ]; then \
SR=""; \
for f in $$(echo "$(file)" | tr ',' ' '); do \
P="$(MODROOT)$(folder)/$$f"; [ -f "$$P" ] || { echo "[$@] Not found: $$P"; exit 3; }; SR="$$SR $$P"; \
done; echo "$$SR"; \
else \
find "$(MODROOT)$(folder)" -type f -name '*.sv' -print 2>/dev/null | sort; \
fi); \
TBSRCS=$$(find "$(UNITTESTROOT)$(folder)" -type f -name '*.sv' -print 2>/dev/null | sort); \
[ -n "$$INCSRCS" ] || { echo "[$@] No .sv under $(INCDIRROOT)$(folder)"; exit 4; }; \
[ -n "$$MODSRCS" ] || { echo "[$@] No .sv under $(MODROOT)$(folder)"; exit 4; }; \
[ -n "$$TBSRCS" ] || { echo "[$@] No .sv under $(UNITTESTROOT)$(folder)"; exit 4; }; \
\

ALLSRCS="$$INCSRCS $$MODSRCS $$TBSRCS"; \
PKGS=$$(printf '%s\n' $$ALLSRCS | grep -E '_pkg\.sv$$' || true); \
OTHERS=$$(printf '%s\n' $$ALLSRCS | grep -Ev '_pkg\.sv$$' || true); \
ORDERED_SRCS="$$PKGS $$OTHERS"; \

BASE_INCS="+incdir+$(INCDIRROOT) +incdir+$(MODROOT) +incdir+$(UNITTESTROOT)"; \
INCDIRS_INC=$$(find "$(INCDIRROOT)$(folder)" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \
INCDIRS_MOD=$$(find "$(MODROOT)$(folder)" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \
INCDIRS_TB=$$(find "$(UNITTESTROOT)$(folder)" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \

EXTRA_INCS=""; \
if [ -n "$(include)" ]; then \
for p in $$(echo "$(include)" | tr ',' ' '); do \
[ -d "$(INCDIRROOT)$$p" ] && EXTRA_INCS="$$EXTRA_INCS $$(find "$(INCDIRROOT)$$p" -type d -print 2>/dev/null | sed 's/^/+incdir+/')"; \
[ -d "$(MODROOT)$$p" ] && EXTRA_INCS="$$EXTRA_INCS $$(find "$(MODROOT)$$p" -type d -print 2>/dev/null | sed 's/^/+incdir+/')"; \
[ -d "$(UNITTESTROOT)$$p" ] && EXTRA_INCS="$$EXTRA_INCS $$(find "$(UNITTESTROOT)$$p" -type d -print 2>/dev/null | sed 's/^/+incdir+/')"; \
done; \
# 1. Locate Testbench File \
TB_CAND=""; \
if [ -n "$(folder)" ]; then \
TB_CAND="$(UNITTESTROOT)$(folder)/$(tb_file)"; \
[ -f "$$TB_CAND" ] || TB_CAND=""; \
fi; \
INCFLAGS="$$BASE_INCS $$INCDIRS_INC $$INCDIRS_MOD $$INCDIRS_TB $$EXTRA_INCS"; \

TB_CAND="$(UNITTESTROOT)$(folder)/$(tb_file)"; \
[ -f "$$TB_CAND" ] || { echo "[$@] tb_file not found: $$TB_CAND"; exit 3; }; \
if [ -z "$$TB_CAND" ]; then \
TB_CAND=$$(find "$(UNITTESTROOT)" -name "$(tb_file)" -type f | head -1); \
[ -f "$$TB_CAND" ] || { echo "[$@] tb_file not found: $(tb_file)"; exit 3; }; \
fi; \
TB_DIR=$$(dirname "$$TB_CAND"); \
TB_BASENAME=$$(basename "$$TB_CAND"); \
TB_TOP="$${TB_BASENAME%.*}"; \

[ -d work ] || $(VLIB) work; \
echo "[$@] compiling (in-order):"; printf ' %s\n' $$ORDERED_SRCS; \
$(VLOG) -sv -mfcu -work work +acc $$INCFLAGS $$ORDERED_SRCS; \

@if [ "$(GUI)" = "ON" ]; then \
echo "[$@] launching vsim GUI on work.$$TB_TOP"; \
$(VSIM) -coverage -voptargs="+acc" work.$$TB_TOP -do "view objects; do $$WAVEROOT/$$TB_TOP.do; run -all;" -onfinish stop; \
TB_RELPATH=$$(echo "$$TB_DIR" | sed "s|$(UNITTESTROOT)||"); \
\
# 2. Identify Include Sources and PACKAGES \
INCSRCS=""; \
if [ -n "$$TB_RELPATH" ] && [ "$$TB_RELPATH" != "/" ]; then \
INCSRCS=$$(find "$(INCDIRROOT)/common" "$(INCDIRROOT)$$TB_RELPATH" -type f \( -name '*.sv' -o -name '*_pkg.sv' -o -name '*_pkg.vh' \) -print 2>/dev/null | sort); \
else \
echo "[$@] launching vsim on work.$$TB_TOP"; \
$(VSIM) -coverage -c -voptargs="+acc" work.$$TB_TOP -do "run -all"; \
fi

INCSRCS=$$(find "$(INCDIRROOT)" -type f \( -name '*.sv' -o -name '*_pkg.sv' -o -name '*_pkg.vh' \) -print 2>/dev/null | sort); \
fi; \
PKGS=$$(printf '%s\n' $$INCSRCS | grep -E '_pkg\.(sv|vh)$$' || true); \
INC_OTHERS=$$(printf '%s\n' $$INCSRCS | grep -Ev '_pkg\.(sv|vh)$$' || true); \
\
# 3. Identify Module Sources \
MODSRCS=""; \
MOD_SEARCH_PATH="$(MODROOT)$$TB_RELPATH"; \
\
# For vector unit tests (tb/unit/vector/*), compile the whole vector + sqrt + adders + multipliers + dividers + general subsystem \
if [ "$$TB_RELPATH" = "/vector" ]; then \
echo "[$@] vector TB detected -> compiling all vector + sqrt + adders + multipliers + dividers + general modules"; \
MOD_SEARCH_PATH="$(MODROOT)/vector \
$(MODROOT)/common/arithmetic/sqrt \
$(MODROOT)/common/arithmetic/adders \
$(MODROOT)/common/arithmetic/mutlipliers \
$(MODROOT)/common/arithmetic/dividers \
$(MODROOT)/common/general"; \
MODSRCS=$$(find $$MOD_SEARCH_PATH -type f -name '*.sv' ! -name '*_pkg.sv' -print 2>/dev/null | sort); \
else \
if [ -n "$(dut)" ]; then \
echo "[$@] compiling specific DUT files: $(dut)"; \
for f in $$(echo "$(dut)" | tr ',' ' '); do \
FOUND=$$(find $$MOD_SEARCH_PATH -name "$$f" -print); \
[ -n "$$FOUND" ] || { echo "Error: DUT file $$f not found in $$MOD_SEARCH_PATH"; exit 1; }; \
MODSRCS="$$MODSRCS $$FOUND"; \
done; \
MODSRCS=$$(printf '%s\n' $$MODSRCS | sed '/^$$/d' | sort -u); \
else \
echo "[$@] compiling all modules in: $$MOD_SEARCH_PATH"; \
MODSRCS=$$(find $$MOD_SEARCH_PATH -type f -name '*.sv' ! -name '*_pkg.sv' -print 2>/dev/null | sort); \
fi; \
fi; \
\
# 4. Testbench Sources \
TBSRCS="$$TB_CAND"; \
\
# 5. Build final compilation order \
ORDERED_SRCS="$$PKGS $$INC_OTHERS $$MODSRCS $$TBSRCS"; \
\
# 6. Setup Includes \
BASE_INCS="+incdir+$(INCDIRROOT) +incdir+$(MODROOT) +incdir+$(UNITTESTROOT)"; \
INCDIRS_ALL=$$(find "$(INCDIRROOT)" "$(MODROOT)" "$(UNITTESTROOT)" -type d -print 2>/dev/null | sed 's/^/+incdir+/'); \
ALL_INCS="$$BASE_INCS $$INCDIRS_ALL"; \
\
echo "[$@] Running generic simulation script..."; \
if [ "$(GUI)" = "ON" ]; then \
$(VSIM) -do "set batch_mode 0; \
set WAVE_ROOT $(WAVEROOT); \
set TB_NAME $$TB_TOP; \
set SRCS {$$ORDERED_SRCS}; \
set INCS {$$ALL_INCS}; \
set VLOG_FLAGS {$(VLOG_FLAGS)}; \
do $(SCRIPTROOT)/run_sim.tcl"; \
else \
$(VSIM) -c -do "set batch_mode 1; \
set WAVE_ROOT $(WAVEROOT); \
set TB_NAME $$TB_TOP; \
set SRCS {$$ORDERED_SRCS}; \
set INCS {$$ALL_INCS}; \
set VLOG_FLAGS {$(VLOG_FLAGS)}; \
do $(SCRIPTROOT)/run_sim.tcl"; \
fi

clean:
rm -rf $(SCRATCH) transcript vsim.wlf work modelsim.ini

36 changes: 36 additions & 0 deletions covhtmlreport/assertionsDirectives.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>

<head>
<title> </title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- JavaScript Libs -->
<!-- <script type="text/javascript" src="vendor/es5-shim-v4.5.9/es5-shim.min.js"></script> -->
<script type="text/javascript" src="vendor/jquery/jquery.min.js"></script>
<script type="text/javascript" src="vendor/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="vendor/ag-grid/ag-grid.min.noStyle.js"></script>

<script type="text/javascript" src="global.js"></script>

<script type="text/javascript" src="scripts/shared/routing.js"></script>
<script type="text/javascript" src="scripts/shared/testHitdata.js"></script>
<script type="text/javascript" src="scripts/shared/utils.js"></script>

<script type="text/javascript" src="scripts/assertionsDirectives.js"></script>


<!-- Styles -->
<link rel="stylesheet" type="text/css" href="vendor/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="vendor/ag-grid/styles/ag-grid.css">
<link rel="stylesheet" type="text/css" href="css/ag-grid-theme.css">
<link rel="stylesheet" type="text/css" href="vendor/font-awesome/css/font-awesome.min.css">

<link rel="stylesheet" type="text/css" href="css/style.css">
</head>

<body>
</body>

</html>
Loading