mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of https://github.com/openhwgroup/cvw
This commit is contained in:
commit
05cee79284
21
.github/dependabot.yml
vendored
Normal file
21
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
# Update git submodules to latest version
|
||||
- package-ecosystem: "gitsubmodule"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
ignore:
|
||||
- dependency-name: "addins/coremark"
|
||||
- dependency-name: "addins/embench-iot"
|
||||
- dependency-name: "addins/verilog-ethernet"
|
||||
# Update actions in the GitHub Actions workflow files
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
45
.github/workflows/install.yml
vendored
45
.github/workflows/install.yml
vendored
@ -19,6 +19,7 @@ on:
|
||||
- 'bin/wally-tool-chain-install.sh'
|
||||
- 'bin/wally-distro-check.sh'
|
||||
- 'bin/wally-package-install.sh'
|
||||
- '.github/workflows/install.yml'
|
||||
schedule:
|
||||
- cron: "0 7 * * 3" # Run at 12:00 AM Pacific Time on Wednesdays
|
||||
|
||||
@ -38,25 +39,46 @@ jobs:
|
||||
- name: ubuntu-20.04
|
||||
os: ubuntu-20.04
|
||||
container: null
|
||||
regressionFail: true
|
||||
- name: ubuntu-22.04
|
||||
os: ubuntu-22.04
|
||||
container: null
|
||||
- name: ubuntu-24.04
|
||||
os: ubuntu-24.04
|
||||
container: null
|
||||
# Debian Installations
|
||||
- name: debian-12
|
||||
os: ubuntu-latest
|
||||
image: debian:12
|
||||
imageFamily: debian
|
||||
- name: debian-11
|
||||
os: ubuntu-latest
|
||||
image: debian:11
|
||||
imageFamily: debian
|
||||
# Red Hat Installations
|
||||
- name: rocky-8
|
||||
os: ubuntu-latest
|
||||
image: rockylinux:8
|
||||
imageFamily: redhat
|
||||
regressionFail: true
|
||||
- name: rocky-9
|
||||
os: ubuntu-latest
|
||||
image: rockylinux:9
|
||||
imageFamily: redhat
|
||||
- name: almalinux-8
|
||||
os: ubuntu-latest
|
||||
image: almalinux:8
|
||||
imageFamily: redhat
|
||||
regressionFail: true
|
||||
- name: almalinux-9
|
||||
os: ubuntu-latest
|
||||
image: almalinux:9
|
||||
imageFamily: redhat
|
||||
# SUSE Installations
|
||||
- name: opensuse-15.6
|
||||
os: ubuntu-latest
|
||||
image: opensuse/leap:15.6
|
||||
imageFamily: suse
|
||||
# User level installation
|
||||
- name: user-install
|
||||
os: ubuntu-latest
|
||||
@ -82,11 +104,18 @@ jobs:
|
||||
|
||||
steps:
|
||||
# Docker images need git installed or the checkout action fails
|
||||
- name: Install Dependencies for Red Hat
|
||||
- name: Install Dependencies for Container Image
|
||||
if: ${{ matrix.image != null }}
|
||||
run: |
|
||||
dnf install -y sudo git
|
||||
dnf install curl -y --allowerasing || true
|
||||
if [ ${{ matrix.imageFamily }} == "debian" ]; then
|
||||
apt-get update
|
||||
apt-get install -y git
|
||||
elif [ ${{ matrix.imageFamily }} == "redhat" ]; then
|
||||
dnf install -y git
|
||||
dnf install curl -y --allowerasing || true
|
||||
elif [ ${{ matrix.imageFamily }} == "suse" ]; then
|
||||
zypper install -y git
|
||||
fi
|
||||
# Only clone submodules needed for standard tests/regression to save space
|
||||
- uses: actions/checkout@v4
|
||||
- name: Clone Necessary Submodules
|
||||
@ -106,7 +135,9 @@ jobs:
|
||||
# Run main tool chain installation script, either as a user or system wide
|
||||
- name: Install
|
||||
run: |
|
||||
if [ -z ${{ matrix.user }} ]; then
|
||||
if [ ! -z ${{ matrix.image }} ]; then
|
||||
./bin/wally-tool-chain-install.sh --clean ${{ matrix.riscv_path }}
|
||||
elif [ -z ${{ matrix.user }} ]; then
|
||||
sudo ./bin/wally-tool-chain-install.sh --clean ${{ matrix.riscv_path }}
|
||||
else
|
||||
sudo ./bin/wally-package-install.sh
|
||||
@ -136,16 +167,16 @@ jobs:
|
||||
# Only the linux-testvectors are needed, so remove the rest of the buildroot to save space
|
||||
- name: Remove Buildroot to Save Space
|
||||
run: |
|
||||
sudo rm -rf $RISCV/buildroot/output/build
|
||||
rm -rf $RISCV/buildroot/output/build || sudo rm -rf $RISCV/buildroot/output/build
|
||||
df -h
|
||||
# Run standard regression, skipping distros that are known to be broken with Verilator
|
||||
- name: Regression
|
||||
if: ${{ matrix.name != 'ubuntu-20.04' && matrix.name != 'rocky-8' && matrix.name != 'almalinux-8'}}
|
||||
if: ${{ matrix.regressionFail != true }}
|
||||
run: |
|
||||
source setup.sh
|
||||
regression-wally
|
||||
- name: Lint + wsim Test Only (for distros with broken Verilator sim)
|
||||
if: ${{ matrix.name == 'ubuntu-20.04' || matrix.name == 'rocky-8' || matrix.name == 'almalinux-8'}}
|
||||
if: ${{ matrix.regressionFail == true }}
|
||||
run: |
|
||||
source setup.sh
|
||||
mkdir -p $WALLY/sim/verilator/logs/
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -12,6 +12,7 @@
|
||||
*.map
|
||||
*.elf*
|
||||
*.list
|
||||
*.memfile
|
||||
|
||||
# General directories to ignore
|
||||
.vscode/
|
||||
@ -33,6 +34,7 @@ tests/fp/combined_IF_vectors/IF_vectors/*.tv
|
||||
tests/custom/*/*/
|
||||
tests/custom/*/*/*.memfile
|
||||
sim/tests/riscvdv
|
||||
testbench/trek_files/uvm_output
|
||||
|
||||
# Linux
|
||||
linux/buildroot
|
||||
@ -153,6 +155,8 @@ examples/C/mcmodel/mcmodel_medany
|
||||
examples/C/mcmodel/mcmodel_medlow
|
||||
examples/C/sum/sum
|
||||
examples/C/sum_mixed/sum_mixed
|
||||
examples/C/hello/hello
|
||||
examples/C/gpio/gpio
|
||||
examples/asm/sumtest/sumtest
|
||||
examples/asm/example/example
|
||||
examples/asm/trap/trap
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -8,9 +8,6 @@
|
||||
[submodule "addins/coremark"]
|
||||
path = addins/coremark
|
||||
url = https://github.com/eembc/coremark
|
||||
[submodule "addins/FreeRTOS-Kernel"]
|
||||
path = addins/FreeRTOS-Kernel
|
||||
url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git
|
||||
[submodule "addins/vivado-boards"]
|
||||
path = addins/vivado-boards
|
||||
url = https://github.com/Digilent/vivado-boards/
|
||||
@ -29,9 +26,6 @@
|
||||
path = addins/cvw-arch-verif
|
||||
url = https://github.com/openhwgroup/cvw-arch-verif
|
||||
ignore = dirty
|
||||
[submodule "addins/riscvISACOV"]
|
||||
path = addins/riscvISACOV
|
||||
url = https://github.com/riscv-verification/riscvISACOV.git
|
||||
[submodule "addins/berkeley-softfloat-3"]
|
||||
path = addins/berkeley-softfloat-3
|
||||
url = https://github.com/ucb-bar/berkeley-softfloat-3.git
|
||||
|
13
Makefile
13
Makefile
@ -6,9 +6,9 @@ MAKEFLAGS += --output-sync --no-print-directory
|
||||
|
||||
SIM = ${WALLY}/sim
|
||||
|
||||
.PHONY: all riscof testfloat combined_IF_vectors zsbl benchmarks coremark embench coverage clean
|
||||
.PHONY: all riscof testfloat combined_IF_vectors zsbl benchmarks coremark embench coverage cvw-arch-verif clean
|
||||
|
||||
all: riscof testfloat combined_IF_vectors zsbl coverage # benchmarks
|
||||
all: riscof testfloat combined_IF_vectors zsbl coverage cvw-arch-verif # benchmarks
|
||||
|
||||
# riscof builds the riscv-arch-test and wally-riscv-arch-test suites
|
||||
riscof:
|
||||
@ -36,6 +36,15 @@ embench:
|
||||
coverage:
|
||||
$(MAKE) -C tests/coverage
|
||||
|
||||
cvw-arch-verif:
|
||||
$(MAKE) -C ${WALLY}/addins/cvw-arch-verif
|
||||
|
||||
# Requires a license for the Breker tool. See tests/breker/README.md for details
|
||||
breker:
|
||||
$(MAKE) -C ${WALLY}/testbench/trek_files
|
||||
$(MAKE) -C ${WALLY}/tests/breker
|
||||
|
||||
clean:
|
||||
$(MAKE) clean -C sim
|
||||
$(MAKE) clean -C ${WALLY}/tests/fp
|
||||
$(MAKE) clean -C ${WALLY}/addins/cvw-arch-verif
|
||||
|
59
README.md
59
README.md
@ -59,7 +59,19 @@ Then fork and clone the repo, source setup, make the tests and run regression
|
||||
fi
|
||||
```
|
||||
|
||||
9. Build the tests and run a regression simulation to prove everything is installed. Building tests may take a while.
|
||||
9. Try compiling the HelloWally program and simulating it on the SystemVerilog with Verilator and on the Spike simulator.
|
||||
```
|
||||
$ cd examples/C/hello
|
||||
$ make
|
||||
$ wsim --sim verilator rv64gc --elf hello
|
||||
Hello Wally!
|
||||
0 1 2 3 4 5 6 7 8 9
|
||||
$ spike hello
|
||||
Hello Wally!
|
||||
0 1 2 3 4 5 6 7 8 9
|
||||
```
|
||||
|
||||
10. Build the tests and run a regression simulation to prove everything is installed. Building tests may take a while.
|
||||
|
||||
```bash
|
||||
$ make --jobs
|
||||
@ -71,7 +83,8 @@ Then fork and clone the repo, source setup, make the tests and run regression
|
||||
> This section describes the open source toolchain installation.
|
||||
|
||||
### Compatibility
|
||||
The current version of the toolchain has been tested on Ubuntu (versions 20.04 LTS, 22.04 LTS, and 24.04 LTS) and on Red Hat/Rocky/AlmaLinux (versions 8 and 9).
|
||||
The current version of the toolchain has been tested on Ubuntu (versions 20.04 LTS, 22.04 LTS, and 24.04 LTS), Debian (versions 11 and 12), Red Hat/Rocky/AlmaLinux (versions 8 and 9),
|
||||
and SUSE version 15.6. Only the latest minor release of each major version is tested.
|
||||
|
||||
> [!WARNING]
|
||||
> - Ubuntu 22.04LTS is incompatible with Synopsys Design Compiler.
|
||||
@ -135,11 +148,17 @@ export VCS_HOME=.. # Change this for your path to Synopsys VCS
|
||||
|
||||
Electronic Design Automation (EDA) tools are vital to implementations of System on Chip architectures as well as validating different designs. Open-source and commercial tools exist for multiple strategies and although the one can spend a lifetime using combinations of different tools, only a small subset of tools is utilized for this text. The tools are chosen because of their ease in access as well as their repeatability for accomplishing many of the tasks utilized to design Wally. It is anticipated that additional tools may be documented later after this is text is published to improve use and access.
|
||||
|
||||
Siemens Questa is the primary tool utilized for simulating and validating Wally. For logic synthesis, you will need Synopsys Design Compiler. Questa and Design Compiler are commercial tools that require an educational or commercial license.
|
||||
Verilator is an open-source Verilog simulator. It is fast and free. Run Wally on the riscv-arch-test suite using Verilator with:
|
||||
|
||||
```
|
||||
regression-wally
|
||||
```
|
||||
|
||||
Running code or functional coverage simulations or lock-step presently require commercial tools. Siemens Questa is the primary tool utilized for simulating and validating Wally. Synopsys VCS also can run regression-wally and lock-step simulation. For logic synthesis, you will need Synopsys Design Compiler. Questa and Design Compiler are commercial tools that require an educational or commercial license.
|
||||
|
||||
Note: Some EDA tools utilize `LM_LICENSE_FILE` for their environmental variable to point to their license server. Some operating systems may also utilize `MGLS_LICENSE_FILE` instead, therefore, it is important to read the user manual on the preferred environmental variable required to point to a user’s license file. Although there are different mechanisms to allow licenses to work, many companies commonly utilize the FlexLM (i.e., Flex-enabled) license server manager that runs off a node locked license.
|
||||
|
||||
Although most EDA tools are Linux-friendly, they tend to have issues when not installed on recommended OS flavors. Both Red Hat Enterprise Linux and SUSE Linux products typically tend to be recommended for installing commercial-based EDA tools and are recommended for utilizing complex simulation and architecture exploration. Questa can also be installed on Microsoft Windows as well as Mac OS with a Virtual Machine such as Parallels.
|
||||
Although most EDA tools are Linux-friendly, they tend to have issues when not installed on recommended OS flavors. Red Hat Enterprise Linux (and its free Rocky clone) and SUSE Linux products typically tend to be recommended for installing commercial-based EDA tools and are recommended for utilizing complex simulation and architecture exploration.
|
||||
|
||||
### Siemens Questa
|
||||
|
||||
@ -208,26 +227,28 @@ This utility will take up approximately 100 GB on your hard drive. You can also
|
||||
|
||||
wsim runs one of multiple simulators, Questa, VCS, or Verilator using a specific configuration and either a suite of tests or a specific elf file.
|
||||
The general syntax is
|
||||
`wsim <config> <suite or elf file or directory> [--options]`
|
||||
`wsim <config> <suite or elf file> [--options]`
|
||||
|
||||
Parameters and options:
|
||||
|
||||
```
|
||||
-h, --help show this help message and exit
|
||||
--elf ELF, -e ELF ELF File name; use if name does not end in .elf
|
||||
--sim {questa,verilator,vcs}, -s {questa,verilator,vcs} Simulator
|
||||
--tb {testbench,testbench_fp}, -t {testbench,testbench_fp} Testbench
|
||||
--gui, -g Simulate with GUI
|
||||
--coverage, -c Code & Functional Coverage
|
||||
--fcov, -f Code & Functional Coverage
|
||||
--ccov, -c Code Coverage
|
||||
--fcov, -f Functional Coverage with cvw-arch-verif, implies lockstep
|
||||
--args ARGS, -a ARGS Optional arguments passed to simulator via $value$plusargs
|
||||
--params PARAMS, -p PARAMS Optional top-level parameter overrides of the form param=value
|
||||
--define DEFINE, -d DEFINE Optional define macros passed to simulator
|
||||
--vcd, -v Generate testbench.vcd
|
||||
--lockstep, -l Run ImperasDV lock, step, and compare.
|
||||
--locksteplog LOCKSTEPLOG, -b LOCKSTEPLOG Retired instruction number to be begin logging.
|
||||
--covlog COVLOG, -d COVLOG Log coverage after n instructions.
|
||||
--elfext ELFEXT, -e ELFEXT When searching for elf files only includes ones which end in this extension
|
||||
--lockstepverbose, -lv Run ImperasDV lock, step, and compare with tracing enabled
|
||||
--rvvi, -r Simulate rvvi hardware interface and ethernet.
|
||||
```
|
||||
|
||||
Run basic test with questa
|
||||
Run basic test with Questa
|
||||
|
||||
```bash
|
||||
wsim rv64gc arch64i
|
||||
@ -239,26 +260,26 @@ Run Questa with gui
|
||||
wsim rv64gc wally64priv --gui
|
||||
```
|
||||
|
||||
Run lockstep against ImperasDV with a single elf file in the gui. Lockstep requires single elf.
|
||||
Run basic test with Verilator
|
||||
|
||||
```bash
|
||||
wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/ref/ref.elf --lockstep --gui
|
||||
wsim rv32i arch32i --sim verilator
|
||||
```
|
||||
|
||||
Run lockstep against ImperasDV with a single elf file. Compute coverage.
|
||||
Run lockstep against ImperasDV with a single elf file in the gui. Lockstep requires single elf.
|
||||
|
||||
```bash
|
||||
wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/ref/ref.elf --lockstep --coverage
|
||||
wsim rv64gc $WALLY/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/ref/ref.elf --lockstep --gui
|
||||
```
|
||||
|
||||
Run lockstep against ImperasDV with directory file.
|
||||
Run lockstep against ImperasDV with a single elf file. Collect functional coverage.
|
||||
|
||||
```bash
|
||||
wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/ --lockstep
|
||||
wsim rv64gc $WALLY/addins/cvw-arch-verif/tests/rv64/Zicsr/WALLY-COV-ALL.elf --fcov
|
||||
```
|
||||
|
||||
Run lockstep against ImperasDV with directory file and specify specific extension.
|
||||
Run Linux boot simulation in lock step between Wally and ImperasDV
|
||||
|
||||
```bash
|
||||
wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/ --lockstep --elfext ref.elf
|
||||
wsim buildroot buildroot --args +INSTR_LIMIT=600000000 --lockstep
|
||||
```
|
||||
|
@ -1 +0,0 @@
|
||||
Subproject commit 17a46c252f2f237e03a6768c5d15731215322f31
|
@ -1 +1 @@
|
||||
Subproject commit 6d658b7b42c83fd584008d72964cc75d0876b769
|
||||
Subproject commit 66b675017878032974c537ab7aa81758b9812530
|
@ -1 +1 @@
|
||||
Subproject commit a079bb263b04dde4028efee134f3a4e42799a5ca
|
||||
Subproject commit eeffdf802c117f592b30e380b59caf48da384e76
|
@ -1 +0,0 @@
|
||||
Subproject commit ac9fa2d386c0cb2f44e1e1e83a555d585034dfa3
|
@ -1 +1 @@
|
||||
Subproject commit e5f0728cd284d10080ae8eb03fc86e7b5eafcb72
|
||||
Subproject commit d1898bd01f25d4965f9e50659bbdf70365745a06
|
@ -33,8 +33,8 @@ tests = [
|
||||
"arch32i", "arch32priv", "arch32c", "arch32m", "arch32a_amo", "arch32zifencei", "arch32zicond",
|
||||
"arch32zba", "arch32zbb", "arch32zbc", "arch32zbs", "arch32zfh", "arch32zfh_fma",
|
||||
"arch32zfh_divsqrt", "arch32zfaf", "arch32zfad", "wally32a_lrsc", "wally32priv", "wally32periph", "arch32zcb",
|
||||
"arch32zbkb", "arch32zbkc", "arch32zbkx", "arch32zknd", "arch32zkne", "arch32zknh"]],
|
||||
["rv64i", ["arch64i"]]
|
||||
"arch32zbkb", "arch32zbkc", "arch32zbkx", "arch32zknd", "arch32zkne", "arch32zknh", "arch32vm_sv32", "arch32pmp"]],
|
||||
["rv64i", ["arch64i"]]
|
||||
]
|
||||
|
||||
# Separate test for short buildroot run through OpenSBI UART output
|
||||
@ -60,7 +60,7 @@ tests64gc_nofp = [
|
||||
["rv64gc", ["coverage64gc", "arch64i", "arch64priv", "arch64c", "arch64m", "arch64zcb",
|
||||
"arch64zifencei", "arch64zicond", "arch64a_amo", "wally64a_lrsc", "wally64periph", "wally64priv",
|
||||
"arch64zbkb", "arch64zbkc", "arch64zbkx", "arch64zknd", "arch64zkne", "arch64zknh",
|
||||
"arch64zba", "arch64zbb", "arch64zbc", "arch64zbs"]] # add when working: "arch64zicboz"
|
||||
"arch64zba", "arch64zbb", "arch64zbc", "arch64zbs", "arch64pmp"]] # add when working: "arch64zicboz"
|
||||
]
|
||||
|
||||
tests64gc_fp = [
|
||||
@ -233,7 +233,6 @@ bpredtests = [
|
||||
# list of tests not supported by ImperasDV yet that should be waived during lockstep testing
|
||||
lockstepwaivers = [
|
||||
"WALLY-q-01.S_ref.elf", # Q extension is not supported by ImperasDV
|
||||
"coverage_tlbMisaligned.elf", # Issue 976: ImperasDV bug disagrees with Wally related to misaligned pages when PBMT makes page uncachable
|
||||
"WALLY-cbom-01.S_ref.elf" #, # cbom extension is not supported by ImperasDV because there is no cache model in ImperasDV
|
||||
]
|
||||
|
||||
@ -265,8 +264,8 @@ class bcolors:
|
||||
def addTests(tests, sim):
|
||||
sim_logdir = WALLY+ "/sim/" + sim + "/logs/"
|
||||
for test in tests:
|
||||
config = test[0];
|
||||
suites = test[1];
|
||||
config = test[0]
|
||||
suites = test[1]
|
||||
if (len(test) >= 3):
|
||||
args = " --args " + " ".join(test[2])
|
||||
else:
|
||||
@ -291,18 +290,39 @@ def addTests(tests, sim):
|
||||
configs.append(tc)
|
||||
|
||||
|
||||
def addLockstepTestsByDir(dir, config, sim, fcovMode):
|
||||
sim_logdir = WALLY+ "/sim/" + sim + "/logs/"
|
||||
if (coverStr != ""): # use --fcov in place of --lockstep
|
||||
cmdPrefix="wsim --sim " + sim + " " + coverStr + " " + config
|
||||
else:
|
||||
cmdPrefix="wsim --lockstep --sim " + sim + " " + config
|
||||
if (os.path.isdir(dir)):
|
||||
def addTestsByDir(dir, config, sim, lockstepMode=0, brekerMode=0):
|
||||
if os.path.isdir(dir):
|
||||
sim_logdir = WALLY+ "/sim/" + sim + "/logs/"
|
||||
if coverStr == "--fcov": # use --fcov in place of --lockstep
|
||||
cmdPrefix="wsim --sim " + sim + " " + coverStr + " " + config
|
||||
gs="Mismatches : 0"
|
||||
if ("cvw-arch-verif/tests" in dir and not "priv" in dir):
|
||||
fileEnd = "ALL.elf"
|
||||
else:
|
||||
fileEnd = ".elf"
|
||||
elif coverStr == "--ccov":
|
||||
cmdPrefix="wsim --sim " + sim + " " + coverStr + " " + config
|
||||
gs="Single Elf file tests are not signatured verified."
|
||||
if ("cvw-arch-verif/tests" in dir and not "priv" in dir):
|
||||
fileEnd = "ALL.elf"
|
||||
else:
|
||||
fileEnd = ".elf"
|
||||
elif lockstepMode:
|
||||
cmdPrefix="wsim --lockstep --sim " + sim + " " + config
|
||||
gs="Mismatches : 0"
|
||||
fileEnd = ".elf"
|
||||
elif brekerMode:
|
||||
cmdPrefix="wsim --sim " + sim + " " + config
|
||||
gs="# trek: info: summary: Test PASSED"
|
||||
fileEnd = ".elf"
|
||||
else:
|
||||
cmdPrefix="wsim --sim " + sim + " " + config
|
||||
gs="Single Elf file tests are not signatured verified."
|
||||
fileEnd = ".elf"
|
||||
for dirpath, dirnames, filenames in os.walk(os.path.abspath(dir)):
|
||||
for file in filenames:
|
||||
# fcov lockstep only runs on WALLY-COV-ALL.elf files; other lockstep runs on all files
|
||||
if ((file.endswith(".elf") and (fcovMode == 0 or "tests/priv" in dir)) or
|
||||
(file.endswith("ALL.elf") and fcovMode == 1)):
|
||||
if file.endswith(fileEnd):
|
||||
fullfile = os.path.join(dirpath, file)
|
||||
fields = fullfile.rsplit('/', 3)
|
||||
if (fields[2] == "ref"):
|
||||
@ -318,7 +338,7 @@ def addLockstepTestsByDir(dir, config, sim, fcovMode):
|
||||
name=file,
|
||||
variant=config,
|
||||
cmd=cmdPrefix + " " + fullfile + " > " + sim_log,
|
||||
grepstr="Mismatches : 0",
|
||||
grepstr=gs,
|
||||
grepfile = sim_log)
|
||||
configs.append(tc)
|
||||
else:
|
||||
@ -379,14 +399,14 @@ parser.add_argument("--fcov", help="Functional Coverage", action="store_true")
|
||||
parser.add_argument("--nightly", help="Run large nightly regression", action="store_true")
|
||||
parser.add_argument("--buildroot", help="Include Buildroot Linux boot test (takes many hours, done along with --nightly)", action="store_true")
|
||||
parser.add_argument("--testfloat", help="Include Testfloat floating-point unit tests", action="store_true")
|
||||
parser.add_argument("--fp", help="Include floating-point tests in coverage (slower runtime)", action="store_true")
|
||||
parser.add_argument("--fp", help="Include floating-point tests in coverage (slower runtime)", action="store_true") # Currently not used
|
||||
parser.add_argument("--breker", help="Run Breker tests", action="store_true") # Requires a license for the breker tool. See tests/breker/README.md for details
|
||||
parser.add_argument("--dryrun", help="Print commands invoked to console without running regression", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
if (args.nightly):
|
||||
nightMode = "--nightly";
|
||||
nightMode = "--nightly"
|
||||
sims = ["questa", "verilator", "vcs"] # exercise all simulators; can omit a sim if no license is available
|
||||
# sims = ["questa", "verilator"] # exercise all simulators; can omit a sim if no license is available
|
||||
else:
|
||||
nightMode = ""
|
||||
sims = [defaultsim]
|
||||
@ -396,7 +416,7 @@ if (args.ccov): # only run RV64GC tests in coverage mode
|
||||
elif (args.fcov): # only run RV64GC tests in lockstep in coverage mode
|
||||
coverStr = '--fcov'
|
||||
else:
|
||||
coverStr = ''
|
||||
coverStr = ''
|
||||
|
||||
|
||||
# Run Lint
|
||||
@ -417,16 +437,16 @@ if (args.buildroot):
|
||||
addTests(tests_buildrootbootlockstep, lockstepsim) # lockstep with Questa and ImperasDV runs overnight
|
||||
|
||||
if (args.ccov): # only run RV64GC tests on Questa in code coverage mode
|
||||
addTests(tests64gc_nofp, coveragesim)
|
||||
if (args.fp):
|
||||
addTests(tests64gc_fp, coveragesim)
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/rv64/", "rv64gc", coveragesim)
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/priv/rv64/", "rv64gc", coveragesim)
|
||||
addTestsByDir(WALLY+"/tests/coverage/", "rv64gc", coveragesim)
|
||||
elif (args.fcov): # run tests in lockstep in functional coverage mode
|
||||
addLockstepTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/rv32/", "rv32gc", coveragesim, 1)
|
||||
addLockstepTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/rv64/", "rv64gc", coveragesim, 1)
|
||||
addLockstepTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/priv/rv32/", "rv32gc", coveragesim, 1)
|
||||
addLockstepTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/priv/rv64/", "rv64gc", coveragesim, 1)
|
||||
#addLockstepTestsByDir(WALLY+"/tests/riscof/work/wally-riscv-arch-test/rv64i_m/privilege/src/", "rv64gc", coveragesim, 0)
|
||||
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/rv32/", "rv32gc", coveragesim)
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/rv64/", "rv64gc", coveragesim)
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/priv/rv32/", "rv32gc", coveragesim)
|
||||
addTestsByDir(WALLY+"/addins/cvw-arch-verif/tests/lockstep/priv/rv64/", "rv64gc", coveragesim)
|
||||
elif (args.breker):
|
||||
addTestsByDir(WALLY+"/tests/breker/work", "breker", "questa", brekerMode=1)
|
||||
else:
|
||||
for sim in sims:
|
||||
if (not (args.buildroot and sim == lockstepsim)): # skip short buildroot sim if running long one
|
||||
@ -437,9 +457,9 @@ else:
|
||||
|
||||
# run derivative configurations and lockstep tests in nightly regression
|
||||
if (args.nightly):
|
||||
addLockstepTestsByDir(WALLY+"/tests/coverage", "rv64gc", lockstepsim, 0)
|
||||
addLockstepTestsByDir(WALLY+"/tests/riscof/work/wally-riscv-arch-test/rv64i_m", "rv64gc", lockstepsim, 0)
|
||||
addLockstepTestsByDir(WALLY+"/tests/riscof/work/wally-riscv-arch-test/rv32i_m", "rv32gc", lockstepsim, 0)
|
||||
addTestsByDir(WALLY+"/tests/coverage", "rv64gc", lockstepsim, lockstepMode=1)
|
||||
addTestsByDir(WALLY+"/tests/riscof/work/wally-riscv-arch-test/rv64i_m", "rv64gc", lockstepsim, lockstepMode=1)
|
||||
addTestsByDir(WALLY+"/tests/riscof/work/wally-riscv-arch-test/rv32i_m", "rv32gc", lockstepsim, lockstepMode=1)
|
||||
addTests(derivconfigtests, defaultsim)
|
||||
# addTests(bpredtests, defaultsim) # This is currently broken in regression due to something related to the new wsim script.
|
||||
|
||||
@ -540,17 +560,17 @@ def main():
|
||||
else:
|
||||
ImperasDVLicenseCount = 10000 # effectively no license limit for non-lockstep tests
|
||||
with Pool(processes=min(len(configs),multiprocessing.cpu_count(), ImperasDVLicenseCount)) as pool:
|
||||
num_fail = 0
|
||||
results = {}
|
||||
for config in configs:
|
||||
results[config] = pool.apply_async(run_test_case,(config, args.dryrun))
|
||||
for (config,result) in results.items():
|
||||
try:
|
||||
num_fail+=result.get(timeout=TIMEOUT_DUR)
|
||||
except TimeoutError:
|
||||
pool.terminate()
|
||||
num_fail+=1
|
||||
print(f"{bcolors.FAIL}%s: Timeout - runtime exceeded %d seconds{bcolors.ENDC}" % (config.cmd, TIMEOUT_DUR))
|
||||
num_fail = 0
|
||||
results = {}
|
||||
for config in configs:
|
||||
results[config] = pool.apply_async(run_test_case,(config, args.dryrun))
|
||||
for (config,result) in results.items():
|
||||
try:
|
||||
num_fail+=result.get(timeout=TIMEOUT_DUR)
|
||||
except TimeoutError:
|
||||
pool.terminate()
|
||||
num_fail+=1
|
||||
print(f"{bcolors.FAIL}%s: Timeout - runtime exceeded %d seconds{bcolors.ENDC}" % (config.cmd, TIMEOUT_DUR))
|
||||
|
||||
# Coverage report
|
||||
if args.ccov:
|
||||
|
@ -41,52 +41,96 @@ ENDC='\033[0m' # Reset to default color
|
||||
# Print section header
|
||||
section_header() {
|
||||
if tput cols > /dev/null 2>&1; then
|
||||
printf "${SECTION_COLOR}%$(tput cols)s" | tr ' ' '#'
|
||||
printf "%$(tput cols)s" | tr ' ' '#'
|
||||
echo -e "$1"
|
||||
printf "%$(tput cols)s" | tr ' ' '#'
|
||||
printf "%$(tput cols)s${ENDC}" | tr ' ' '#'
|
||||
printf "${SECTION_COLOR}%$(tput cols)s\n" | tr ' ' '#'
|
||||
printf "%$(tput cols)s\n" | tr ' ' '#'
|
||||
printf "%s\n" "$1"
|
||||
printf "%$(tput cols)s\n" | tr ' ' '#'
|
||||
printf "%$(tput cols)s${ENDC}\n" | tr ' ' '#'
|
||||
else
|
||||
echo -e "${SECTION_COLOR}$1${ENDC}"
|
||||
printf "${SECTION_COLOR}%s\n${ENDC}" "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
section_header "Checking System Requirements and Configuring Installation"
|
||||
|
||||
# Get distribution information
|
||||
test -e /etc/os-release && os_release="/etc/os-release" || os_release="/usr/lib/os-release"
|
||||
source "$os_release"
|
||||
if [ -f /etc/os-release ]; then
|
||||
source /etc/os-release
|
||||
else
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "/etc/os-release file not found. Distribution unknown."
|
||||
PRETTY_NAME=UNKNOWN
|
||||
fi
|
||||
|
||||
# Check for compatible distro
|
||||
if [[ "$ID" == rhel || "$ID_LIKE" == *rhel* ]]; then
|
||||
export FAMILY=rhel
|
||||
if [ "$ID" != rhel ] && [ "$ID" != rocky ] && [ "$ID" != almalinux ]; then
|
||||
printf "${WARNING_COLOR}%s\n${ENDC}" "For Red Hat family distros, the Wally install script has only been tested on RHEL, Rocky Linux," \
|
||||
printf "${WARNING_COLOR}%s%s\n${ENDC}" "For Red Hat family distros, the Wally installation script has only been tested on RHEL, Rocky Linux," \
|
||||
" and AlmaLinux. Your distro is $PRETTY_NAME. The regular Red Hat install will be attempted, but there may be issues."
|
||||
fi
|
||||
export RHEL_VERSION="${VERSION_ID:0:1}"
|
||||
if (( RHEL_VERSION < 8 )); then
|
||||
echo "${FAIL_COLOR}The Wally install script is only compatible with versions 8 and 9 of RHEL, Rocky Linux, and AlmaLinux. You have version $VERSION.${ENDC}"
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally installation script is only compatible with versions 8 and 9 of RHEL, Rocky Linux, and AlmaLinux. You have version $VERSION."
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "$ID" == ubuntu || "$ID_LIKE" == *ubuntu* ]]; then
|
||||
export FAMILY=ubuntu
|
||||
if [ "$ID" != ubuntu ]; then
|
||||
printf "${WARNING_COLOR}%s\n${ENDC}" "For Ubuntu family distros, the Wally install script has only been tested on standard Ubuntu. Your distro " \
|
||||
printf "${WARNING_COLOR}%s%s\n${ENDC}" "For Ubuntu family distros, the Wally installation script is only tested on standard Ubuntu. Your distro " \
|
||||
"is $PRETTY_NAME. The regular Ubuntu install will be attempted, but there may be issues."
|
||||
# Ubuntu derivates may use different version numbers. Attempt to derive version from Ubuntu codename
|
||||
case "$UBUNTU_CODENAME" in
|
||||
noble)
|
||||
export UBUNTU_VERSION=24
|
||||
;;
|
||||
jammy)
|
||||
export UBUNTU_VERSION=22
|
||||
;;
|
||||
focal)
|
||||
export UBUNTU_VERSION=20
|
||||
;;
|
||||
*)
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "Unable to determine which base Ubuntu version you are using."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "Detected Ubuntu derivative baesd on Ubuntu $UBUNTU_VERSION.04."
|
||||
else
|
||||
export UBUNTU_VERSION="${VERSION_ID:0:2}"
|
||||
fi
|
||||
export UBUNTU_VERSION="${VERSION_ID:0:2}"
|
||||
if (( UBUNTU_VERSION < 20 )); then
|
||||
echo "${FAIL_COLOR}The Wally install script has only been tested with versions 20.04 LTS, 22.04 LTS, and 24.04 LTS of Ubuntu. You have version $VERSION.${ENDC}"
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally installation script has only been tested with Ubuntu versions 20.04 LTS, 22.04 LTS, and 24.04 LTS. You have version $VERSION."
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "$ID" == debian || "$ID_LIKE" == *debian* ]]; then
|
||||
export FAMILY=debian
|
||||
if [ "$ID" != debian ]; then
|
||||
printf "${WARNING_COLOR}%s%s\n${ENDC}" "For Debian family distros, the Wally installation script has only been tested on standard Debian (and Ubuntu). Your distro " \
|
||||
"is $PRETTY_NAME. The regular Debian install will be attempted, but there may be issues."
|
||||
fi
|
||||
export DEBIAN_VERSION="$VERSION_ID"
|
||||
if (( DEBIAN_VERSION < 11 )); then
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally installation script has only been tested with Debian versions 11 and 12. You have version $VERSION."
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "$ID" == opensuse-leap || "$ID" == sles || "$ID_LIKE" == *suse* ]]; then
|
||||
export FAMILY=suse
|
||||
if [[ "$ID" != opensuse-leap && "$ID" != sles ]]; then
|
||||
printf "${WARNING_COLOR}%s%s\n${ENDC}" "For SUSE family distros, the Wally installation script has only been tested on OpenSUSE Leap and SLES. Your distro " \
|
||||
"is $PRETTY_NAME. The regular SUSE install will be attempted, but there may be issues. If you are using OpenSUSE Tumbleweed, the version check will fail."
|
||||
fi
|
||||
export SUSE_VERSION="${VERSION_ID//.}"
|
||||
if (( SUSE_VERSION < 156 )); then
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally installation script has only been tested with SUSE version 15.6. You have version $VERSION."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally install script is currently only compatible with Ubuntu and Red Hat family " \
|
||||
printf "${FAIL_COLOR}%s%s%s\n${ENDC}" "The Wally installation script is currently only compatible with Ubuntu, Debian, SUSE, and Red Hat family " \
|
||||
"(RHEL, Rocky Linux, or AlmaLinux) distros. Your detected distro is $PRETTY_NAME. You may try manually running the " \
|
||||
"commands in this script, but it is likely that some will need to be altered."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${OK_COLOR}${UNDERLINE}Detected information${ENDC}"
|
||||
printf "${OK_COLOR}${UNDERLINE}%s\n${ENDC}" "Detected information"
|
||||
echo "Distribution: $PRETTY_NAME"
|
||||
echo "Version: $VERSION"
|
||||
|
@ -43,55 +43,83 @@ if [ -z "$FAMILY" ]; then
|
||||
fi
|
||||
|
||||
|
||||
# Generate list of packages to install and package manager commands based on distro
|
||||
# Packages are grouped by which tool requires them. If multiple tools need a package, it is included in the first tool only
|
||||
if [ "$FAMILY" == rhel ]; then
|
||||
PYTHON_VERSION=python3.12
|
||||
PACKAGE_MANAGER="dnf"
|
||||
UPDATE_COMMAND="sudo $PACKAGE_MANAGER update -y"
|
||||
GENERAL_PACKAGES+=(which rsync git make cmake "$PYTHON_VERSION" "$PYTHON_VERSION"-pip curl wget tar pkgconf-pkg-config dialog mutt ssmtp)
|
||||
GNU_PACKAGES+=(autoconf automake libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo gperf libtool patchutils bc gcc gcc-c++ zlib-devel expat-devel libslirp-devel)
|
||||
QEMU_PACKAGES+=(glib2-devel libfdt-devel pixman-devel bzip2 ninja-build)
|
||||
SPIKE_PACKAGES+=(dtc boost-regex boost-system)
|
||||
VERILATOR_PACKAGES+=(help2man perl clang ccache gperftools numactl mold)
|
||||
BUILDROOT_PACKAGES+=(ncurses-base ncurses ncurses-libs ncurses-devel gcc-gfortran cpio) # gcc-gfortran is only needed for compiling spec benchmarks on buildroot linux
|
||||
# Extra packages not availale in rhel8, nice for Verilator
|
||||
if (( RHEL_VERSION >= 9 )); then
|
||||
VERILATOR_PACKAGES+=(perl-doc)
|
||||
fi
|
||||
# A newer version of gcc is required for qemu
|
||||
OTHER_PACKAGES=(gcc-toolset-13)
|
||||
elif [ "$FAMILY" == ubuntu ]; then
|
||||
if (( UBUNTU_VERSION >= 24 )); then
|
||||
# Packages that are constant across distros
|
||||
GENERAL_PACKAGES+=(rsync git make cmake curl wget tar unzip bzip2 dialog mutt)
|
||||
GNU_PACKAGES+=(autoconf automake gawk bison flex texinfo gperf libtool patchutils bc gcc)
|
||||
VERILATOR_PACKAGES+=(help2man perl clang ccache numactl)
|
||||
BUILDROOT_PACKAGES+=(cpio)
|
||||
|
||||
# Distro specific packages and package manager
|
||||
case "$FAMILY" in
|
||||
rhel)
|
||||
PYTHON_VERSION=python3.12
|
||||
VERILATOR_PACKAGES+=(mold) # Not availale in Ubuntu 20.04, nice for Verilator
|
||||
elif (( UBUNTU_VERSION >= 22 )); then
|
||||
PYTHON_VERSION=python3.11
|
||||
VERILATOR_PACKAGES+=(mold) # Not availale in Ubuntu 20.04, nice for Verilator
|
||||
elif (( UBUNTU_VERSION >= 20 )); then
|
||||
PYTHON_VERSION=python3.9
|
||||
OTHER_PACKAGES+=(gcc-10 g++-10 cpp-10) # Newer version of gcc needed for Verilator
|
||||
fi
|
||||
PACKAGE_MANAGER="DEBIAN_FRONTEND=noninteractive apt-get"
|
||||
UPDATE_COMMAND="sudo $PACKAGE_MANAGER update -y && sudo $PACKAGE_MANAGER upgrade -y --with-new-pkgs"
|
||||
GENERAL_PACKAGES+=(rsync git make cmake "$PYTHON_VERSION" python3-pip "$PYTHON_VERSION"-venv curl wget tar pkg-config dialog mutt ssmtp)
|
||||
GNU_PACKAGES+=(autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat1-dev ninja-build libglib2.0-dev libslirp-dev)
|
||||
QEMU_PACKAGES+=(libfdt-dev libpixman-1-dev)
|
||||
SPIKE_PACKAGES+=(device-tree-compiler libboost-regex-dev libboost-system-dev)
|
||||
VERILATOR_PACKAGES+=(help2man perl g++ clang ccache libunwind-dev libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlib1g)
|
||||
BUILDROOT_PACKAGES+=(ncurses-base ncurses-bin libncurses-dev gfortran cpio) # gfortran is only needed for compiling spec benchmarks on buildroot linux
|
||||
VIVADO_PACKAGES+=(libncurses*) # Vivado hangs on the third stage of installation without this
|
||||
fi
|
||||
PACKAGE_MANAGER="dnf -y"
|
||||
UPDATE_COMMAND="$PACKAGE_MANAGER update"
|
||||
GENERAL_PACKAGES+=(which "$PYTHON_VERSION" "$PYTHON_VERSION"-pip pkgconf-pkg-config gcc-c++ ssmtp)
|
||||
GNU_PACKAGES+=(libmpc-devel mpfr-devel gmp-devel zlib-devel expat-devel libslirp-devel ninja-build)
|
||||
QEMU_PACKAGES+=(glib2-devel libfdt-devel pixman-devel)
|
||||
SPIKE_PACKAGES+=(dtc boost-regex boost-system)
|
||||
VERILATOR_PACKAGES+=(gperftools mold)
|
||||
BUILDROOT_PACKAGES+=(ncurses ncurses-base ncurses-libs ncurses-devel gcc-gfortran) # gcc-gfortran is only needed for compiling spec benchmarks on buildroot linux
|
||||
# Extra packages not availale in rhel8, nice for Verilator
|
||||
if (( RHEL_VERSION >= 9 )); then
|
||||
VERILATOR_PACKAGES+=(perl-doc)
|
||||
fi
|
||||
# A newer version of gcc is required for qemu
|
||||
OTHER_PACKAGES+=(gcc-toolset-13)
|
||||
;;
|
||||
ubuntu | debian)
|
||||
if (( UBUNTU_VERSION >= 24 )); then
|
||||
PYTHON_VERSION=python3.12
|
||||
elif (( UBUNTU_VERSION >= 22 )); then
|
||||
PYTHON_VERSION=python3.11
|
||||
elif (( UBUNTU_VERSION >= 20 )); then
|
||||
PYTHON_VERSION=python3.9
|
||||
OTHER_PACKAGES+=(gcc-10 g++-10 cpp-10) # Newer version of gcc needed for Verilator
|
||||
elif (( DEBIAN_VERSION >= 12 )); then
|
||||
PYTHON_VERSION=python3.11
|
||||
elif (( DEBIAN_VERSION >= 11 )); then
|
||||
PYTHON_VERSION=python3.9
|
||||
fi
|
||||
# Mold not available in older distros for Verilator, will download binary instead
|
||||
if (( UBUNTU_VERSION != 20 && DEBIAN_VERSION != 11 )); then
|
||||
VERILATOR_PACKAGES+=(mold)
|
||||
fi
|
||||
PACKAGE_MANAGER="DEBIAN_FRONTEND=noninteractive apt-get -y"
|
||||
UPDATE_COMMAND="$PACKAGE_MANAGER update && $PACKAGE_MANAGER upgrade --with-new-pkgs"
|
||||
GENERAL_PACKAGES+=("$PYTHON_VERSION" python3-pip "$PYTHON_VERSION"-venv pkg-config g++ ssmtp)
|
||||
GNU_PACKAGES+=(autotools-dev libmpc-dev libmpfr-dev libgmp-dev build-essential ninja-build zlib1g-dev libexpat1-dev libglib2.0-dev libslirp-dev)
|
||||
QEMU_PACKAGES+=(libfdt-dev libpixman-1-dev)
|
||||
SPIKE_PACKAGES+=(device-tree-compiler libboost-regex-dev libboost-system-dev)
|
||||
VERILATOR_PACKAGES+=(libunwind-dev libgoogle-perftools-dev perl-doc libfl2 libfl-dev zlib1g)
|
||||
BUILDROOT_PACKAGES+=(ncurses-base ncurses-bin libncurses-dev gfortran) # gfortran is only needed for compiling spec benchmarks on buildroot linux
|
||||
VIVADO_PACKAGES+=(libncurses*) # Vivado hangs on the third stage of installation without this
|
||||
;;
|
||||
suse)
|
||||
PYTHON_VERSION=python3.12
|
||||
PYTHON_VERSION_PACKAGE=python312
|
||||
PACKAGE_MANAGER="zypper -n"
|
||||
UPDATE_COMMAND="$PACKAGE_MANAGER update"
|
||||
GENERAL_PACKAGES+=("$PYTHON_VERSION_PACKAGE" "$PYTHON_VERSION_PACKAGE"-pip pkg-config)
|
||||
GNU_PACKAGES+=(mpc-devel mpfr-devel gmp-devel zlib-devel libexpat-devel libslirp-devel ninja)
|
||||
QEMU_PACKAGES+=(glib2-devel libpixman-1-0-devel) # maybe also need qemu itself?
|
||||
SPIKE_PACKAGES+=(dtc libboost_regex1_75_0-devel libboost_system1_75_0-devel)
|
||||
VERILATOR_PACKAGES+=(gperftools perl-doc)
|
||||
BUILDROOT_PACKAGES+=(ncurses-utils ncurses-devel ncurses5-devel gcc-fortran) # gcc-fortran is only needed for compiling spec benchmarks on buildroot linux
|
||||
OTHER_PACKAGES+=(gcc13 gcc13-c++ cpp13) # Newer version of gcc needed for many tools. Default is gcc7
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
# Check if required packages are installed or install/update them depending on passed flag.
|
||||
if [ "${1}" == "--check" ]; then
|
||||
section_header "Checking Dependencies from Package Manager"
|
||||
if [ "$FAMILY" == rhel ]; then
|
||||
if [[ "$FAMILY" == rhel || "$FAMILY" == suse ]]; then
|
||||
for pack in "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}"; do
|
||||
rpm -q "$pack" > /dev/null || (echo -e "${FAIL_COLOR}Missing packages detected (${WARNING_COLOR}$pack${FAIL_COLOR}). Run as root to auto-install or run wally-package-install.sh first.${ENDC}" && exit 1)
|
||||
done
|
||||
elif [ "$FAMILY" == ubuntu ]; then
|
||||
elif [[ "$FAMILY" == ubuntu || "$FAMILY" == debian ]]; then
|
||||
for pack in "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}"; do
|
||||
dpkg -l "$pack" | grep "ii" > /dev/null || (echo -e "${FAIL_COLOR}Missing packages detected (${WARNING_COLOR}$pack${FAIL_COLOR}). Run as root to auto-install or run wally-package-install.sh first." && exit 1)
|
||||
done
|
||||
@ -104,32 +132,32 @@ else
|
||||
section_header "Installing/Updating Dependencies from Package Manager"
|
||||
# Enable extra repos necessary for rhel
|
||||
if [ "$FAMILY" == rhel ]; then
|
||||
sudo dnf install -y dnf-plugins-core
|
||||
sudo dnf group install -y "Development Tools"
|
||||
dnf install -y dnf-plugins-core
|
||||
dnf group install -y "Development Tools"
|
||||
if [ "$ID" == rhel ]; then
|
||||
sudo subscription-manager repos --enable "codeready-builder-for-rhel-$RHEL_VERSION-$(arch)-rpms"
|
||||
sudo dnf install -y "https://dl.fedoraproject.org/pub/epel/epel-release-latest-$RHEL_VERSION.noarch.rpm"
|
||||
subscription-manager repos --enable "codeready-builder-for-rhel-$RHEL_VERSION-$(arch)-rpms"
|
||||
dnf install -y "https://dl.fedoraproject.org/pub/epel/epel-release-latest-$RHEL_VERSION.noarch.rpm"
|
||||
else # RHEL clone
|
||||
if (( RHEL_VERSION == 8 )); then
|
||||
sudo dnf config-manager -y --set-enabled powertools
|
||||
dnf config-manager -y --set-enabled powertools
|
||||
else # Version 9
|
||||
sudo dnf config-manager -y --set-enabled crb
|
||||
dnf config-manager -y --set-enabled crb
|
||||
fi
|
||||
sudo dnf install -y epel-release
|
||||
dnf install -y epel-release
|
||||
fi
|
||||
fi
|
||||
|
||||
# Update and Upgrade tools
|
||||
eval "$UPDATE_COMMAND"
|
||||
# Install packages listed above using appropriate package manager
|
||||
sudo $PACKAGE_MANAGER install -y "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}" "${VIVADO_PACKAGES[@]}"
|
||||
eval $PACKAGE_MANAGER install "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}" "${VIVADO_PACKAGES[@]}"
|
||||
|
||||
# Post install steps
|
||||
# Vivado looks for ncurses5 libraries, but Ubuntu 24.04 only has ncurses6
|
||||
# Create symbolic links to the ncurses6 libraries to fool Vivado
|
||||
if (( UBUNTU_VERSION >= 24 )); then
|
||||
sudo ln -vsf /lib/x86_64-linux-gnu/libncurses.so.6 /lib/x86_64-linux-gnu/libncurses.so.5
|
||||
sudo ln -vsf /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libntinfo.so.5
|
||||
ln -vsf /lib/x86_64-linux-gnu/libncurses.so.6 /lib/x86_64-linux-gnu/libncurses.so.5
|
||||
ln -vsf /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libntinfo.so.5
|
||||
fi
|
||||
|
||||
echo -e "${SUCCESS_COLOR}Packages successfully installed.${ENDC}"
|
||||
|
@ -118,7 +118,7 @@ if [ "$1" == "--clean" ] || [ "$2" == "--clean" ]; then
|
||||
shift
|
||||
fi
|
||||
|
||||
# Check for clean flag
|
||||
# Check for no-buildroot flag
|
||||
if [ "$1" == "--no-buildroot" ] || [ "$2" == "--no-buildroot" ]; then
|
||||
no_buidroot=true
|
||||
shift
|
||||
@ -191,6 +191,12 @@ fi
|
||||
# Enable newer version of gcc for older distros (required for QEMU/Verilator)
|
||||
if [ "$FAMILY" == rhel ]; then
|
||||
source /opt/rh/gcc-toolset-13/enable
|
||||
elif [ "$FAMILY" == suse ]; then
|
||||
mkdir -p "$RISCV"/gcc-13/bin
|
||||
for f in gcc cpp g++ gcc-ar gcc-nm gcc-ranlib gcov gcov-dump gcov-tool lto-dump; do
|
||||
ln -vsf /usr/bin/$f-13 "$RISCV"/gcc-13/bin/$f
|
||||
done
|
||||
export PATH="$RISCV"/gcc-13/bin:$PATH
|
||||
elif (( UBUNTU_VERSION == 20 )); then
|
||||
mkdir -p "$RISCV"/gcc-10/bin
|
||||
for f in gcc cpp g++ gcc-ar gcc-nm gcc-ranlib gcov gcov-dump gcov-tool lto-dump; do
|
||||
@ -263,17 +269,30 @@ if (( RHEL_VERSION == 8 )); then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Mold needed for Verilator
|
||||
if (( UBUNTU_VERSION == 20 || DEBIAN_VERSION == 11 )) || [ "$FAMILY" == suse ]; then
|
||||
STATUS="mold"
|
||||
if [ ! -e "$RISCV"/bin/mold ]; then
|
||||
section_header "Installing mold"
|
||||
cd "$RISCV"
|
||||
wget -nv --retry-connrefused $retry_on_host_error --output-document=mold.tar.gz https://github.com/rui314/mold/releases/download/v2.34.1/mold-2.34.1-x86_64-linux.tar.gz
|
||||
tar xz --directory="$RISCV" --strip-components=1 -f mold.tar.gz
|
||||
rm -f mold.tar.gz
|
||||
echo -e "${SUCCESS_COLOR}Mold successfully installed/updated!${ENDC}"
|
||||
else
|
||||
echo -e "${SUCCESS_COLOR}Mold already installed.${ENDC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# RISC-V GNU Toolchain (https://github.com/riscv-collab/riscv-gnu-toolchain)
|
||||
# The RISC-V GNU Toolchain includes the GNU Compiler Collection (gcc), GNU Binutils, Newlib,
|
||||
# and the GNU Debugger Project (gdb). It is a collection of tools used to compile RISC-V programs.
|
||||
# To install GCC from source can take hours to compile.
|
||||
# This configuration enables multilib to target many flavors of RISC-V.
|
||||
# This book is tested with GCC 13.2.0
|
||||
# This book is tested with GCC 13.2.0 and 14.2.0.
|
||||
section_header "Installing/Updating RISC-V GNU Toolchain"
|
||||
STATUS="riscv-gnu-toolchain"
|
||||
cd "$RISCV"
|
||||
# Temporarily pin riscv-gnu-toolchain to use GCC 13.2.0. GCC 14 does not work with the Q extension.
|
||||
if git_check "riscv-gnu-toolchain" "https://github.com/riscv/riscv-gnu-toolchain" "$RISCV/riscv-gnu-toolchain/stamps/build-gcc-newlib-stage2"; then
|
||||
cd "$RISCV"/riscv-gnu-toolchain
|
||||
git reset --hard && git clean -f && git checkout master && git pull && git submodule update
|
||||
|
@ -1,21 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Variables
|
||||
PYTHON_SCRIPT=$HOME/nightly-runs/cvw/bin/ # cvw can be anywhere you would like it. Make sure to point your variable there
|
||||
SETUP_SCRIPT=$HOME/nightly-runs/cvw/ # cvw can be anywhere you would like it. Make sure to point your variable there
|
||||
|
||||
echo "Current directory"
|
||||
pwd
|
||||
|
||||
cd $SETUP_SCRIPT
|
||||
echo "Current directory"
|
||||
pwd
|
||||
|
||||
echo "Sourcing setup_host"
|
||||
source ./setup.sh
|
||||
|
||||
cd $PYTHON_SCRIPT
|
||||
pwd
|
||||
echo "Running python file"
|
||||
$RISCV/riscv-python/bin/python nightly_build.py
|
||||
echo "Finished"
|
311
bin/wsim
311
bin/wsim
@ -13,170 +13,177 @@
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
########################
|
||||
# main wsim script
|
||||
########################
|
||||
|
||||
# Parse arguments
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("config", help="Configuration file")
|
||||
parser.add_argument("testsuite", help="Test suite or path to .elf file")
|
||||
parser.add_argument("--elf", "-e", help="ELF File name; use if name does not end in .elf", default="")
|
||||
parser.add_argument("--sim", "-s", help="Simulator", choices=["questa", "verilator", "vcs"], default="questa")
|
||||
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
|
||||
parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true")
|
||||
parser.add_argument("--ccov", "-c", help="Code Coverage", action="store_true")
|
||||
parser.add_argument("--fcov", "-f", help="Functional Coverage with cvw-arch-verif, implies lockstep", action="store_true")
|
||||
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
|
||||
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
|
||||
parser.add_argument("--vcd", "-v", help="Generate testbench.vcd", action="store_true")
|
||||
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
|
||||
parser.add_argument("--locksteplog", "-b", help="Retired instruction number to be begin logging.", default=0)
|
||||
parser.add_argument("--lockstepverbose", "-lv", help="Run ImperasDV lock, step, and compare with tracing enabled", action="store_true")
|
||||
parser.add_argument("--covlog", "-d", help="Log coverage after n instructions.", default=0)
|
||||
parser.add_argument("--rvvi", "-r", help="Simulate rvvi hardware interface and ethernet.", action="store_true")
|
||||
args = parser.parse_args()
|
||||
print("Config=" + args.config + " tests=" + args.testsuite + " sim=" + args.sim + " gui=" + str(args.gui) + " args='" + args.args + "'")
|
||||
ElfFile=""
|
||||
# Global variable
|
||||
WALLY = os.environ.get('WALLY')
|
||||
|
||||
if(os.path.isfile(args.elf)):
|
||||
ElfFile = "+ElfFile=" + os.path.abspath(args.elf)
|
||||
elif (args.elf != ""):
|
||||
print("ELF file not found: " + args.elf)
|
||||
exit(1)
|
||||
def parseArgs():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("config", help="Configuration file")
|
||||
parser.add_argument("testsuite", nargs="?", help="Test suite or path to .elf file")
|
||||
parser.add_argument("--elf", "-e", help="ELF File name; use if name does not end in .elf", default="")
|
||||
parser.add_argument("--sim", "-s", help="Simulator", choices=["questa", "verilator", "vcs"], default="questa")
|
||||
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
|
||||
parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true")
|
||||
parser.add_argument("--ccov", "-c", help="Code Coverage", action="store_true")
|
||||
parser.add_argument("--fcov", "-f", help="Functional Coverage with cvw-arch-verif, implies lockstep", action="store_true")
|
||||
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
|
||||
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
|
||||
parser.add_argument("--define", "-d", help="Optional define macros passed to simulator", default="")
|
||||
parser.add_argument("--vcd", "-v", help="Generate testbench.vcd", action="store_true")
|
||||
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
|
||||
parser.add_argument("--lockstepverbose", "-lv", help="Run ImperasDV lock, step, and compare with tracing enabled", action="store_true")
|
||||
parser.add_argument("--rvvi", "-r", help="Simulate rvvi hardware interface and ethernet.", action="store_true")
|
||||
return parser.parse_args()
|
||||
|
||||
if(args.testsuite.endswith('.elf') and args.elf == ""): # No --elf argument; check if testsuite has a .elf extension and use that instead
|
||||
if (os.path.isfile(args.testsuite)):
|
||||
ElfFile = "+ElfFile=" + os.path.abspath(args.testsuite)
|
||||
# extract the elf name from the path to be the test suite
|
||||
fields = args.testsuite.rsplit('/', 3)
|
||||
# if the name is just ref.elf in a deep path (riscv-arch-test/wally-riscv-arch-test), then use the directory name as the test suite to make it unique; otherwise work directory will have duplicates.
|
||||
if (len(fields) > 3):
|
||||
if (fields[2] == "ref"):
|
||||
args.testsuite = fields[1] + "_" + fields[3]
|
||||
else:
|
||||
args.testsuite = fields[2] + "_" + fields[3]
|
||||
elif ('/' in args.testsuite):
|
||||
args.testsuite=args.testsuite.rsplit('/', 1)[1] # strip off path if present
|
||||
else:
|
||||
print("ELF file not found: " + args.testsuite)
|
||||
exit(1)
|
||||
|
||||
if(args.lockstep and not args.testsuite.endswith('.elf') and not args.testsuite == "buildroot"):
|
||||
print(f"Invalid Options. Cannot run a testsuite, {args.testsuite} with lockstep. Must run a single elf.")
|
||||
exit(1)
|
||||
|
||||
# Validate arguments
|
||||
if (args.gui or args.ccov or args.fcov or args.lockstep or args.lockstepverbose):
|
||||
if args.sim not in ["questa", "vcs"]:
|
||||
def validateArgs(args):
|
||||
if not args.testsuite and not args.elf:
|
||||
print("Error: Missing test suite or ELF file")
|
||||
sys.exit(1)
|
||||
if any([args.lockstep, args.lockstepverbose, args.fcov]) and not (args.testsuite.endswith('.elf') or args.elf) and args.testsuite != "buildroot":
|
||||
print(f"Invalid Options. Cannot run a testsuite, {args.testsuite} with lockstep or fcov. Must run a single elf or buildroot.")
|
||||
sys.exit(1)
|
||||
elif any([args.gui, args.ccov, args.fcov, args.lockstep, args.lockstepverbose]) and args.sim not in ["questa", "vcs"]:
|
||||
print("Option only supported for Questa and VCS")
|
||||
exit(1)
|
||||
sys.exit(1)
|
||||
elif (args.tb == "testbench_fp" and args.sim != "questa"):
|
||||
print("Error: testbench_fp presently only supported by Questa, not VCS or Verilator, because of a touchy testbench")
|
||||
sys.exit(1)
|
||||
elif (args.config == "breker" and args.sim != "questa"):
|
||||
print("Error: Breker tests currently only supported by Questa")
|
||||
sys.exit(1)
|
||||
|
||||
if (args.vcd):
|
||||
args.args += " -DMAKEVCD=1"
|
||||
def elfFileCheck(args):
|
||||
ElfFile = ""
|
||||
if os.path.isfile(args.elf):
|
||||
ElfFile = os.path.abspath(args.elf)
|
||||
elif args.elf:
|
||||
print(f"ELF file not found: {args.elf}")
|
||||
sys.exit(1)
|
||||
elif args.testsuite.endswith('.elf'): # No --elf argument; check if testsuite has a .elf extension and use that instead
|
||||
if os.path.isfile(args.testsuite):
|
||||
ElfFile = os.path.abspath(args.testsuite)
|
||||
# extract the elf name from the path to be the test suite
|
||||
fields = args.testsuite.rsplit('/', 3)
|
||||
# if the name is just ref.elf in a deep path (riscv-arch-test/wally-riscv-arch-test), then use the directory name as the test suite to make it unique; otherwise work directory will have duplicates.
|
||||
if "breker" in args.testsuite:
|
||||
args.testsuite = fields[-1]
|
||||
elif len(fields) > 3:
|
||||
if fields[2] == "ref":
|
||||
args.testsuite = f"{fields[1]}_{fields[3]}"
|
||||
else:
|
||||
args.testsuite = f"{fields[2]}_{fields[3]}"
|
||||
elif '/' in args.testsuite:
|
||||
args.testsuite=args.testsuite.rsplit('/', 1)[1] # strip off path if present
|
||||
else:
|
||||
print(f"ELF file not found: {args.testsuite}")
|
||||
sys.exit(1)
|
||||
return ElfFile
|
||||
|
||||
if (args.rvvi):
|
||||
args.params += " RVVI_SYNTH_SUPPORTED=1 "
|
||||
def prepSim(args, ElfFile):
|
||||
prefix = ""
|
||||
paramsList = []
|
||||
argsList = []
|
||||
flagsList = []
|
||||
defineList = []
|
||||
if args.vcd:
|
||||
paramsList.append("MAKE_VCD=1")
|
||||
if args.rvvi:
|
||||
paramsList.append("RVVI_SYNTH_SUPPORTED=1")
|
||||
if args.tb == "testbench_fp":
|
||||
paramsList.append(f'TEST="{args.testsuite}"')
|
||||
if ElfFile:
|
||||
argsList.append(f"+ElfFile={ElfFile}")
|
||||
if args.gui and args.tb == "testbench":
|
||||
paramsList.append("DEBUG=1")
|
||||
if args.ccov:
|
||||
flagsList.append("--ccov")
|
||||
if args.fcov:
|
||||
flagsList.append("--fcov")
|
||||
defineList.extend(["+define+INCLUDE_TRACE2COV", "+define+IDV_INCLUDE_TRACE2COV", "+define+COVER_BASE_RV32I"]) # COVER_BASE_RV32I is just needed to keep riscvISACOV happy, but does not affect tests
|
||||
argsList.extend(["+TRACE2COV_ENABLE=1", "+IDV_TRACE2COV=1"])
|
||||
if args.gui:
|
||||
flagsList.append("--gui")
|
||||
if args.lockstep or args.lockstepverbose:
|
||||
flagsList.append("--lockstep")
|
||||
if args.lockstep or args.lockstepverbose or args.fcov:
|
||||
prefix = lockstepSetup(args)
|
||||
defineList.append("+define+USE_IMPERAS_DV")
|
||||
if args.config == "breker": # Requires a license for the breker tool. See tests/breker/README.md for details
|
||||
ElfFileNoExtension = os.path.splitext(ElfFile)[0]
|
||||
flagsList.append("--breker")
|
||||
defineList.append("+define+USE_TREK_DV")
|
||||
argsList.append(f"+TREK_TBX_FILE={ElfFileNoExtension}.tbx")
|
||||
# Combine into a single string
|
||||
args.args += " ".join(argsList)
|
||||
args.params += " ".join(paramsList)
|
||||
args.define += " ".join(defineList)
|
||||
flags = " ".join(flagsList)
|
||||
return flags, prefix
|
||||
|
||||
if (args.tb == "testbench_fp"):
|
||||
args.params += " TEST=\"" + args.testsuite + "\" "
|
||||
def lockstepSetup(args):
|
||||
imperasicVerbosePath = os.path.join(WALLY, "sim", "imperas-verbose.ic")
|
||||
imperasicPath = os.path.join(WALLY, "config", args.config, "imperas.ic")
|
||||
if not os.path.isfile(imperasicPath): # If config is a derivative, look for imperas.ic in derivative configs
|
||||
imperasicPath = os.path.join(WALLY, "config", "deriv", args.config, "imperas.ic")
|
||||
if not os.path.isfile(imperasicPath):
|
||||
print("Error: imperas.ic not found")
|
||||
sys.exit(1)
|
||||
prefix = f"IMPERAS_TOOLS={imperasicPath}{f':{imperasicVerbosePath}' if args.lockstepverbose else ''}"
|
||||
return prefix
|
||||
|
||||
# if lockstep is enabled, then we need to pass the Imperas lockstep arguments
|
||||
if(int(args.locksteplog) >= 1): EnableLog = 1
|
||||
else: EnableLog = 0
|
||||
prefix = ""
|
||||
if (args.lockstep or args.lockstepverbose or args.fcov):
|
||||
if (args.sim == "questa" or args.sim == "vcs"):
|
||||
imperasicPath = os.path.join(WALLY, "config", args.config, "imperas.ic")
|
||||
if not os.path.isfile(imperasicPath): # If config is a derivative, look for imperas.ic in derivative configs
|
||||
imperasicPath = os.path.join(WALLY, "config", "deriv", args.config, "imperas.ic")
|
||||
prefix = "IMPERAS_TOOLS=" + imperasicPath
|
||||
# Force Questa to use 64-bit mode, sometimes it defaults to 32-bit even on 64-bit machines
|
||||
if (args.sim == "questa"):
|
||||
def createDirs(sim):
|
||||
for d in ["logs", "wkdir", "cov", "ucdb", "fcov", "fcov_ucdb"]:
|
||||
os.makedirs(os.path.join(WALLY, "sim", sim, d), exist_ok=True)
|
||||
|
||||
def runSim(args, flags, prefix):
|
||||
if args.sim == "questa":
|
||||
runQuesta(args, flags, prefix)
|
||||
elif args.sim == "verilator":
|
||||
runVerilator(args)
|
||||
elif args.sim == "vcs":
|
||||
runVCS(args, flags, prefix)
|
||||
|
||||
def runQuesta(args, flags, prefix):
|
||||
# Force Questa to use 64-bit mode, sometimes it defaults to 32-bit even on 64-bit machines
|
||||
prefix = "MTI_VCO_MODE=64 " + prefix
|
||||
|
||||
if (args.lockstep or args.lockstepverbose):
|
||||
if(args.locksteplog != 0): ImperasPlusArgs = " +IDV_TRACE2LOG=" + str(EnableLog) + " +IDV_TRACE2LOG_AFTER=" + str(args.locksteplog)
|
||||
else: ImperasPlusArgs = ""
|
||||
if(args.fcov):
|
||||
CovEnableStr = "1" if int(args.covlog) > 0 else "0";
|
||||
if(args.covlog >= 1): EnableLog = 1
|
||||
else: EnableLog = 0
|
||||
ImperasPlusArgs = " +IDV_TRACE2COV=" + str(EnableLog) + " +TRACE2LOG_AFTER=" + str(args.covlog) + " +TRACE2COV_ENABLE=" + CovEnableStr;
|
||||
suffix = ""
|
||||
else:
|
||||
CovEnableStr = ""
|
||||
suffix = "--lockstep"
|
||||
if(args.lockstepverbose):
|
||||
prefix += ":" + WALLY + "/sim/imperas-verbose.ic"
|
||||
else:
|
||||
ImperasPlusArgs = ""
|
||||
suffix = ""
|
||||
flags = suffix
|
||||
args.args += ImperasPlusArgs
|
||||
|
||||
|
||||
# other flags
|
||||
if (args.ccov):
|
||||
flags += " --ccov"
|
||||
if (args.fcov):
|
||||
flags += " --fcov"
|
||||
|
||||
# create the output sub-directories.
|
||||
regressionDir = WALLY + '/sim/'
|
||||
for d in ["logs", "wkdir", "cov", "ucdb", "fcov", "fcov_ucdb"]:
|
||||
try:
|
||||
os.mkdir(regressionDir+args.sim+"/"+d)
|
||||
except:
|
||||
pass
|
||||
|
||||
cd = "cd $WALLY/sim/" +args.sim
|
||||
|
||||
# check for unsupported sims
|
||||
if (args.tb == "testbench_fp" and args.sim != "questa"):
|
||||
print("Error: testbench_fp presently only supported by Questa, not VCS or Verilator, because of a touchy testbench")
|
||||
exit(1)
|
||||
|
||||
# per-simulator launch
|
||||
if (args.sim == "questa"):
|
||||
if (args.gui) and (args.tb == "testbench"):
|
||||
args.params += "DEBUG=1"
|
||||
if (ElfFile != ""):
|
||||
args.args += " " + ElfFile
|
||||
if (args.args != ""):
|
||||
args.args = " --args \\\"" + args.args + "\\\""
|
||||
if (args.params != ""):
|
||||
args.params = " --params \\\"" + args.params + "\\\""
|
||||
if args.args:
|
||||
args.args = fr'--args \"{args.args}\"'
|
||||
if args.params:
|
||||
args.params = fr'--params \"{args.params}\"'
|
||||
if args.define:
|
||||
args.define = fr'--define \"{args.define}\"'
|
||||
# Questa cannot accept more than 9 arguments. fcov implies lockstep
|
||||
cmd = "do wally.do " + args.config + " " + args.testsuite + " " + args.tb + " " + args.args + " " + args.params + " " + flags
|
||||
if (args.gui): # launch Questa with GUI; add +acc to keep variables accessible
|
||||
cmd = cd + "; " + prefix + " vsim -do \"" + cmd + " +acc\""
|
||||
else: # launch Questa in batch mode
|
||||
cmd = cd + "; " + prefix + " vsim -c -do \"" + cmd + "\""
|
||||
print("Running Questa with command: " + cmd)
|
||||
cmd = f"do wally.do {args.config} {args.testsuite} {args.tb} {args.args} {args.params} {args.define} {flags}"
|
||||
cmd = f'cd $WALLY/sim/questa; {prefix} vsim {"-c" if not args.gui else ""} -do "{cmd}"'
|
||||
print(f"Running Questa with command: {cmd}")
|
||||
os.system(cmd)
|
||||
elif (args.sim == "verilator"):
|
||||
# PWD=${WALLY}/sim CONFIG=rv64gc TESTSUITE=arch64i
|
||||
|
||||
def runVerilator(args):
|
||||
print(f"Running Verilator on {args.config} {args.testsuite}")
|
||||
os.system(f"/usr/bin/make -C {regressionDir}/verilator WALLYCONF={args.config} TEST={args.testsuite} TESTBENCH={args.tb} PLUS_ARGS=\"{args.args}\" PARAM_ARGS=\"{args.params}\"")
|
||||
elif (args.sim == "vcs"):
|
||||
print("wsim params: " + args.params)
|
||||
print(f"Running VCS on " + args.config + " " + args.testsuite)
|
||||
# if (args.gui):
|
||||
# flags += " --gui"
|
||||
if (args.args == ""):
|
||||
vcsargs = ""
|
||||
else:
|
||||
vcsargs = " --args \"" + args.args + "\" "
|
||||
if (args.params == ""):
|
||||
vcsparams = ""
|
||||
else:
|
||||
vcsparams = " --params \"" + args.params + "\" "
|
||||
print("VCS params: " + vcsparams)
|
||||
if (ElfFile != ""):
|
||||
ElfFile = " --elffile " + ElfFile
|
||||
cmd = cd + "; " + prefix + " ./run_vcs " + args.config + " " + args.testsuite + " " + " --tb " + args.tb + " " + vcsargs + vcsparams + ElfFile + " " + flags
|
||||
os.system(f'make -C {WALLY}/sim/verilator WALLYCONF={args.config} TEST={args.testsuite} TESTBENCH={args.tb} PLUS_ARGS="{args.args}" PARAM_ARGS="{args.params}" DEFINE_ARGS="{args.define}"')
|
||||
|
||||
def runVCS(args, flags, prefix):
|
||||
print(f"Running VCS on {args.config} {args.testsuite}")
|
||||
if args.args:
|
||||
args.args = f'--args "{args.args}"'
|
||||
if args.params:
|
||||
args.params = f'--params "{args.params}"'
|
||||
if args.define:
|
||||
args.define = f'--define "{args.define}"'
|
||||
cmd = f"cd $WALLY/sim/vcs; {prefix} ./run_vcs {args.config} {args.testsuite} --tb {args.tb} {args.args} {args.params} {args.define} {flags}"
|
||||
print(cmd)
|
||||
os.system(cmd)
|
||||
|
||||
def main(args):
|
||||
validateArgs(args)
|
||||
print(f"Config={args.config} tests={args.testsuite} sim={args.sim} gui={args.gui} args='{args.args}' params='{args.params}' define='{args.define}'")
|
||||
ElfFile = elfFileCheck(args)
|
||||
flags, prefix = prepSim(args, ElfFile)
|
||||
createDirs(args.sim)
|
||||
sys.exit(runSim(args, flags, prefix))
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = parseArgs()
|
||||
main(args)
|
||||
|
@ -1432,5 +1432,8 @@ UART_SUPPORTED 0
|
||||
PLIC_SUPPORTED 0
|
||||
SPI_SUPPORTED 0
|
||||
|
||||
|
||||
|
||||
# Breker tests require a different memory configuration
|
||||
# See tests/breker/README.md for details on the testsuite
|
||||
derive breker rv64gc
|
||||
EXT_MEM_SUPPORTED 1
|
||||
EXT_MEM_BASE 64'h90000000
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd32;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 0;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 1;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 1;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 0;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd32;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 0;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 1;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 1;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 1;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -13,27 +13,39 @@
|
||||
`define CLINT_BASE 64'h02000000
|
||||
|
||||
// Unprivileged extensions
|
||||
`include "RV32I_coverage.svh"
|
||||
`include "RV32M_coverage.svh"
|
||||
`include "RV32F_coverage.svh"
|
||||
`include "RV32D_coverage.svh"
|
||||
`include "RV32Zba_coverage.svh"
|
||||
`include "RV32Zbb_coverage.svh"
|
||||
`include "RV32Zbc_coverage.svh"
|
||||
`include "RV32Zbs_coverage.svh"
|
||||
`include "RV32ZfaF_coverage.svh"
|
||||
`include "RV32ZfaD_coverage.svh"
|
||||
`include "RV32ZfaZfh_coverage.svh"
|
||||
`include "RV32ZfhD_coverage.svh"
|
||||
`include "RV32Zfh_coverage.svh"
|
||||
`include "RV32Zicond_coverage.svh"
|
||||
`include "RV32Zca_coverage.svh"
|
||||
`include "RV32Zcb_coverage.svh"
|
||||
`include "RV32ZcbM_coverage.svh"
|
||||
`include "RV32ZcbZbb_coverage.svh"
|
||||
`include "RV32Zcf_coverage.svh"
|
||||
`include "RV32Zcd_coverage.svh"
|
||||
`include "RV32Zicsr_coverage.svh"
|
||||
`include "I_coverage.svh"
|
||||
`include "M_coverage.svh"
|
||||
`include "F_coverage.svh"
|
||||
`include "D_coverage.svh"
|
||||
`include "Zba_coverage.svh"
|
||||
`include "Zbb_coverage.svh"
|
||||
`include "Zbc_coverage.svh"
|
||||
`include "Zbs_coverage.svh"
|
||||
`include "ZfaF_coverage.svh"
|
||||
`include "ZfaD_coverage.svh"
|
||||
`include "ZfaZfh_coverage.svh"
|
||||
`include "Zfh_coverage.svh"
|
||||
`include "ZfhD_coverage.svh"
|
||||
// Note: Zfhmin is a subset of Zfh, so usually only one or the other would be used. When Zfhmin and D are supported, ZfhD should also be enabled
|
||||
`include "Zfhmin_coverage.svh"
|
||||
// Note: Zmmul is a subset of M, so usually only one or the other would be used.
|
||||
`include "Zmmul_coverage.svh"
|
||||
`include "Zicond_coverage.svh"
|
||||
`include "Zca_coverage.svh"
|
||||
`include "Zcb_coverage.svh"
|
||||
`include "ZcbM_coverage.svh"
|
||||
`include "ZcbZbb_coverage.svh"
|
||||
`include "Zcf_coverage.svh"
|
||||
`include "Zcd_coverage.svh"
|
||||
`include "Zicsr_coverage.svh"
|
||||
`include "Zbkb_coverage.svh"
|
||||
`include "Zbkc_coverage.svh"
|
||||
`include "Zbkx_coverage.svh"
|
||||
`include "Zknd_coverage.svh"
|
||||
`include "Zkne_coverage.svh"
|
||||
`include "Zknh_coverage.svh"
|
||||
`include "Zaamo_coverage.svh"
|
||||
`include "Zalrsc_coverage.svh"
|
||||
|
||||
// Privileged extensions
|
||||
`include "ZicsrM_coverage.svh"
|
||||
@ -45,4 +57,4 @@
|
||||
`include "EndianM_coverage.svh"
|
||||
`include "EndianS_coverage.svh"
|
||||
`include "ExceptionsM_coverage.svh"
|
||||
`include "ZicntrU_coverage.svh"
|
||||
`include "ExceptionsZc_coverage.svh"
|
||||
|
@ -9,8 +9,8 @@
|
||||
#--showcommands
|
||||
|
||||
# Core settings
|
||||
--variant RV32GC # for RV32GC
|
||||
--override cpu/priv_version=1.12
|
||||
--variant RV32GCK # for RV32GC
|
||||
--override cpu/priv_version=1.12
|
||||
--override cpu/user_version=20191213
|
||||
# arch
|
||||
--override cpu/mimpid=0x100
|
||||
@ -20,7 +20,7 @@
|
||||
--override refRoot/cpu/envcfg_mask=1 # dh 1/26/24 this should be deleted when ImperasDV is updated to allow envcfg.FIOM to be written
|
||||
|
||||
# bit manipulation
|
||||
--override cpu/add_Extensions=B
|
||||
--override cpu/add_Extensions=B
|
||||
--override cpu/bitmanip_version=1.0.0
|
||||
--override cpu/misa_B_Zba_Zbb_Zbs=T
|
||||
|
||||
@ -59,7 +59,7 @@
|
||||
#--override cpu/instret_undefined=T
|
||||
#--override cpu/hpmcounter_undefined=T
|
||||
|
||||
## context registers not implemented
|
||||
# context registers not implemented
|
||||
#--override cpu/scontext_undefined=True
|
||||
#--override cpu/mcontext_undefined=True
|
||||
|
||||
@ -69,9 +69,14 @@
|
||||
#--override cpu/Zicfilp=F
|
||||
--override cpu/trigger_num=0 # disable CSRs 7a0-7a8
|
||||
|
||||
--override no_pseudo_inst=T # For code coverage, don't produce pseudoinstructions
|
||||
# For code coverage, don't produce pseudoinstructions
|
||||
--override no_pseudo_inst=T
|
||||
|
||||
--override show_c_prefix=T # Show "c." with compressed instructions
|
||||
# Show "c." with compressed instructions
|
||||
--override show_c_prefix=T
|
||||
|
||||
# nonratified mnoise register not implemented
|
||||
--override cpu/mnoise_undefined=T
|
||||
|
||||
# mcause and scause only have 4 lsbs of code and 1 msb of interrupt flag
|
||||
#--override cpu/ecode_mask=0x8000000F # for RV32
|
||||
@ -80,7 +85,12 @@
|
||||
# Debug mode not yet supported
|
||||
--override cpu/debug_mode=none
|
||||
|
||||
# Zkr entropy source and seed register not supported.
|
||||
--override cpu/Zkr=F
|
||||
|
||||
# ShangMi Crypto not supported
|
||||
--override cpu/Zksed=F
|
||||
--override cpu/Zksh=F
|
||||
|
||||
--override cpu/reset_address=0x80000000
|
||||
|
||||
@ -101,7 +111,7 @@
|
||||
# mstatus.FS is set dirty on any write to a FPR, or when a fp operation signals an exception
|
||||
--override cpu/mstatus_fs_mode=write_1
|
||||
|
||||
# PMA Settings
|
||||
# PMA Settings
|
||||
# 'r': read access allowed
|
||||
# 'w': write access allowed
|
||||
# 'x': execute access allowed
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd32;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 1;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 0;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 0;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 0;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd32;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 1;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 0;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 0;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 1;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd64;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 0;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 1;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 1;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 1;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -13,27 +13,39 @@
|
||||
`define CLINT_BASE 64'h02000000
|
||||
|
||||
// Unprivileged extensions
|
||||
`include "RV64I_coverage.svh"
|
||||
`include "RV64M_coverage.svh"
|
||||
`include "RV64F_coverage.svh"
|
||||
`include "RV64D_coverage.svh"
|
||||
`include "RV64Zba_coverage.svh"
|
||||
`include "RV64Zbb_coverage.svh"
|
||||
`include "RV64Zbc_coverage.svh"
|
||||
`include "RV64Zbs_coverage.svh"
|
||||
`include "RV64ZfaF_coverage.svh"
|
||||
`include "RV64ZfaD_coverage.svh"
|
||||
`include "RV64ZfaZfh_coverage.svh"
|
||||
`include "RV64ZfhD_coverage.svh"
|
||||
`include "RV64Zfh_coverage.svh"
|
||||
`include "RV64Zicond_coverage.svh"
|
||||
`include "RV64Zca_coverage.svh"
|
||||
`include "RV64Zcb_coverage.svh"
|
||||
`include "RV64ZcbM_coverage.svh"
|
||||
`include "RV64ZcbZbb_coverage.svh"
|
||||
`include "RV64ZcbZba_coverage.svh"
|
||||
`include "RV64Zcd_coverage.svh"
|
||||
`include "RV64Zicsr_coverage.svh"
|
||||
`include "I_coverage.svh"
|
||||
`include "M_coverage.svh"
|
||||
`include "F_coverage.svh"
|
||||
`include "D_coverage.svh"
|
||||
`include "Zba_coverage.svh"
|
||||
`include "Zbb_coverage.svh"
|
||||
`include "Zbc_coverage.svh"
|
||||
`include "Zbs_coverage.svh"
|
||||
`include "ZfaF_coverage.svh"
|
||||
`include "ZfaD_coverage.svh"
|
||||
`include "ZfaZfh_coverage.svh"
|
||||
`include "ZfhD_coverage.svh"
|
||||
`include "Zfh_coverage.svh"
|
||||
// Note: Zfhmin is a subset of Zfh, so usually only one or the other would be used. When Zfhmin and D are supported, ZfhD should also be enabled
|
||||
`include "Zfhmin_coverage.svh"
|
||||
// Note: Zmmul is a subset of M, so usually only one or the other would be used.
|
||||
`include "Zmmul_coverage.svh"
|
||||
`include "Zicond_coverage.svh"
|
||||
`include "Zca_coverage.svh"
|
||||
`include "Zcb_coverage.svh"
|
||||
`include "ZcbM_coverage.svh"
|
||||
`include "ZcbZbb_coverage.svh"
|
||||
`include "ZcbZba_coverage.svh"
|
||||
`include "Zcd_coverage.svh"
|
||||
`include "Zicsr_coverage.svh"
|
||||
`include "Zbkb_coverage.svh"
|
||||
`include "Zbkc_coverage.svh"
|
||||
`include "Zbkx_coverage.svh"
|
||||
`include "Zknd_coverage.svh"
|
||||
`include "Zkne_coverage.svh"
|
||||
`include "Zknh_coverage.svh"
|
||||
`include "Zaamo_coverage.svh"
|
||||
`include "Zalrsc_coverage.svh"
|
||||
|
||||
// Privileged extensions
|
||||
`include "RV64VM_coverage.svh"
|
||||
@ -44,8 +56,7 @@
|
||||
`include "EndianM_coverage.svh"
|
||||
`include "EndianS_coverage.svh"
|
||||
`include "ExceptionsM_coverage.svh"
|
||||
`include "ZicntrU_coverage.svh"
|
||||
`include "ExceptionsZc_coverage.svh"
|
||||
// `include "RV64VM_PMP_coverage.svh"
|
||||
// `include "RV64CBO_VM_coverage.svh"
|
||||
// `include "RV64CBO_PMP_coverage.svh"
|
||||
// `include "RV64Zicbom_coverage.svh"
|
||||
|
@ -9,7 +9,7 @@
|
||||
#--showcommands
|
||||
|
||||
# Core settings
|
||||
--override cpu/priv_version=1.12
|
||||
--override cpu/priv_version=1.12
|
||||
--override cpu/user_version=20191213
|
||||
# arch
|
||||
--override cpu/mimpid=0x100
|
||||
@ -19,7 +19,7 @@
|
||||
--override refRoot/cpu/envcfg_mask=1 # dh 1/26/24 this should be deleted when ImperasDV is updated to allow envcfg.FIOM to be written
|
||||
|
||||
# bit manipulation
|
||||
--override cpu/add_Extensions=B
|
||||
--override cpu/add_Extensions=B
|
||||
--override cpu/bitmanip_version=1.0.0
|
||||
--override cpu/misa_B_Zba_Zbb_Zbs=T
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
|
||||
# 64 KiB continuous huge pages supported
|
||||
--override cpu/Svpbmt=T
|
||||
--override cpu/aligned_uncached_PBMT=T # when PBMT designates a page as uncachable, require aligned accesses
|
||||
--override cpu/Svnapot_page_mask=65536
|
||||
|
||||
# SV39 and SV48 supported
|
||||
@ -68,12 +69,12 @@
|
||||
--override cpu/trigger_num=0 # disable CSRs 7a0-7a8
|
||||
|
||||
# For code coverage, don't produce pseudoinstructions
|
||||
--override no_pseudo_inst=T
|
||||
--override no_pseudo_inst=T
|
||||
|
||||
# Show "c." with compressed instructions
|
||||
# Show "c." with compressed instructions
|
||||
--override show_c_prefix=T
|
||||
|
||||
# nonratified mnosie register not implemented
|
||||
# nonratified mnoise register not implemented
|
||||
--override cpu/mnoise_undefined=T
|
||||
|
||||
# mcause and scause only have 4 lsbs of code and 1 msb of interrupt flag
|
||||
@ -86,7 +87,9 @@
|
||||
# Zkr entropy source and seed register not supported.
|
||||
--override cpu/Zkr=F
|
||||
|
||||
|
||||
# ShangMi Crypto not supported
|
||||
--override cpu/Zksed=F
|
||||
--override cpu/Zksh=F
|
||||
|
||||
--override cpu/reset_address=0x80000000
|
||||
|
||||
@ -107,7 +110,7 @@
|
||||
# mstatus.FS is set dirty on any write to a FPR, or when a fp operation signals an exception
|
||||
--override cpu/mstatus_fs_mode=write_1
|
||||
|
||||
# PMA Settings
|
||||
# PMA Settings
|
||||
# 'r': read access allowed
|
||||
# 'w': write access allowed
|
||||
# 'x': execute access allowed
|
||||
|
@ -31,7 +31,7 @@
|
||||
localparam XLEN = 32'd64;
|
||||
|
||||
// IEEE 754 compliance
|
||||
localparam IEEE754 = 0;
|
||||
localparam logic IEEE754 = 0;
|
||||
|
||||
// RISC-V configuration per specification
|
||||
// Base instruction set (defaults to I if E is not supported)
|
||||
@ -147,7 +147,6 @@ localparam WFI_TIMEOUT_BIT = 32'd16;
|
||||
// Peripheral Physical Addresses
|
||||
// Peripheral memory space extends from BASE to BASE+RANGE
|
||||
// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits
|
||||
// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file?
|
||||
localparam logic DTIM_SUPPORTED = 1;
|
||||
localparam logic [63:0] DTIM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] DTIM_RANGE = 64'h007FFFFF;
|
||||
@ -157,11 +156,11 @@ localparam logic [63:0] IROM_RANGE = 64'h007FFFFF;
|
||||
localparam logic BOOTROM_SUPPORTED = 0;
|
||||
localparam logic [63:0] BOOTROM_BASE = 64'h00001000;
|
||||
localparam logic [63:0] BOOTROM_RANGE = 64'h00000FFF;
|
||||
localparam BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic BOOTROM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_SUPPORTED = 0;
|
||||
localparam logic [63:0] UNCORE_RAM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] UNCORE_RAM_RANGE = 64'h07FFFFFF;
|
||||
localparam UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic UNCORE_RAM_PRELOAD = 1'b0;
|
||||
localparam logic EXT_MEM_SUPPORTED = 0;
|
||||
localparam logic [63:0] EXT_MEM_BASE = 64'h80000000;
|
||||
localparam logic [63:0] EXT_MEM_RANGE = 64'h07FFFFFF;
|
||||
@ -179,7 +178,7 @@ localparam logic [63:0] PLIC_BASE = 64'h0C000000;
|
||||
localparam logic [63:0] PLIC_RANGE = 64'h03FFFFFF;
|
||||
localparam logic SDC_SUPPORTED = 0;
|
||||
localparam logic [63:0] SDC_BASE = 64'h00013000;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h0000007F;
|
||||
localparam logic [63:0] SDC_RANGE = 64'h00000FFF;
|
||||
localparam logic SPI_SUPPORTED = 0;
|
||||
localparam logic [63:0] SPI_BASE = 64'h10040000;
|
||||
localparam logic [63:0] SPI_RANGE = 64'h00000FFF;
|
||||
|
@ -15,6 +15,44 @@
|
||||
extern volatile uint64_t tohost;
|
||||
extern volatile uint64_t fromhost;
|
||||
|
||||
/////////////////////////////
|
||||
// Start of code added for Wally
|
||||
// Use UART rather than syscall host interface for printing
|
||||
//////////////////////////////
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void uartInit(void) {
|
||||
volatile uint8_t *UART_LCR = (uint8_t*)0x10000003;
|
||||
*UART_LCR = 0b0000011; // 8-bit characters, 1 stop bit, no parity
|
||||
}
|
||||
|
||||
void uartSend(char c) {
|
||||
volatile uint8_t *UART_THR = (uint8_t*)0x10000000;
|
||||
volatile uint8_t *UART_LSR = (uint8_t*)0x10000005;
|
||||
|
||||
while (!(*UART_LSR & (1<<5))); // wait for THRE (trans hold reg empty)
|
||||
*UART_THR = c;
|
||||
}
|
||||
|
||||
char uartReceive(void) {
|
||||
volatile uint8_t *UART_RBR = (uint8_t*)0x10000000;
|
||||
volatile uint8_t *UART_LSR = (uint8_t*)0x10000005;
|
||||
|
||||
while (!(*UART_LSR & (1<<0))); // wait for DR (Data Ready)
|
||||
return *UART_RBR;
|
||||
}
|
||||
|
||||
char uartPutStr(const char *str) {
|
||||
while (*str) {
|
||||
uartSend(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
// End of code added for Wally
|
||||
//////////////////////////////
|
||||
|
||||
static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2)
|
||||
{
|
||||
volatile uint64_t magic_mem[8] __attribute__((aligned(64)));
|
||||
@ -76,7 +114,19 @@ void abort()
|
||||
|
||||
void printstr(const char* s)
|
||||
{
|
||||
syscall(SYS_write, 1, (uintptr_t)s, strlen(s));
|
||||
// david_harris@hmc.edu 11/30/24 switch to printing via UART rather than syscall
|
||||
// This works on both Spike and Wally simulations
|
||||
//syscall(SYS_write, 1, (uintptr_t)s, strlen(s));
|
||||
uartPutStr(s);
|
||||
}
|
||||
|
||||
// Added 30 November 2024 David_Harris@hmc.edu
|
||||
// The compiler encountering printf with a pure string argument tries to invoke puts
|
||||
// rather than the usual printf, so puts must be defined.
|
||||
int puts(const char* s)
|
||||
{
|
||||
printstr(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __attribute__((weak)) thread_entry(int cid, int nc)
|
||||
@ -107,6 +157,7 @@ void _init(int cid, int nc)
|
||||
{
|
||||
init_tls();
|
||||
thread_entry(cid, nc);
|
||||
uartInit(); // added 11/30/2024 David_Harris@hmc.edu for printing via UART
|
||||
|
||||
// only single-threaded programs should ever get here.
|
||||
int ret = main(0, 0);
|
||||
@ -125,6 +176,11 @@ void _init(int cid, int nc)
|
||||
#undef putchar
|
||||
int putchar(int ch)
|
||||
{
|
||||
// David_Harris@hmc.edu 11/30/2024
|
||||
// Replaced syscall with uartSend
|
||||
uartSend(ch);
|
||||
|
||||
/*
|
||||
static __thread char buf[64] __attribute__((aligned(64)));
|
||||
static __thread int buflen = 0;
|
||||
|
||||
@ -134,7 +190,7 @@ int putchar(int ch)
|
||||
{
|
||||
syscall(SYS_write, 1, (uintptr_t)buf, buflen);
|
||||
buflen = 0;
|
||||
}
|
||||
} */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
32
examples/C/gpio/Makefile
Normal file
32
examples/C/gpio/Makefile
Normal file
@ -0,0 +1,32 @@
|
||||
TARGET = gpio
|
||||
|
||||
$(TARGET).objdump: $(TARGET)
|
||||
riscv64-unknown-elf-objdump -S -D $(TARGET) > $(TARGET).objdump
|
||||
|
||||
$(TARGET): $(TARGET).c Makefile
|
||||
riscv64-unknown-elf-gcc -o $(TARGET) -gdwarf-2 -O\
|
||||
-march=rv64gc -mabi=lp64d -mcmodel=medany \
|
||||
-nostdlib -static -lm -fno-tree-loop-distribute-patterns \
|
||||
-T../common/test.ld -I../common \
|
||||
$(TARGET).c ../common/crt.S ../common/syscalls.c
|
||||
# Compiler flags:
|
||||
# -o $(TARGET) defines the name of the output file
|
||||
# -g generates debugging symbols for gdb
|
||||
# -O turns on basic optimization; -O3 turns on heavy optimization; omit for no optimization
|
||||
# -march=rv64gc -mabi=lp64d =mcmodel=medany generates code for RV64GC with doubles and long/ptrs = 64 bits
|
||||
# -static forces static linking (no dynamic shared libraries on bare metal)
|
||||
# -lm links the math library if necessary (when #include math.h)
|
||||
# -nostdlib avoids inserting standard startup files and default libraries
|
||||
# because we are using crt.s on bare metal
|
||||
# -fno-tree-loop-distribute-patterns turns replacing loops with memcpy/memset in the std library
|
||||
# -T specifies the linker file
|
||||
# -I specifies the include path (e.g. for util.h)
|
||||
# The last line defines the C files to compile.
|
||||
# crt.S is needed as our startup file to initialize the processor
|
||||
# syscalls.c implements printf through the HTIF for Spike
|
||||
# other flags from riscv-tests makefiles that don't seem to be important
|
||||
# -ffast-math -DPREALLOCATE=1 -std=gnu99 \
|
||||
# -fno-common -fno-builtin-printf -nostartfiles -lgcc \
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(TARGET).objdump* $(TARGET).memfile
|
28
examples/C/gpio/gpio.c
Normal file
28
examples/C/gpio/gpio.c
Normal file
@ -0,0 +1,28 @@
|
||||
// gpio.c
|
||||
// David_Harris@hmc.edu 30 November 2024
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
// General-Purpose I/O (GPIO) example program illustrating compiled C code
|
||||
// compile with make
|
||||
// simulate with: wsim rv64gc --elf gpio --sim verilator
|
||||
|
||||
#include <stdio.h>
|
||||
#include "gpiolib.h"
|
||||
|
||||
int main(void) {
|
||||
printf("GPIO Example!\n\r");
|
||||
pinMode(0, INPUT);
|
||||
pinMode(1, OUTPUT);
|
||||
pinMode(2, OUTPUT);
|
||||
|
||||
for (int i=0; i<10; i++) {
|
||||
// Read pin 0 and write it to pin 1
|
||||
int val = digitalRead(0);
|
||||
printf("Pin 0: %d\n", val);
|
||||
digitalWrite(1, val);
|
||||
|
||||
// Toggle pin 2
|
||||
printf("Pin 2: %d\n", i%2);
|
||||
digitalWrite(2, i%2);
|
||||
}
|
||||
}
|
81
examples/C/gpio/gpiolib.h
Normal file
81
examples/C/gpio/gpiolib.h
Normal file
@ -0,0 +1,81 @@
|
||||
// gpiolib.h
|
||||
// Basic Arduino-compatible functions for general-purpose input/output
|
||||
|
||||
// Assumes GPIO0_BASE is set to the memory-mapped GPIO address from
|
||||
// config/rv64gc/config.vh.
|
||||
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Bitfield Structs
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct
|
||||
{
|
||||
volatile uint32_t input_val; // (GPIO offset 0x00) Pin value
|
||||
volatile uint32_t input_en; // (GPIO offset 0x04) Pin input enable*
|
||||
volatile uint32_t output_en; // (GPIO offset 0x08) Pin output enable*
|
||||
volatile uint32_t output_val; // (GPIO offset 0x0C) Output value
|
||||
volatile uint32_t pue; // (GPIO offset 0x10) Internal pull-up enable*
|
||||
volatile uint32_t ds; // (GPIO offset 0x14) Pin drive strength
|
||||
volatile uint32_t rise_ie; // (GPIO offset 0x18) Rise interrupt enable
|
||||
volatile uint32_t rise_ip; // (GPIO offset 0x1C) Rise interrupt pending
|
||||
volatile uint32_t fall_ie; // (GPIO offset 0x20) Fall interrupt enable
|
||||
volatile uint32_t fall_ip; // (GPIO offset 0x24) Fall interrupt pending
|
||||
volatile uint32_t high_ie; // (GPIO offset 0x28) High interrupt enable
|
||||
volatile uint32_t high_ip; // (GPIO offset 0x2C) High interrupt pending
|
||||
volatile uint32_t low_ie; // (GPIO offset 0x30) Low interrupt enable
|
||||
volatile uint32_t low_ip; // (GPIO offset 0x34) Low interrupt pending
|
||||
volatile uint32_t iof_en; // (GPIO offset 0x38) HW-Driven functions enable
|
||||
volatile uint32_t iof_sel; // (GPIO offset 0x3C) HW-Driven functions selection
|
||||
volatile uint32_t out_xor; // (GPIO offset 0x40) Output XOR (invert)
|
||||
// Registers marked with * are asynchronously reset to 0. All others are synchronously reset to 0.
|
||||
} GPIO;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// GPIO Constant Definitions
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define GPIO0_BASE (0x10060000U) // GPIO memory-mapped base address
|
||||
|
||||
#define GPIO0 ((GPIO*) GPIO0_BASE) // Set up pointer to struct of type GPIO aligned at the base GPIO0 memory-mapped address
|
||||
|
||||
#define LOW 0
|
||||
#define HIGH 1
|
||||
|
||||
#define INPUT 0
|
||||
#define OUTPUT 1
|
||||
#define GPIO_IOF0 2
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// GPIO Functions
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void pinMode(int pin, int function)
|
||||
{
|
||||
switch(function) {
|
||||
case INPUT:
|
||||
GPIO0->input_en |= (1 << pin); // Sets a pin as an input
|
||||
break;
|
||||
case OUTPUT:
|
||||
GPIO0->output_en |= (1 << pin); // Set pin as an output
|
||||
GPIO0->iof_en &= ~(1 << pin);
|
||||
break;
|
||||
case GPIO_IOF0:
|
||||
GPIO0->iof_sel &= ~(1 << pin);
|
||||
GPIO0->iof_en |= (1 << pin);
|
||||
}
|
||||
}
|
||||
|
||||
void digitalWrite(int pin, int val)
|
||||
{
|
||||
if (val) GPIO0->output_val |= (1 << pin);
|
||||
else GPIO0->output_val &= ~(1 << pin);
|
||||
}
|
||||
|
||||
int digitalRead(int pin)
|
||||
{
|
||||
return (GPIO0->input_val >> pin) & 0x1;
|
||||
}
|
32
examples/C/hello/Makefile
Normal file
32
examples/C/hello/Makefile
Normal file
@ -0,0 +1,32 @@
|
||||
TARGET = hello
|
||||
|
||||
$(TARGET).objdump: $(TARGET)
|
||||
riscv64-unknown-elf-objdump -S -D $(TARGET) > $(TARGET).objdump
|
||||
|
||||
$(TARGET): $(TARGET).c Makefile
|
||||
riscv64-unknown-elf-gcc -o $(TARGET) -gdwarf-2 -O\
|
||||
-march=rv64gc -mabi=lp64d -mcmodel=medany \
|
||||
-nostdlib -static -lm -fno-tree-loop-distribute-patterns \
|
||||
-T../common/test.ld -I../common \
|
||||
$(TARGET).c ../common/crt.S ../common/syscalls.c
|
||||
# Compiler flags:
|
||||
# -o $(TARGET) defines the name of the output file
|
||||
# -g generates debugging symbols for gdb
|
||||
# -O turns on basic optimization; -O3 turns on heavy optimization; omit for no optimization
|
||||
# -march=rv64gc -mabi=lp64d =mcmodel=medany generates code for RV64GC with doubles and long/ptrs = 64 bits
|
||||
# -static forces static linking (no dynamic shared libraries on bare metal)
|
||||
# -lm links the math library if necessary (when #include math.h)
|
||||
# -nostdlib avoids inserting standard startup files and default libraries
|
||||
# because we are using crt.s on bare metal
|
||||
# -fno-tree-loop-distribute-patterns turns replacing loops with memcpy/memset in the std library
|
||||
# -T specifies the linker file
|
||||
# -I specifies the include path (e.g. for util.h)
|
||||
# The last line defines the C files to compile.
|
||||
# crt.S is needed as our startup file to initialize the processor
|
||||
# syscalls.c implements printf through the HTIF for Spike
|
||||
# other flags from riscv-tests makefiles that don't seem to be important
|
||||
# -ffast-math -DPREALLOCATE=1 -std=gnu99 \
|
||||
# -fno-common -fno-builtin-printf -nostartfiles -lgcc \
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(TARGET).objdump* $(TARGET).memfile
|
25
examples/C/hello/hello.c
Normal file
25
examples/C/hello/hello.c
Normal file
@ -0,0 +1,25 @@
|
||||
// hello.c
|
||||
// David_Harris@hmc.edu 30 November 2024
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
// Hello World program illustrating compiled C code printing via the UART
|
||||
// The Wally team has modified the Berkeley syscalls.c (in examples/C/common)
|
||||
// to print via UART rather than the syscall interface. This is supported
|
||||
// on both Spike and Wally. It assumes the PC16550-compatible UART is at
|
||||
// the default SiFive address of 0x10000000.
|
||||
// Note that there seem to be some discrepancies between the UART and Spike
|
||||
// such that using \n\r for new lines works best.
|
||||
|
||||
// compile with make
|
||||
// simulate Wally with: wsim rv64gc --elf hello --sim verilator
|
||||
// simulate in Spike with: spike hello
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
printf("Hello Wally!\n\r");
|
||||
for (int i = 0; i < 10; i++) {
|
||||
printf("%d ", i);
|
||||
}
|
||||
printf("\n\r");
|
||||
}
|
@ -237,7 +237,7 @@ __uint128_t parseNum(char *num) {
|
||||
if (strlen(num) < 8) size = 2;
|
||||
else if (strlen(num) < 16) size = 4;
|
||||
else if (strlen(num) < 32) size = 8;
|
||||
else if (strlen(num) < 35) size = 16; // *** will need to increase
|
||||
else if (strlen(num) < 35) size = 16;
|
||||
else {
|
||||
printf("Error: only half, single, double, or quad precision supported");
|
||||
exit(1);
|
||||
|
@ -5,39 +5,36 @@ wally/wallypipelinedcore.sv: logic InstrM
|
||||
lsu/lsu.sv: logic IEUAdrM
|
||||
lsu/lsu.sv: logic MemRWM
|
||||
mmu/hptw.sv: logic SATP_REGW
|
||||
uncore/uncore.sv: logic SDCCmd
|
||||
uncore/uncore.sv: logic SDCCLK
|
||||
uncore/uncore.sv: logic SDCIn
|
||||
uncore/uncore.sv: logic SDCCS
|
||||
uncore/spi_apb.sv: logic InterruptPending
|
||||
uncore/spi_apb.sv: logic TransmitFIFOWriteInc
|
||||
uncore/spi_apb.sv: logic TransmitFIFOEmpty
|
||||
uncore/spi_apb.sv: logic TransmitFIFOReadInc
|
||||
uncore/spi_apb.sv: logic TransmitLoad
|
||||
uncore/spi_apb.sv: logic ShiftEdge
|
||||
uncore/spi_apb.sv: logic SampleEdge
|
||||
uncore/spi_apb.sv: logic ReceiveShiftReg
|
||||
uncore/spi_apb.sv: logic TransmitReg
|
||||
uncore/spi_apb.sv: logic ShiftIn
|
||||
uncore/spi_apb.sv: logic EndOfFrame
|
||||
uncore/spi_apb.sv: logic TransmitRegLoaded
|
||||
uncore/spi_apb.sv: logic TransmitData
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOWriteInc
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOReadInc
|
||||
uncore/spi_apb.sv: logic ReceiveShiftRegEndian
|
||||
uncore/spi_apb.sv: logic ReceiveWatermark
|
||||
uncore/spi_apb.sv: logic ReceiveReadWatermarkLevel
|
||||
uncore/spi_apb.sv: logic ReceiveData
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOFull
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOEmpty
|
||||
uncore/spi_controller.sv: logic SCLKenable
|
||||
uncore/spi_controller.sv: statetype CurrState
|
||||
uncore/spi_controller.sv: statetype NextState
|
||||
uncore/spi_controller.sv: logic BitNum
|
||||
uncore/spi_controller.sv: logic ContinueTransmit
|
||||
uncore/spi_controller.sv: logic PhaseOneOffset
|
||||
uncore/spi_controller.sv: logic SPICLK
|
||||
uncore/spi_fifo.sv: logic rptr
|
||||
uncore/spi_fifo.sv: logic rptrnext
|
||||
uncore/spi_fifo.sv: logic raddr
|
||||
uncore/spi_fifo.sv: logic waddr
|
||||
uncore/uartPC16550D.sv : logic MCR
|
||||
uncore/uartPC16550D.sv : logic FCR
|
||||
uncore/uartPC16550D.sv : logic MSR
|
||||
uncore/uartPC16550D.sv : logic DTRb
|
||||
uncore/uartPC16550D.sv : logic INTR
|
||||
uncore/uartPC16550D.sv : logic RXRDYb
|
||||
uncore/uartPC16550D.sv : logic TXRDYb
|
||||
uncore/uartPC16550D.sv : logic RXerrIP
|
||||
uncore/uartPC16550D.sv : logic IER
|
||||
uncore/uartPC16550D.sv : logic LSR
|
||||
uncore/uartPC16550D.sv : logic SCR
|
||||
uncore/uartPC16550D.sv : statetype txstate
|
||||
uncore/uartPC16550D.sv : logic RBR
|
||||
uncore/uartPC16550D.sv : logic rxparityerr
|
||||
uncore/uartPC16550D.sv : logic LCR
|
||||
uncore/uartPC16550D.sv : logic intrID
|
||||
uncore/uartPC16550D.sv : logic rxdataavailintr
|
||||
uncore/uartPC16550D.sv : logic fifoenabled
|
||||
uncore/uartPC16550D.sv : logic rxfifoentries
|
||||
uncore/uartPC16550D.sv : logic txsrfull
|
||||
uncore/uartPC16550D.sv : logic txhrfull
|
||||
uncore/uartPC16550D.sv : logic txfifofull
|
||||
uncore/uartPC16550D.sv : logic txfifotail
|
||||
uncore/uartPC16550D.sv : logic txfifohead
|
||||
uncore/uartPC16550D.sv : logic rxfifotriggered
|
||||
uncore/uartPC16550D.sv : logic rxdataready
|
||||
privileged/privdec.sv : logic wfiM
|
||||
privileged/privdec.sv : logic wfiW
|
||||
privileged/privdec.sv : logic WFITimeoutM
|
||||
uncore/plic_apb.sv : logic requests
|
||||
uncore/plic_apb.sv : logic intInProgress
|
||||
uncore/plic_apb.sv : logic intPending
|
||||
uncore/plic_apb.sv : logic intClaim
|
||||
|
@ -5,32 +5,39 @@ wally/wallypipelinedcore.sv: logic InstrM
|
||||
lsu/lsu.sv: logic IEUAdrM
|
||||
lsu/lsu.sv: logic MemRWM
|
||||
mmu/hptw.sv: logic SATP_REGW
|
||||
uncore/spi_apb.sv: logic ShiftIn
|
||||
uncore/spi_apb.sv: logic ReceiveShiftReg
|
||||
uncore/spi_apb.sv: logic SCLKenable
|
||||
uncore/spi_apb.sv: logic SampleEdge
|
||||
uncore/spi_apb.sv: logic Active
|
||||
uncore/spi_apb.sv: statetype state
|
||||
uncore/spi_apb.sv: typedef rsrstatetype
|
||||
uncore/spi_apb.sv: logic SPICLK
|
||||
uncore/spi_apb.sv: logic SPIOut
|
||||
uncore/spi_apb.sv: logic SPICS
|
||||
uncore/spi_apb.sv: logic SckMode
|
||||
uncore/spi_apb.sv: logic SckDiv
|
||||
uncore/uncore.sv: logic SDCCmd
|
||||
uncore/uncore.sv: logic SDCCLK
|
||||
uncore/uncore.sv: logic SDCIn
|
||||
uncore/uncore.sv: logic SDCCS
|
||||
uncore/spi_apb.sv: logic InterruptPending
|
||||
uncore/spi_apb.sv: logic TransmitFIFOWriteInc
|
||||
uncore/spi_apb.sv: logic TransmitFIFOEmpty
|
||||
uncore/spi_apb.sv: logic TransmitFIFOReadInc
|
||||
uncore/spi_apb.sv: logic TransmitLoad
|
||||
uncore/spi_apb.sv: logic ShiftEdge
|
||||
uncore/spi_apb.sv: logic TransmitShiftRegLoadSingleCycle
|
||||
uncore/spi_apb.sv: logic TransmitShiftReg
|
||||
uncore/spi_apb.sv: logic SampleEdge
|
||||
uncore/spi_apb.sv: logic ReceiveShiftReg
|
||||
uncore/spi_apb.sv: logic TransmitReg
|
||||
uncore/spi_apb.sv: logic ShiftIn
|
||||
uncore/spi_apb.sv: logic EndOfFrame
|
||||
uncore/spi_apb.sv: logic TransmitRegLoaded
|
||||
uncore/spi_apb.sv: logic TransmitData
|
||||
uncore/spi_apb.sv: logic ReceiveData
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOWriteInc
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOReadInc
|
||||
uncore/spi_apb.sv: logic ReceiveShiftRegEndian
|
||||
uncore/spi_apb.sv: logic TransmitShiftReg
|
||||
uncore/spi_apb.sv: logic TransmitShift
|
||||
uncore/spi_apb.sv: logic ReceiveShiftFullDelay
|
||||
uncore/spi_apb.sv: logic TransmitShiftEmpty
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOWriteFull
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOReadIncrement
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOReadEmpty
|
||||
uncore/spi_apb.sv: logic TransmitFIFOWriteIncrement
|
||||
uncore/spi_apb.sv: logic TransmitFIFOReadIncrement
|
||||
uncore/spi_apb.sv: logic TransmitFIFOWriteFull
|
||||
uncore/spi_apb.sv: logic TransmitFIFOReadEmpty
|
||||
uncore/spi_apb.sv: logic ReceiveWatermark
|
||||
uncore/spi_apb.sv: logic ReceiveReadWatermarkLevel
|
||||
uncore/spi_apb.sv: logic ReceiveData
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOFull
|
||||
uncore/spi_apb.sv: logic ReceiveFIFOEmpty
|
||||
uncore/spi_controller.sv: logic SCLKenable
|
||||
uncore/spi_controller.sv: statetype CurrState
|
||||
uncore/spi_controller.sv: statetype NextState
|
||||
uncore/spi_controller.sv: logic BitNum
|
||||
uncore/spi_controller.sv: logic ContinueTransmit
|
||||
uncore/spi_controller.sv: logic PhaseOneOffset
|
||||
uncore/spi_controller.sv: logic SPICLK
|
||||
uncore/spi_fifo.sv: logic rptr
|
||||
uncore/spi_fifo.sv: logic rptrnext
|
||||
uncore/spi_fifo.sv: logic raddr
|
||||
uncore/spi_fifo.sv: logic waddr
|
||||
|
33
fpga/constraints/marked_debug_uart.txt
Normal file
33
fpga/constraints/marked_debug_uart.txt
Normal file
@ -0,0 +1,33 @@
|
||||
wally/wallypipelinedcore.sv: logic PCM
|
||||
wally/wallypipelinedcore.sv: logic TrapM
|
||||
wally/wallypipelinedcore.sv: logic InstrValidM
|
||||
wally/wallypipelinedcore.sv: logic InstrM
|
||||
lsu/lsu.sv: logic IEUAdrM
|
||||
lsu/lsu.sv: logic MemRWM
|
||||
mmu/hptw.sv: logic SATP_REGW
|
||||
uncore/uartPC16550D.sv : logic MCR
|
||||
uncore/uartPC16550D.sv : logic FCR
|
||||
uncore/uartPC16550D.sv : logic MSR
|
||||
uncore/uartPC16550D.sv : logic DTRb
|
||||
uncore/uartPC16550D.sv : logic INTR
|
||||
uncore/uartPC16550D.sv : logic RXRDYb
|
||||
uncore/uartPC16550D.sv : logic TXRDYb
|
||||
uncore/uartPC16550D.sv : logic RXerrIP
|
||||
uncore/uartPC16550D.sv : logic IER
|
||||
uncore/uartPC16550D.sv : logic LSR
|
||||
uncore/uartPC16550D.sv : logic SCR
|
||||
uncore/uartPC16550D.sv : statetype txstate
|
||||
uncore/uartPC16550D.sv : logic RBR
|
||||
uncore/uartPC16550D.sv : logic rxparityerr
|
||||
uncore/uartPC16550D.sv : logic LCR
|
||||
uncore/uartPC16550D.sv : logic intrID
|
||||
uncore/uartPC16550D.sv : logic rxdataavailintr
|
||||
uncore/uartPC16550D.sv : logic fifoenabled
|
||||
uncore/uartPC16550D.sv : logic rxfifoentries
|
||||
uncore/uartPC16550D.sv : logic txsrfull
|
||||
uncore/uartPC16550D.sv : logic txhrfull
|
||||
uncore/uartPC16550D.sv : logic txfifofull
|
||||
uncore/uartPC16550D.sv : logic txfifotail
|
||||
uncore/uartPC16550D.sv : logic txfifohead
|
||||
uncore/uartPC16550D.sv : logic rxfifotriggered
|
||||
uncore/uartPC16550D.sv : logic rxdataready
|
208
fpga/constraints/small-debug-uart.xdc
Normal file
208
fpga/constraints/small-debug-uart.xdc
Normal file
@ -0,0 +1,208 @@
|
||||
create_debug_core u_ila_0 ila
|
||||
|
||||
|
||||
|
||||
|
||||
set_property C_DATA_DEPTH 4096 [get_debug_cores u_ila_0]
|
||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
||||
startgroup
|
||||
set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0 ]
|
||||
set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0 ]
|
||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0 ]
|
||||
set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0 ]
|
||||
endgroup
|
||||
connect_debug_port u_ila_0/clk [get_nets CPUCLK]
|
||||
|
||||
set_property port_width 33 [get_debug_ports u_ila_0/probe0]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
||||
connect_debug_port u_ila_0/probe0 [get_nets [list {wallypipelinedsoc/core/PCM[0]} {wallypipelinedsoc/core/PCM[1]} {wallypipelinedsoc/core/PCM[2]} {wallypipelinedsoc/core/PCM[3]} {wallypipelinedsoc/core/PCM[4]} {wallypipelinedsoc/core/PCM[5]} {wallypipelinedsoc/core/PCM[6]} {wallypipelinedsoc/core/PCM[7]} {wallypipelinedsoc/core/PCM[8]} {wallypipelinedsoc/core/PCM[9]} {wallypipelinedsoc/core/PCM[10]} {wallypipelinedsoc/core/PCM[11]} {wallypipelinedsoc/core/PCM[12]} {wallypipelinedsoc/core/PCM[13]} {wallypipelinedsoc/core/PCM[14]} {wallypipelinedsoc/core/PCM[15]} {wallypipelinedsoc/core/PCM[16]} {wallypipelinedsoc/core/PCM[17]} {wallypipelinedsoc/core/PCM[18]} {wallypipelinedsoc/core/PCM[19]} {wallypipelinedsoc/core/PCM[20]} {wallypipelinedsoc/core/PCM[21]} {wallypipelinedsoc/core/PCM[22]} {wallypipelinedsoc/core/PCM[23]} {wallypipelinedsoc/core/PCM[24]} {wallypipelinedsoc/core/PCM[25]} {wallypipelinedsoc/core/PCM[26]} {wallypipelinedsoc/core/PCM[27]} {wallypipelinedsoc/core/PCM[28]} {wallypipelinedsoc/core/PCM[29]} {wallypipelinedsoc/core/PCM[30]} {wallypipelinedsoc/core/PCM[31]} {wallypipelinedsoc/core/PCM[32]} } ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe1]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
||||
connect_debug_port u_ila_0/probe1 [get_nets [list wallypipelinedsoc/core/TrapM ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe2]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
||||
connect_debug_port u_ila_0/probe2 [get_nets [list wallypipelinedsoc/core/InstrValidM ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 32 [get_debug_ports u_ila_0/probe3]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
||||
connect_debug_port u_ila_0/probe3 [get_nets [list {wallypipelinedsoc/core/InstrM[0]} {wallypipelinedsoc/core/InstrM[1]} {wallypipelinedsoc/core/InstrM[2]} {wallypipelinedsoc/core/InstrM[3]} {wallypipelinedsoc/core/InstrM[4]} {wallypipelinedsoc/core/InstrM[5]} {wallypipelinedsoc/core/InstrM[6]} {wallypipelinedsoc/core/InstrM[7]} {wallypipelinedsoc/core/InstrM[8]} {wallypipelinedsoc/core/InstrM[9]} {wallypipelinedsoc/core/InstrM[10]} {wallypipelinedsoc/core/InstrM[11]} {wallypipelinedsoc/core/InstrM[12]} {wallypipelinedsoc/core/InstrM[13]} {wallypipelinedsoc/core/InstrM[14]} {wallypipelinedsoc/core/InstrM[15]} {wallypipelinedsoc/core/InstrM[16]} {wallypipelinedsoc/core/InstrM[17]} {wallypipelinedsoc/core/InstrM[18]} {wallypipelinedsoc/core/InstrM[19]} {wallypipelinedsoc/core/InstrM[20]} {wallypipelinedsoc/core/InstrM[21]} {wallypipelinedsoc/core/InstrM[22]} {wallypipelinedsoc/core/InstrM[23]} {wallypipelinedsoc/core/InstrM[24]} {wallypipelinedsoc/core/InstrM[25]} {wallypipelinedsoc/core/InstrM[26]} {wallypipelinedsoc/core/InstrM[27]} {wallypipelinedsoc/core/InstrM[28]} {wallypipelinedsoc/core/InstrM[29]} {wallypipelinedsoc/core/InstrM[30]} {wallypipelinedsoc/core/InstrM[31]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe4]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
||||
connect_debug_port u_ila_0/probe4 [get_nets [list {wallypipelinedsoc/core/lsu/MemRWM[0]} {wallypipelinedsoc/core/lsu/MemRWM[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 64 [get_debug_ports u_ila_0/probe5]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
||||
connect_debug_port u_ila_0/probe5 [get_nets [list {wallypipelinedsoc/core/lsu/IEUAdrM[0]} {wallypipelinedsoc/core/lsu/IEUAdrM[1]} {wallypipelinedsoc/core/lsu/IEUAdrM[2]} {wallypipelinedsoc/core/lsu/IEUAdrM[3]} {wallypipelinedsoc/core/lsu/IEUAdrM[4]} {wallypipelinedsoc/core/lsu/IEUAdrM[5]} {wallypipelinedsoc/core/lsu/IEUAdrM[6]} {wallypipelinedsoc/core/lsu/IEUAdrM[7]} {wallypipelinedsoc/core/lsu/IEUAdrM[8]} {wallypipelinedsoc/core/lsu/IEUAdrM[9]} {wallypipelinedsoc/core/lsu/IEUAdrM[10]} {wallypipelinedsoc/core/lsu/IEUAdrM[11]} {wallypipelinedsoc/core/lsu/IEUAdrM[12]} {wallypipelinedsoc/core/lsu/IEUAdrM[13]} {wallypipelinedsoc/core/lsu/IEUAdrM[14]} {wallypipelinedsoc/core/lsu/IEUAdrM[15]} {wallypipelinedsoc/core/lsu/IEUAdrM[16]} {wallypipelinedsoc/core/lsu/IEUAdrM[17]} {wallypipelinedsoc/core/lsu/IEUAdrM[18]} {wallypipelinedsoc/core/lsu/IEUAdrM[19]} {wallypipelinedsoc/core/lsu/IEUAdrM[20]} {wallypipelinedsoc/core/lsu/IEUAdrM[21]} {wallypipelinedsoc/core/lsu/IEUAdrM[22]} {wallypipelinedsoc/core/lsu/IEUAdrM[23]} {wallypipelinedsoc/core/lsu/IEUAdrM[24]} {wallypipelinedsoc/core/lsu/IEUAdrM[25]} {wallypipelinedsoc/core/lsu/IEUAdrM[26]} {wallypipelinedsoc/core/lsu/IEUAdrM[27]} {wallypipelinedsoc/core/lsu/IEUAdrM[28]} {wallypipelinedsoc/core/lsu/IEUAdrM[29]} {wallypipelinedsoc/core/lsu/IEUAdrM[30]} {wallypipelinedsoc/core/lsu/IEUAdrM[31]} {wallypipelinedsoc/core/lsu/IEUAdrM[32]} {wallypipelinedsoc/core/lsu/IEUAdrM[33]} {wallypipelinedsoc/core/lsu/IEUAdrM[34]} {wallypipelinedsoc/core/lsu/IEUAdrM[35]} {wallypipelinedsoc/core/lsu/IEUAdrM[36]} {wallypipelinedsoc/core/lsu/IEUAdrM[37]} {wallypipelinedsoc/core/lsu/IEUAdrM[38]} {wallypipelinedsoc/core/lsu/IEUAdrM[39]} {wallypipelinedsoc/core/lsu/IEUAdrM[40]} {wallypipelinedsoc/core/lsu/IEUAdrM[41]} {wallypipelinedsoc/core/lsu/IEUAdrM[42]} {wallypipelinedsoc/core/lsu/IEUAdrM[43]} {wallypipelinedsoc/core/lsu/IEUAdrM[44]} {wallypipelinedsoc/core/lsu/IEUAdrM[45]} {wallypipelinedsoc/core/lsu/IEUAdrM[46]} {wallypipelinedsoc/core/lsu/IEUAdrM[47]} {wallypipelinedsoc/core/lsu/IEUAdrM[48]} {wallypipelinedsoc/core/lsu/IEUAdrM[49]} {wallypipelinedsoc/core/lsu/IEUAdrM[50]} {wallypipelinedsoc/core/lsu/IEUAdrM[51]} {wallypipelinedsoc/core/lsu/IEUAdrM[52]} {wallypipelinedsoc/core/lsu/IEUAdrM[53]} {wallypipelinedsoc/core/lsu/IEUAdrM[54]} {wallypipelinedsoc/core/lsu/IEUAdrM[55]} {wallypipelinedsoc/core/lsu/IEUAdrM[56]} {wallypipelinedsoc/core/lsu/IEUAdrM[57]} {wallypipelinedsoc/core/lsu/IEUAdrM[58]} {wallypipelinedsoc/core/lsu/IEUAdrM[59]} {wallypipelinedsoc/core/lsu/IEUAdrM[60]} {wallypipelinedsoc/core/lsu/IEUAdrM[61]} {wallypipelinedsoc/core/lsu/IEUAdrM[62]} {wallypipelinedsoc/core/lsu/IEUAdrM[63]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe6]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
||||
connect_debug_port u_ila_0/probe6 [get_nets [list {wallypipelinedsoc/core/lsu/ReadDataM[0]} {wallypipelinedsoc/core/lsu/ReadDataM[1]} {wallypipelinedsoc/core/lsu/ReadDataM[2]} {wallypipelinedsoc/core/lsu/ReadDataM[3]} {wallypipelinedsoc/core/lsu/ReadDataM[4]} {wallypipelinedsoc/core/lsu/ReadDataM[5]} {wallypipelinedsoc/core/lsu/ReadDataM[6]} {wallypipelinedsoc/core/lsu/ReadDataM[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe7]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
||||
connect_debug_port u_ila_0/probe7 [get_nets [list {wallypipelinedsoc/core/lsu/WriteDataM[0]} {wallypipelinedsoc/core/lsu/WriteDataM[1]} {wallypipelinedsoc/core/lsu/WriteDataM[2]} {wallypipelinedsoc/core/lsu/WriteDataM[3]} {wallypipelinedsoc/core/lsu/WriteDataM[4]} {wallypipelinedsoc/core/lsu/WriteDataM[5]} {wallypipelinedsoc/core/lsu/WriteDataM[6]} {wallypipelinedsoc/core/lsu/WriteDataM[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 5 [get_debug_ports u_ila_0/probe8]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
||||
connect_debug_port u_ila_0/probe8 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MCR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MCR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MCR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MCR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MCR[4]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe9]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
||||
connect_debug_port u_ila_0/probe9 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[4]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[5]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[6]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/FCR[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe10]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
||||
connect_debug_port u_ila_0/probe10 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MSR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MSR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MSR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/MSR[3]} ]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe11]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
||||
connect_debug_port u_ila_0/probe11 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/DTRb ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe12]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
||||
connect_debug_port u_ila_0/probe12 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/INTR ]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe13]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
||||
connect_debug_port u_ila_0/probe13 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[3]}]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe14]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
||||
connect_debug_port u_ila_0/probe14 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txsrfull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe15]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
||||
connect_debug_port u_ila_0/probe15 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txhrfull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe16]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
||||
connect_debug_port u_ila_0/probe16 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RXRDYb ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe17]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
||||
connect_debug_port u_ila_0/probe17 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifofull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe18]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
||||
connect_debug_port u_ila_0/probe18 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifoempty}]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe19]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
||||
connect_debug_port u_ila_0/probe19 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/TXRDYb ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe20]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
||||
connect_debug_port u_ila_0/probe20 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RXerrIP} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe21]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
||||
connect_debug_port u_ila_0/probe21 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[3]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe22]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
||||
connect_debug_port u_ila_0/probe22 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[4]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[5]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[6]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LSR[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe23]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
||||
connect_debug_port u_ila_0/probe23 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[4]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[5]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[6]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/SCR[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe24]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
||||
connect_debug_port u_ila_0/probe24 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txstate[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txstate[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 11 [get_debug_ports u_ila_0/probe25]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe25]
|
||||
connect_debug_port u_ila_0/probe25 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[4]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[5]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[6]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[7]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[8]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[9]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RBR[10]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe26]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe26]
|
||||
connect_debug_port u_ila_0/probe26 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxparityerr} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe27]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe27]
|
||||
connect_debug_port u_ila_0/probe27 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxstate[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxstate[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe28]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe28]
|
||||
connect_debug_port u_ila_0/probe28 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[3]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[4]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[5]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[6]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/LCR[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 3 [get_debug_ports u_ila_0/probe29]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe29]
|
||||
connect_debug_port u_ila_0/probe29 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[2]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe30]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe30]
|
||||
connect_debug_port u_ila_0/probe30 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxdataavailintr} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe31]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe31]
|
||||
connect_debug_port u_ila_0/probe31 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/fifoenabled} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe32]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe32]
|
||||
connect_debug_port u_ila_0/probe32 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifotriggered} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe33]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe33]
|
||||
connect_debug_port u_ila_0/probe33 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[3]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe34]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe34]
|
||||
connect_debug_port u_ila_0/probe34 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxdataready} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe35]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe35]
|
||||
connect_debug_port u_ila_0/probe35 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[3]}]]
|
||||
|
||||
|
||||
# the debug hub has issues with the clocks from the mmcm so lets give up an connect to the 100Mhz input clock.
|
||||
#connect_debug_port dbg_hub/clk [get_nets default_100mhz_clk]
|
||||
connect_debug_port dbg_hub/clk [get_nets CPUCLK]
|
191
fpga/constraints/small-debug-wfi.xdc
Normal file
191
fpga/constraints/small-debug-wfi.xdc
Normal file
@ -0,0 +1,191 @@
|
||||
create_debug_core u_ila_0 ila
|
||||
|
||||
|
||||
|
||||
|
||||
set_property C_DATA_DEPTH 4096 [get_debug_cores u_ila_0]
|
||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
||||
startgroup
|
||||
set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0 ]
|
||||
set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0 ]
|
||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0 ]
|
||||
set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0 ]
|
||||
endgroup
|
||||
connect_debug_port u_ila_0/clk [get_nets CPUCLK]
|
||||
|
||||
set_property port_width 33 [get_debug_ports u_ila_0/probe0]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
||||
connect_debug_port u_ila_0/probe0 [get_nets [list {wallypipelinedsoc/core/PCM[0]} {wallypipelinedsoc/core/PCM[1]} {wallypipelinedsoc/core/PCM[2]} {wallypipelinedsoc/core/PCM[3]} {wallypipelinedsoc/core/PCM[4]} {wallypipelinedsoc/core/PCM[5]} {wallypipelinedsoc/core/PCM[6]} {wallypipelinedsoc/core/PCM[7]} {wallypipelinedsoc/core/PCM[8]} {wallypipelinedsoc/core/PCM[9]} {wallypipelinedsoc/core/PCM[10]} {wallypipelinedsoc/core/PCM[11]} {wallypipelinedsoc/core/PCM[12]} {wallypipelinedsoc/core/PCM[13]} {wallypipelinedsoc/core/PCM[14]} {wallypipelinedsoc/core/PCM[15]} {wallypipelinedsoc/core/PCM[16]} {wallypipelinedsoc/core/PCM[17]} {wallypipelinedsoc/core/PCM[18]} {wallypipelinedsoc/core/PCM[19]} {wallypipelinedsoc/core/PCM[20]} {wallypipelinedsoc/core/PCM[21]} {wallypipelinedsoc/core/PCM[22]} {wallypipelinedsoc/core/PCM[23]} {wallypipelinedsoc/core/PCM[24]} {wallypipelinedsoc/core/PCM[25]} {wallypipelinedsoc/core/PCM[26]} {wallypipelinedsoc/core/PCM[27]} {wallypipelinedsoc/core/PCM[28]} {wallypipelinedsoc/core/PCM[29]} {wallypipelinedsoc/core/PCM[30]} {wallypipelinedsoc/core/PCM[31]} {wallypipelinedsoc/core/PCM[32]} } ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe1]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
||||
connect_debug_port u_ila_0/probe1 [get_nets [list wallypipelinedsoc/core/TrapM ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe2]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
||||
connect_debug_port u_ila_0/probe2 [get_nets [list wallypipelinedsoc/core/InstrValidM ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 32 [get_debug_ports u_ila_0/probe3]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
||||
connect_debug_port u_ila_0/probe3 [get_nets [list {wallypipelinedsoc/core/InstrM[0]} {wallypipelinedsoc/core/InstrM[1]} {wallypipelinedsoc/core/InstrM[2]} {wallypipelinedsoc/core/InstrM[3]} {wallypipelinedsoc/core/InstrM[4]} {wallypipelinedsoc/core/InstrM[5]} {wallypipelinedsoc/core/InstrM[6]} {wallypipelinedsoc/core/InstrM[7]} {wallypipelinedsoc/core/InstrM[8]} {wallypipelinedsoc/core/InstrM[9]} {wallypipelinedsoc/core/InstrM[10]} {wallypipelinedsoc/core/InstrM[11]} {wallypipelinedsoc/core/InstrM[12]} {wallypipelinedsoc/core/InstrM[13]} {wallypipelinedsoc/core/InstrM[14]} {wallypipelinedsoc/core/InstrM[15]} {wallypipelinedsoc/core/InstrM[16]} {wallypipelinedsoc/core/InstrM[17]} {wallypipelinedsoc/core/InstrM[18]} {wallypipelinedsoc/core/InstrM[19]} {wallypipelinedsoc/core/InstrM[20]} {wallypipelinedsoc/core/InstrM[21]} {wallypipelinedsoc/core/InstrM[22]} {wallypipelinedsoc/core/InstrM[23]} {wallypipelinedsoc/core/InstrM[24]} {wallypipelinedsoc/core/InstrM[25]} {wallypipelinedsoc/core/InstrM[26]} {wallypipelinedsoc/core/InstrM[27]} {wallypipelinedsoc/core/InstrM[28]} {wallypipelinedsoc/core/InstrM[29]} {wallypipelinedsoc/core/InstrM[30]} {wallypipelinedsoc/core/InstrM[31]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe4]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
||||
connect_debug_port u_ila_0/probe4 [get_nets [list {wallypipelinedsoc/core/lsu/MemRWM[0]} {wallypipelinedsoc/core/lsu/MemRWM[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 64 [get_debug_ports u_ila_0/probe5]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
||||
connect_debug_port u_ila_0/probe5 [get_nets [list {wallypipelinedsoc/core/lsu/IEUAdrM[0]} {wallypipelinedsoc/core/lsu/IEUAdrM[1]} {wallypipelinedsoc/core/lsu/IEUAdrM[2]} {wallypipelinedsoc/core/lsu/IEUAdrM[3]} {wallypipelinedsoc/core/lsu/IEUAdrM[4]} {wallypipelinedsoc/core/lsu/IEUAdrM[5]} {wallypipelinedsoc/core/lsu/IEUAdrM[6]} {wallypipelinedsoc/core/lsu/IEUAdrM[7]} {wallypipelinedsoc/core/lsu/IEUAdrM[8]} {wallypipelinedsoc/core/lsu/IEUAdrM[9]} {wallypipelinedsoc/core/lsu/IEUAdrM[10]} {wallypipelinedsoc/core/lsu/IEUAdrM[11]} {wallypipelinedsoc/core/lsu/IEUAdrM[12]} {wallypipelinedsoc/core/lsu/IEUAdrM[13]} {wallypipelinedsoc/core/lsu/IEUAdrM[14]} {wallypipelinedsoc/core/lsu/IEUAdrM[15]} {wallypipelinedsoc/core/lsu/IEUAdrM[16]} {wallypipelinedsoc/core/lsu/IEUAdrM[17]} {wallypipelinedsoc/core/lsu/IEUAdrM[18]} {wallypipelinedsoc/core/lsu/IEUAdrM[19]} {wallypipelinedsoc/core/lsu/IEUAdrM[20]} {wallypipelinedsoc/core/lsu/IEUAdrM[21]} {wallypipelinedsoc/core/lsu/IEUAdrM[22]} {wallypipelinedsoc/core/lsu/IEUAdrM[23]} {wallypipelinedsoc/core/lsu/IEUAdrM[24]} {wallypipelinedsoc/core/lsu/IEUAdrM[25]} {wallypipelinedsoc/core/lsu/IEUAdrM[26]} {wallypipelinedsoc/core/lsu/IEUAdrM[27]} {wallypipelinedsoc/core/lsu/IEUAdrM[28]} {wallypipelinedsoc/core/lsu/IEUAdrM[29]} {wallypipelinedsoc/core/lsu/IEUAdrM[30]} {wallypipelinedsoc/core/lsu/IEUAdrM[31]} {wallypipelinedsoc/core/lsu/IEUAdrM[32]} {wallypipelinedsoc/core/lsu/IEUAdrM[33]} {wallypipelinedsoc/core/lsu/IEUAdrM[34]} {wallypipelinedsoc/core/lsu/IEUAdrM[35]} {wallypipelinedsoc/core/lsu/IEUAdrM[36]} {wallypipelinedsoc/core/lsu/IEUAdrM[37]} {wallypipelinedsoc/core/lsu/IEUAdrM[38]} {wallypipelinedsoc/core/lsu/IEUAdrM[39]} {wallypipelinedsoc/core/lsu/IEUAdrM[40]} {wallypipelinedsoc/core/lsu/IEUAdrM[41]} {wallypipelinedsoc/core/lsu/IEUAdrM[42]} {wallypipelinedsoc/core/lsu/IEUAdrM[43]} {wallypipelinedsoc/core/lsu/IEUAdrM[44]} {wallypipelinedsoc/core/lsu/IEUAdrM[45]} {wallypipelinedsoc/core/lsu/IEUAdrM[46]} {wallypipelinedsoc/core/lsu/IEUAdrM[47]} {wallypipelinedsoc/core/lsu/IEUAdrM[48]} {wallypipelinedsoc/core/lsu/IEUAdrM[49]} {wallypipelinedsoc/core/lsu/IEUAdrM[50]} {wallypipelinedsoc/core/lsu/IEUAdrM[51]} {wallypipelinedsoc/core/lsu/IEUAdrM[52]} {wallypipelinedsoc/core/lsu/IEUAdrM[53]} {wallypipelinedsoc/core/lsu/IEUAdrM[54]} {wallypipelinedsoc/core/lsu/IEUAdrM[55]} {wallypipelinedsoc/core/lsu/IEUAdrM[56]} {wallypipelinedsoc/core/lsu/IEUAdrM[57]} {wallypipelinedsoc/core/lsu/IEUAdrM[58]} {wallypipelinedsoc/core/lsu/IEUAdrM[59]} {wallypipelinedsoc/core/lsu/IEUAdrM[60]} {wallypipelinedsoc/core/lsu/IEUAdrM[61]} {wallypipelinedsoc/core/lsu/IEUAdrM[62]} {wallypipelinedsoc/core/lsu/IEUAdrM[63]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe6]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
||||
connect_debug_port u_ila_0/probe6 [get_nets [list {wallypipelinedsoc/core/lsu/ReadDataM[0]} {wallypipelinedsoc/core/lsu/ReadDataM[1]} {wallypipelinedsoc/core/lsu/ReadDataM[2]} {wallypipelinedsoc/core/lsu/ReadDataM[3]} {wallypipelinedsoc/core/lsu/ReadDataM[4]} {wallypipelinedsoc/core/lsu/ReadDataM[5]} {wallypipelinedsoc/core/lsu/ReadDataM[6]} {wallypipelinedsoc/core/lsu/ReadDataM[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 8 [get_debug_ports u_ila_0/probe7]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
||||
connect_debug_port u_ila_0/probe7 [get_nets [list {wallypipelinedsoc/core/lsu/WriteDataM[0]} {wallypipelinedsoc/core/lsu/WriteDataM[1]} {wallypipelinedsoc/core/lsu/WriteDataM[2]} {wallypipelinedsoc/core/lsu/WriteDataM[3]} {wallypipelinedsoc/core/lsu/WriteDataM[4]} {wallypipelinedsoc/core/lsu/WriteDataM[5]} {wallypipelinedsoc/core/lsu/WriteDataM[6]} {wallypipelinedsoc/core/lsu/WriteDataM[7]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe8]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
||||
connect_debug_port u_ila_0/probe8 [get_nets [list {wallypipelinedsoc/core/priv.priv/csr/csri/MExtInt}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe9]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
||||
connect_debug_port u_ila_0/probe9 [get_nets [list {wallypipelinedsoc/core/priv.priv/csr/csri/SExtInt} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe10]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
||||
connect_debug_port u_ila_0/probe10 [get_nets [list {wallypipelinedsoc/core/priv.priv/pmd/wfiM} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe11]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
||||
connect_debug_port u_ila_0/probe11 [get_nets [list {wallypipelinedsoc/core/priv.priv/pmd/wfiW} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe12]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
||||
connect_debug_port u_ila_0/probe12 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/INTR ]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe13]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
||||
connect_debug_port u_ila_0/probe13 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifohead[3]}]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe14]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
||||
connect_debug_port u_ila_0/probe14 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txsrfull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe15]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
||||
connect_debug_port u_ila_0/probe15 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txhrfull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe16]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
||||
connect_debug_port u_ila_0/probe16 [get_nets [list wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/RXRDYb ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe17]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
||||
connect_debug_port u_ila_0/probe17 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifofull}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe18]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
||||
connect_debug_port u_ila_0/probe18 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifoempty}]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe19]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
||||
connect_debug_port u_ila_0/probe19 [get_nets [list {wallypipelinedsoc/core/priv.priv/pmd/WFITimeoutM} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 12 [get_debug_ports u_ila_0/probe20]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
||||
connect_debug_port u_ila_0/probe20 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[1]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[2]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[3]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[4]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[5]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[6]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[7]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[8]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[9]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[10]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[11]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/requests[12]}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe21]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
||||
connect_debug_port u_ila_0/probe21 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/IER[3]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 12 [get_debug_ports u_ila_0/probe22]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
||||
connect_debug_port u_ila_0/probe22 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[1]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[2]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[3]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[4]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[5]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[6]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[7]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[8]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[9]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[10]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[11]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress[12]}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 12 [get_debug_ports u_ila_0/probe23]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
||||
connect_debug_port u_ila_0/probe23 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[1]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[2]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[3]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[4]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[5]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[6]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[7]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[8]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[9]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[10]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[11]} {wallypipelinedsoc/uncoregen.uncore/plic.plic/intPending[12]}]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe24]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
||||
connect_debug_port u_ila_0/probe24 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txstate[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txstate[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe25]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe25]
|
||||
connect_debug_port u_ila_0/probe25 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxdataready} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe26]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe26]
|
||||
connect_debug_port u_ila_0/probe26 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/txfifotail[3]}]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 2 [get_debug_ports u_ila_0/probe27]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe27]
|
||||
connect_debug_port u_ila_0/probe27 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxstate[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxstate[1]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 4 [get_debug_ports u_ila_0/probe28]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe28]
|
||||
connect_debug_port u_ila_0/probe28 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[2]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifoentries[3]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 3 [get_debug_ports u_ila_0/probe29]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe29]
|
||||
connect_debug_port u_ila_0/probe29 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[0]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[1]} {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/intrID[2]} ]]
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe30]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe30]
|
||||
connect_debug_port u_ila_0/probe30 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/rxfifotriggered} ]]
|
||||
|
||||
|
||||
create_debug_port u_ila_0 probe
|
||||
set_property port_width 1 [get_debug_ports u_ila_0/probe31]
|
||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe31]
|
||||
connect_debug_port u_ila_0/probe31 [get_nets [list {wallypipelinedsoc/uncoregen.uncore/uartgen.uart/uartPC/fifoenabled} ]]
|
||||
|
||||
|
||||
|
||||
|
||||
# the debug hub has issues with the clocks from the mmcm so lets give up an connect to the 100Mhz input clock.
|
||||
#connect_debug_port dbg_hub/clk [get_nets default_100mhz_clk]
|
||||
connect_debug_port dbg_hub/clk [get_nets CPUCLK]
|
32
fpga/generator/debug/plic.tsm
Normal file
32
fpga/generator/debug/plic.tsm
Normal file
@ -0,0 +1,32 @@
|
||||
##################################################
|
||||
#
|
||||
# For info on creating trigger state machines:
|
||||
# 1) In the main Vivado menu bar, select
|
||||
# Window > Language Templates
|
||||
# 2) In the Templates window, select
|
||||
# Debug > Trigger State Machine
|
||||
# 3) Refer to the entry 'Info' for an overview
|
||||
# of the trigger state machine language.
|
||||
#
|
||||
# More information can be found in this document:
|
||||
#
|
||||
# Vivado Design Suite User Guide: Programming
|
||||
# and Debugging (UG908)
|
||||
#
|
||||
##################################################
|
||||
state state_reset:
|
||||
if(wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress == 12'h200) then
|
||||
goto state_1;
|
||||
else
|
||||
goto state_reset;
|
||||
endif
|
||||
|
||||
state state_1:
|
||||
if(wallypipelinedsoc/uncoregen.uncore/plic.plic/intInProgress == 12'h000) then
|
||||
goto state_trigger;
|
||||
else
|
||||
goto state_1;
|
||||
endif
|
||||
|
||||
state state_trigger:
|
||||
trigger;
|
@ -98,7 +98,7 @@ write_verilog -force -mode funcsim sim/syn-funcsim.v
|
||||
if {$board=="ArtyA7"} {
|
||||
#source ../constraints/small-debug.xdc
|
||||
#source ../constraints/small-debug-rvvi.xdc
|
||||
#source ../constraints/small-debug-spi.xdc
|
||||
source ../constraints/small-debug-wfi.xdc
|
||||
} else {
|
||||
#source ../constraints/vcu-small-debug.xdc
|
||||
#source ../constraints/small-debug.xdc
|
||||
|
@ -1,669 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//// ////
|
||||
//// Copyright (C) 2013-2022 Authors ////
|
||||
//// ////
|
||||
//// Based on original work by ////
|
||||
//// Adam Edvardsson (adam.edvardsson@orsoc.se) ////
|
||||
//// ////
|
||||
//// Copyright (C) 2009 Authors ////
|
||||
//// ////
|
||||
//// This source file may be used and distributed without ////
|
||||
//// restriction provided that this copyright statement is not ////
|
||||
//// removed from the file and that any derivative work contains ////
|
||||
//// the original copyright notice and the associated disclaimer. ////
|
||||
//// ////
|
||||
//// This source file is free software; you can redistribute it ////
|
||||
//// and/or modify it under the terms of the GNU Lesser General ////
|
||||
//// Public License as published by the Free Software Foundation; ////
|
||||
//// either version 2.1 of the License, or (at your option) any ////
|
||||
//// later version. ////
|
||||
//// ////
|
||||
//// This source is distributed in the hope that it will be ////
|
||||
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
|
||||
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
|
||||
//// PURPOSE. See the GNU Lesser General Public License for more ////
|
||||
//// details. ////
|
||||
//// ////
|
||||
//// You should have received a copy of the GNU Lesser General ////
|
||||
//// Public License along with this source; if not, download it ////
|
||||
//// from https://www.gnu.org/licenses/ ////
|
||||
//// ////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
module sdc_controller #(
|
||||
parameter dma_addr_bits = 32,
|
||||
parameter fifo_addr_bits = 7,
|
||||
parameter sdio_card_detect_level = 1,
|
||||
parameter voltage_controll_reg = 3300,
|
||||
parameter capabilies_reg = 16'b0000_0000_0000_0011
|
||||
) (
|
||||
input wire async_resetn,
|
||||
|
||||
(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 clock CLK" *)
|
||||
(* X_INTERFACE_PARAMETER = "ASSOCIATED_BUSIF M_AXI:S_AXI_LITE, FREQ_HZ 100000000" *)
|
||||
input wire clock,
|
||||
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE AWADDR" *)
|
||||
(* X_INTERFACE_PARAMETER = "CLK_DOMAIN clock, ID_WIDTH 0, PROTOCOL AXI4LITE, DATA_WIDTH 32" *)
|
||||
input wire [15:0] s_axi_awaddr,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE AWVALID" *)
|
||||
input wire s_axi_awvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE AWREADY" *)
|
||||
output wire s_axi_awready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE WDATA" *)
|
||||
input wire [31:0] s_axi_wdata,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE WVALID" *)
|
||||
input wire s_axi_wvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE WREADY" *)
|
||||
output wire s_axi_wready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE BRESP" *)
|
||||
output reg [1:0] s_axi_bresp,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE BVALID" *)
|
||||
output reg s_axi_bvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE BREADY" *)
|
||||
input wire s_axi_bready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE ARADDR" *)
|
||||
input wire [15:0] s_axi_araddr,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE ARVALID" *)
|
||||
input wire s_axi_arvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE ARREADY" *)
|
||||
output wire s_axi_arready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE RDATA" *)
|
||||
output reg [31:0] s_axi_rdata,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE RRESP" *)
|
||||
output reg [1:0] s_axi_rresp,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE RVALID" *)
|
||||
output reg s_axi_rvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI_LITE RREADY" *)
|
||||
input wire s_axi_rready,
|
||||
|
||||
(* X_INTERFACE_PARAMETER = "CLK_DOMAIN clock, ID_WIDTH 0, PROTOCOL AXI4, DATA_WIDTH 32" *)
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI AWADDR" *)
|
||||
output reg [dma_addr_bits-1:0] m_axi_awaddr,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI AWLEN" *)
|
||||
output reg [7:0] m_axi_awlen,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI AWVALID" *)
|
||||
output reg m_axi_awvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI AWREADY" *)
|
||||
input wire m_axi_awready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI WDATA" *)
|
||||
output wire [31:0] m_axi_wdata,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI WLAST" *)
|
||||
output reg m_axi_wlast,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI WVALID" *)
|
||||
output reg m_axi_wvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI WREADY" *)
|
||||
input wire m_axi_wready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI BRESP" *)
|
||||
input wire [1:0] m_axi_bresp,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI BVALID" *)
|
||||
input wire m_axi_bvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI BREADY" *)
|
||||
output wire m_axi_bready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI ARADDR" *)
|
||||
output reg [dma_addr_bits-1:0] m_axi_araddr,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI ARLEN" *)
|
||||
output reg [7:0] m_axi_arlen,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI ARVALID" *)
|
||||
output reg m_axi_arvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI ARREADY" *)
|
||||
input wire m_axi_arready,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI RDATA" *)
|
||||
input wire [31:0] m_axi_rdata,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI RLAST" *)
|
||||
input wire m_axi_rlast,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI RRESP" *)
|
||||
input wire [1:0] m_axi_rresp,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI RVALID" *)
|
||||
input wire m_axi_rvalid,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI RREADY" *)
|
||||
output wire m_axi_rready,
|
||||
|
||||
// SD BUS
|
||||
//inout wire sdio_cmd,
|
||||
//inout wire [3:0] sdio_dat,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 sdio_clk CLK" *)
|
||||
(* X_INTERFACE_PARAMETER = "FREQ_HZ 50000000" *)
|
||||
output reg sdio_clk,
|
||||
(* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 sdio_reset RST" *)
|
||||
(* X_INTERFACE_PARAMETER = "POLARITY ACTIVE_HIGH" *)
|
||||
output reg sdio_reset,
|
||||
input wire sdio_cd,
|
||||
|
||||
output reg sd_dat_reg_t,
|
||||
output reg [3:0] sd_dat_reg_o,
|
||||
input wire [3:0] sd_dat_i,
|
||||
|
||||
output reg sd_cmd_reg_t,
|
||||
output reg sd_cmd_reg_o,
|
||||
input wire sd_cmd_i,
|
||||
|
||||
// Interrupts
|
||||
output wire interrupt
|
||||
);
|
||||
|
||||
`include "sd_defines.h"
|
||||
|
||||
wire reset;
|
||||
|
||||
wire go_idle;
|
||||
reg cmd_start;
|
||||
wire [1:0] cmd_setting;
|
||||
wire cmd_start_tx;
|
||||
wire [39:0] cmd;
|
||||
wire [119:0] cmd_response;
|
||||
wire cmd_crc_ok;
|
||||
wire cmd_index_ok;
|
||||
wire cmd_finish;
|
||||
|
||||
wire d_write;
|
||||
wire d_read;
|
||||
wire [31:0] data_in_rx_fifo;
|
||||
wire en_tx_fifo;
|
||||
wire en_rx_fifo;
|
||||
wire sd_data_busy;
|
||||
(* mark_debug = "true" *) wire data_busy;
|
||||
wire data_crc_ok;
|
||||
wire tx_fifo_re;
|
||||
wire rx_fifo_we;
|
||||
|
||||
reg data_start_rx;
|
||||
reg data_start_tx;
|
||||
reg data_prepare_tx;
|
||||
reg cmd_int_rst;
|
||||
reg data_int_rst;
|
||||
reg ctrl_rst;
|
||||
|
||||
// AXI accessible registers
|
||||
(* mark_debug = "true" *) reg [31:0] argument_reg;
|
||||
(* mark_debug = "true" *) reg [`CMD_REG_SIZE-1:0] command_reg;
|
||||
(* mark_debug = "true" *) reg [`CMD_TIMEOUT_W-1:0] cmd_timeout_reg;
|
||||
(* mark_debug = "true" *) reg [`DATA_TIMEOUT_W-1:0] data_timeout_reg;
|
||||
(* mark_debug = "true" *) reg [0:0] software_reset_reg;
|
||||
(* mark_debug = "true" *) wire [31:0] response_0_reg;
|
||||
(* mark_debug = "true" *) wire [31:0] response_1_reg;
|
||||
(* mark_debug = "true" *) wire [31:0] response_2_reg;
|
||||
(* mark_debug = "true" *) wire [31:0] response_3_reg;
|
||||
(* mark_debug = "true" *) reg [`BLKSIZE_W-1:0] block_size_reg;
|
||||
(* mark_debug = "true" *) reg [1:0] controller_setting_reg;
|
||||
(* mark_debug = "true" *) wire [`INT_CMD_SIZE-1:0] cmd_int_status_reg;
|
||||
(* mark_debug = "true" *) wire [`INT_DATA_SIZE-1:0] data_int_status_reg;
|
||||
(* mark_debug = "true" *) wire [`INT_DATA_SIZE-1:0] data_int_status;
|
||||
(* mark_debug = "true" *) reg [`INT_CMD_SIZE-1:0] cmd_int_enable_reg;
|
||||
(* mark_debug = "true" *) reg [`INT_DATA_SIZE-1:0] data_int_enable_reg;
|
||||
(* mark_debug = "true" *) reg [`BLKCNT_W-1:0] block_count_reg;
|
||||
(* mark_debug = "true" *) reg [dma_addr_bits-1:0] dma_addr_reg;
|
||||
(* mark_debug = "true" *) reg [7:0] clock_divider_reg = 124; // 400KHz
|
||||
|
||||
// ------ Clocks and resets
|
||||
|
||||
(* ASYNC_REG="true" *)
|
||||
reg [2:0] reset_sync;
|
||||
assign reset = reset_sync[2];
|
||||
|
||||
always @(posedge clock)
|
||||
reset_sync <= {reset_sync[1:0], !async_resetn};
|
||||
|
||||
reg [7:0] clock_cnt;
|
||||
(* mark_debug = "true" *) reg clock_state;
|
||||
(* mark_debug = "true" *) reg clock_posedge;
|
||||
reg clock_data_in;
|
||||
wire fifo_almost_full;
|
||||
wire fifo_almost_empty;
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
clock_posedge <= 0;
|
||||
clock_data_in <= 0;
|
||||
clock_state <= 0;
|
||||
clock_cnt <= 0;
|
||||
end else if (clock_cnt < clock_divider_reg) begin
|
||||
clock_posedge <= 0;
|
||||
clock_data_in <= 0;
|
||||
clock_cnt <= clock_cnt + 1;
|
||||
end else if (clock_cnt < 124 && data_busy && en_rx_fifo && fifo_almost_full) begin
|
||||
// Prevent Rx FIFO overflow
|
||||
clock_posedge <= 0;
|
||||
clock_data_in <= 0;
|
||||
clock_cnt <= clock_cnt + 1;
|
||||
end else if (clock_cnt < 124 && data_busy && en_tx_fifo && fifo_almost_empty) begin
|
||||
// Prevent Tx FIFO underflow
|
||||
clock_posedge <= 0;
|
||||
clock_data_in <= 0;
|
||||
clock_cnt <= clock_cnt + 1;
|
||||
end else begin
|
||||
clock_state <= !clock_state;
|
||||
clock_posedge <= !clock_state;
|
||||
if (clock_divider_reg == 0)
|
||||
clock_data_in <= !clock_state;
|
||||
else
|
||||
clock_data_in <= clock_state;
|
||||
clock_cnt <= 0;
|
||||
end
|
||||
sdio_clk <= sdio_reset || clock_state;
|
||||
|
||||
if (reset) sdio_reset <= 0;
|
||||
else if (clock_posedge) sdio_reset <= controller_setting_reg[1];
|
||||
end
|
||||
|
||||
// ------ SD IO Buffers
|
||||
|
||||
// wire sd_cmd_i;
|
||||
wire sd_cmd_o;
|
||||
wire sd_cmd_oe;
|
||||
// reg sd_cmd_reg_o;
|
||||
// reg sd_cmd_reg_t;
|
||||
// wire [3:0] sd_dat_i;
|
||||
wire [3:0] sd_dat_o;
|
||||
wire sd_dat_oe;
|
||||
// reg [3:0] sd_dat_reg_o;
|
||||
// reg sd_dat_reg_t;
|
||||
|
||||
// IOBUF IOBUF_cmd (.O(sd_cmd_i), .IO(sdio_cmd), .I(sd_cmd_reg_o), .T(sd_cmd_reg_t));
|
||||
// IOBUF IOBUF_dat0 (.O(sd_dat_i[0]), .IO(sdio_dat[0]), .I(sd_dat_reg_o[0]), .T(sd_dat_reg_t));
|
||||
// IOBUF IOBUF_dat1 (.O(sd_dat_i[1]), .IO(sdio_dat[1]), .I(sd_dat_reg_o[1]), .T(sd_dat_reg_t));
|
||||
// IOBUF IOBUF_dat2 (.O(sd_dat_i[2]), .IO(sdio_dat[2]), .I(sd_dat_reg_o[2]), .T(sd_dat_reg_t));
|
||||
// IOBUF IOBUF_dat3 (.O(sd_dat_i[3]), .IO(sdio_dat[3]), .I(sd_dat_reg_o[3]), .T(sd_dat_reg_t));
|
||||
|
||||
always @(negedge sdio_clk) begin
|
||||
// Output data delayed by 1/2 clock cycle (5ns) to ensure
|
||||
// required hold time: default speed - min 5ns, high speed - min 2ns (actual 5ns)
|
||||
if (sdio_reset) begin
|
||||
sd_cmd_reg_o <= 0;
|
||||
sd_dat_reg_o <= 0;
|
||||
sd_cmd_reg_t <= 0;
|
||||
sd_dat_reg_t <= 0;
|
||||
end else begin
|
||||
sd_cmd_reg_o <= sd_cmd_o;
|
||||
sd_dat_reg_o <= sd_dat_o;
|
||||
sd_cmd_reg_t <= !sd_cmd_oe;
|
||||
sd_dat_reg_t <= !(sd_dat_oe || (cmd_start_tx && (command_reg == 0)));
|
||||
end
|
||||
end
|
||||
|
||||
// ------ SD card detect
|
||||
|
||||
reg [25:0] sd_detect_cnt;
|
||||
wire sd_insert_int = sd_detect_cnt[25];
|
||||
wire sd_remove_int = !sd_detect_cnt[25];
|
||||
reg sd_insert_ie;
|
||||
reg sd_remove_ie;
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (sdio_cd != sdio_card_detect_level) begin
|
||||
sd_detect_cnt <= 0;
|
||||
end else if (!sd_insert_int) begin
|
||||
sd_detect_cnt <= sd_detect_cnt + 1;
|
||||
end
|
||||
end
|
||||
|
||||
// ------ AXI Slave Interface
|
||||
|
||||
reg [15:0] read_addr;
|
||||
reg [15:0] write_addr;
|
||||
reg [31:0] write_data;
|
||||
reg rd_req;
|
||||
reg [1:0] wr_req;
|
||||
|
||||
assign s_axi_arready = !rd_req && !s_axi_rvalid;
|
||||
assign s_axi_awready = !wr_req[0] && !s_axi_bvalid;
|
||||
assign s_axi_wready = !wr_req[1] && !s_axi_bvalid;
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset) begin
|
||||
s_axi_rdata <= 0;
|
||||
s_axi_rresp <= 0;
|
||||
s_axi_rvalid <= 0;
|
||||
s_axi_bresp <= 0;
|
||||
s_axi_bvalid <= 0;
|
||||
rd_req <= 0;
|
||||
wr_req <= 0;
|
||||
read_addr <= 0;
|
||||
write_addr <= 0;
|
||||
write_data <= 0;
|
||||
cmd_start <= 0;
|
||||
data_int_rst <= 0;
|
||||
cmd_int_rst <= 0;
|
||||
ctrl_rst <= 0;
|
||||
argument_reg <= 0;
|
||||
command_reg <= 0;
|
||||
cmd_timeout_reg <= 0;
|
||||
data_timeout_reg <= 0;
|
||||
block_size_reg <= `RESET_BLOCK_SIZE;
|
||||
controller_setting_reg <= 0;
|
||||
cmd_int_enable_reg <= 0;
|
||||
data_int_enable_reg <= 0;
|
||||
software_reset_reg <= 0;
|
||||
clock_divider_reg <= `RESET_CLOCK_DIV;
|
||||
block_count_reg <= 0;
|
||||
sd_insert_ie <= 0;
|
||||
sd_remove_ie <= 0;
|
||||
dma_addr_reg <= 0;
|
||||
end else begin
|
||||
if (clock_posedge) begin
|
||||
cmd_start <= 0;
|
||||
data_int_rst <= 0;
|
||||
cmd_int_rst <= 0;
|
||||
ctrl_rst <= software_reset_reg[0];
|
||||
end
|
||||
if (s_axi_arready && s_axi_arvalid) begin
|
||||
read_addr <= s_axi_araddr;
|
||||
rd_req <= 1;
|
||||
end
|
||||
if (s_axi_rvalid && s_axi_rready) begin
|
||||
s_axi_rvalid <= 0;
|
||||
end else if (!s_axi_rvalid && rd_req) begin
|
||||
s_axi_rdata <= 0;
|
||||
if (read_addr[15:8] == 0) begin
|
||||
case (read_addr[7:0])
|
||||
`argument : s_axi_rdata <= argument_reg;
|
||||
`command : s_axi_rdata <= command_reg;
|
||||
`resp0 : s_axi_rdata <= response_0_reg;
|
||||
`resp1 : s_axi_rdata <= response_1_reg;
|
||||
`resp2 : s_axi_rdata <= response_2_reg;
|
||||
`resp3 : s_axi_rdata <= response_3_reg;
|
||||
`controller : s_axi_rdata <= controller_setting_reg;
|
||||
`blksize : s_axi_rdata <= block_size_reg;
|
||||
`voltage : s_axi_rdata <= voltage_controll_reg;
|
||||
`capa : s_axi_rdata <= capabilies_reg | (dma_addr_bits << 8);
|
||||
`clock_d : s_axi_rdata <= clock_divider_reg;
|
||||
`reset : s_axi_rdata <= { cmd_start, data_int_rst, cmd_int_rst, ctrl_rst };
|
||||
`cmd_timeout : s_axi_rdata <= cmd_timeout_reg;
|
||||
`data_timeout : s_axi_rdata <= data_timeout_reg;
|
||||
`cmd_isr : s_axi_rdata <= cmd_int_status_reg;
|
||||
`cmd_iser : s_axi_rdata <= cmd_int_enable_reg;
|
||||
`data_isr : s_axi_rdata <= data_int_status_reg;
|
||||
`data_iser : s_axi_rdata <= data_int_enable_reg;
|
||||
`blkcnt : s_axi_rdata <= block_count_reg;
|
||||
`card_detect : s_axi_rdata <= { sd_remove_int, sd_remove_ie, sd_insert_int, sd_insert_ie };
|
||||
`dst_src_addr : s_axi_rdata <= dma_addr_reg[31:0];
|
||||
`dst_src_addr_high : if (dma_addr_bits > 32) s_axi_rdata <= dma_addr_reg[dma_addr_bits-1:32];
|
||||
endcase
|
||||
end
|
||||
s_axi_rresp <= 0;
|
||||
s_axi_rvalid <= 1;
|
||||
rd_req <= 0;
|
||||
end
|
||||
if (s_axi_awready && s_axi_awvalid) begin
|
||||
write_addr <= s_axi_awaddr;
|
||||
wr_req[0] <= 1;
|
||||
end
|
||||
if (s_axi_wready && s_axi_wvalid) begin
|
||||
write_data <= s_axi_wdata;
|
||||
wr_req[1] <= 1;
|
||||
end
|
||||
if (s_axi_bvalid && s_axi_bready) begin
|
||||
s_axi_bvalid <= 0;
|
||||
end else if (!s_axi_bvalid && wr_req == 2'b11) begin
|
||||
if (write_addr[15:8] == 0) begin
|
||||
case (write_addr[7:0])
|
||||
`argument : begin argument_reg <= write_data; cmd_start <= 1; end
|
||||
`command : command_reg <= write_data;
|
||||
`reset : software_reset_reg <= write_data;
|
||||
`cmd_timeout : cmd_timeout_reg <= write_data;
|
||||
`data_timeout : data_timeout_reg <= write_data;
|
||||
`blksize : block_size_reg <= write_data;
|
||||
`controller : controller_setting_reg <= write_data;
|
||||
`cmd_isr : cmd_int_rst <= 1;
|
||||
`cmd_iser : cmd_int_enable_reg <= write_data;
|
||||
`clock_d : clock_divider_reg <= write_data;
|
||||
`data_isr : data_int_rst <= 1;
|
||||
`data_iser : data_int_enable_reg <= write_data;
|
||||
`blkcnt : block_count_reg <= write_data;
|
||||
`card_detect : begin sd_remove_ie <= write_data[2]; sd_insert_ie <= write_data[0]; end
|
||||
`dst_src_addr : dma_addr_reg[31:0] <= write_data;
|
||||
`dst_src_addr_high : if (dma_addr_bits > 32) dma_addr_reg[dma_addr_bits-1:32] <= write_data;
|
||||
endcase
|
||||
end
|
||||
s_axi_bresp <= 0;
|
||||
s_axi_bvalid <= 1;
|
||||
wr_req <= 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// ------ Data FIFO
|
||||
|
||||
reg [31:0] fifo_mem [(1<<fifo_addr_bits)-1:0];
|
||||
reg [fifo_addr_bits-1:0] fifo_inp_pos;
|
||||
reg [fifo_addr_bits-1:0] fifo_out_pos;
|
||||
wire [fifo_addr_bits-1:0] fifo_inp_nxt = fifo_inp_pos + 1;
|
||||
wire [fifo_addr_bits-1:0] fifo_out_nxt = fifo_out_pos + 1;
|
||||
wire [fifo_addr_bits-1:0] fifo_data_len = fifo_inp_pos - fifo_out_pos;
|
||||
wire [fifo_addr_bits-1:0] fifo_free_len = fifo_out_pos - fifo_inp_nxt;
|
||||
wire fifo_full = fifo_inp_nxt == fifo_out_pos;
|
||||
wire fifo_empty = fifo_inp_pos == fifo_out_pos;
|
||||
wire fifo_ready = fifo_data_len >= (1 << fifo_addr_bits) / 2;
|
||||
wire [31:0] fifo_din = en_rx_fifo ? data_in_rx_fifo : m_bus_dat_i;
|
||||
wire fifo_we = en_rx_fifo ? rx_fifo_we && clock_posedge : m_axi_rready && m_axi_rvalid;
|
||||
wire fifo_re = en_rx_fifo ? m_axi_wready && m_axi_wvalid : tx_fifo_re && clock_posedge;
|
||||
reg [31:0] fifo_dout;
|
||||
|
||||
assign fifo_almost_full = fifo_data_len > (1 << fifo_addr_bits) * 3 / 4;
|
||||
assign fifo_almost_empty = fifo_free_len > (1 << fifo_addr_bits) * 3 / 4;
|
||||
|
||||
wire tx_stb = en_tx_fifo && fifo_free_len >= (1 << fifo_addr_bits) / 3;
|
||||
wire rx_stb = en_rx_fifo && m_axi_bresp_cnt != 3'b111 && (fifo_data_len >= (1 << fifo_addr_bits) / 3 || (!fifo_empty && !data_busy));
|
||||
|
||||
always @(posedge clock)
|
||||
if (reset || ctrl_rst || !(en_rx_fifo || en_tx_fifo)) begin
|
||||
fifo_inp_pos <= 0;
|
||||
fifo_out_pos <= 0;
|
||||
end else begin
|
||||
if (fifo_we && !fifo_full) begin
|
||||
fifo_mem[fifo_inp_pos] <= fifo_din;
|
||||
fifo_inp_pos <= fifo_inp_nxt;
|
||||
if (fifo_empty) fifo_dout <= fifo_din;
|
||||
end
|
||||
if (fifo_re && !fifo_empty) begin
|
||||
if (fifo_we && !fifo_full && fifo_out_nxt == fifo_inp_pos) fifo_dout <= fifo_din;
|
||||
else fifo_dout <= fifo_mem[fifo_out_nxt];
|
||||
fifo_out_pos <= fifo_out_nxt;
|
||||
end
|
||||
end
|
||||
|
||||
// ------ AXI Master Interface
|
||||
|
||||
// AXI transaction (DDR access) is over 80 clock cycles
|
||||
// Must use burst to achive required throughput
|
||||
|
||||
reg m_axi_cyc;
|
||||
wire m_axi_write = en_rx_fifo;
|
||||
reg [7:0] m_axi_wcnt;
|
||||
reg [dma_addr_bits-1:2] m_bus_adr_o;
|
||||
wire [31:0] m_bus_dat_i;
|
||||
reg [2:0] m_axi_bresp_cnt;
|
||||
reg m_bus_error;
|
||||
|
||||
assign m_axi_bready = m_axi_bresp_cnt != 0;
|
||||
assign m_axi_rready = m_axi_cyc & !m_axi_write;
|
||||
assign m_bus_dat_i = {m_axi_rdata[7:0],m_axi_rdata[15:8],m_axi_rdata[23:16],m_axi_rdata[31:24]};
|
||||
assign m_axi_wdata = {fifo_dout[7:0],fifo_dout[15:8],fifo_dout[23:16],fifo_dout[31:24]};
|
||||
|
||||
// AXI burst cannot cross a 4KB boundary
|
||||
wire [fifo_addr_bits-1:0] tx_burst_len;
|
||||
wire [fifo_addr_bits-1:0] rx_burst_len;
|
||||
assign tx_burst_len = m_bus_adr_o[11:2] + fifo_free_len >= m_bus_adr_o[11:2] ? fifo_free_len - 1 : ~m_bus_adr_o[fifo_addr_bits+1:2];
|
||||
assign rx_burst_len = m_bus_adr_o[11:2] + fifo_data_len >= m_bus_adr_o[11:2] ? fifo_data_len - 1 : ~m_bus_adr_o[fifo_addr_bits+1:2];
|
||||
|
||||
assign data_int_status_reg = { data_int_status[`INT_DATA_SIZE-1:1],
|
||||
!en_rx_fifo && !en_tx_fifo && !m_axi_cyc && m_axi_bresp_cnt == 0 && data_int_status[0] };
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (reset | ctrl_rst) begin
|
||||
m_axi_arvalid <= 0;
|
||||
m_axi_awvalid <= 0;
|
||||
m_axi_wvalid <= 0;
|
||||
m_axi_cyc <= 0;
|
||||
end else if (m_axi_cyc) begin
|
||||
if (m_axi_awvalid && m_axi_awready) begin
|
||||
m_axi_awvalid <= 0;
|
||||
end
|
||||
if (m_axi_arvalid && m_axi_arready) begin
|
||||
m_axi_arvalid <= 0;
|
||||
end
|
||||
if (m_axi_wvalid && m_axi_wready) begin
|
||||
if (m_axi_wlast) begin
|
||||
m_axi_wvalid <= 0;
|
||||
m_axi_cyc <= 0;
|
||||
end else begin
|
||||
m_axi_wlast <= m_axi_wcnt + 1 == m_axi_awlen;
|
||||
m_axi_wcnt <= m_axi_wcnt + 1;
|
||||
end
|
||||
end
|
||||
if (m_axi_rvalid && m_axi_rready && m_axi_rlast) begin
|
||||
m_axi_cyc <= 0;
|
||||
end
|
||||
end else if (tx_stb || rx_stb) begin
|
||||
m_axi_cyc <= 1;
|
||||
m_axi_wcnt <= 0;
|
||||
if (m_axi_write) begin
|
||||
m_axi_awaddr <= { m_bus_adr_o, 2'b00 };
|
||||
m_axi_awlen <= rx_burst_len < 8'hff ? rx_burst_len : 8'hff;
|
||||
m_axi_wlast <= rx_burst_len == 0;
|
||||
m_axi_awvalid <= 1;
|
||||
m_axi_wvalid <= 1;
|
||||
end else begin
|
||||
m_axi_araddr <= { m_bus_adr_o, 2'b00 };
|
||||
m_axi_arlen <= tx_burst_len < 8'hff ? tx_burst_len : 8'hff;
|
||||
m_axi_arvalid <= 1;
|
||||
end
|
||||
end
|
||||
if (reset | ctrl_rst) begin
|
||||
m_bus_adr_o <= 0;
|
||||
end else if ((m_axi_wready && m_axi_wvalid) || (m_axi_rready && m_axi_rvalid)) begin
|
||||
m_bus_adr_o <= m_bus_adr_o + 1;
|
||||
end else if (!m_axi_cyc && !en_rx_fifo && !en_tx_fifo) begin
|
||||
m_bus_adr_o <= dma_addr_reg[dma_addr_bits-1:2];
|
||||
end
|
||||
if (reset | ctrl_rst) begin
|
||||
m_axi_bresp_cnt <= 0;
|
||||
end else if ((m_axi_awvalid && m_axi_awready) && !(m_axi_bvalid && m_axi_bready)) begin
|
||||
m_axi_bresp_cnt <= m_axi_bresp_cnt + 1;
|
||||
end else if (!(m_axi_awvalid && m_axi_awready) && (m_axi_bvalid && m_axi_bready)) begin
|
||||
m_axi_bresp_cnt <= m_axi_bresp_cnt - 1;
|
||||
end
|
||||
if (reset | ctrl_rst | cmd_start) begin
|
||||
m_bus_error <= 0;
|
||||
end else if (m_axi_bvalid && m_axi_bready && m_axi_bresp) begin
|
||||
m_bus_error <= 1;
|
||||
end else if (m_axi_rvalid && m_axi_rready && m_axi_rresp) begin
|
||||
m_bus_error <= 1;
|
||||
end
|
||||
if (reset | ctrl_rst) begin
|
||||
data_start_tx <= 0;
|
||||
data_start_rx <= 0;
|
||||
data_prepare_tx <= 0;
|
||||
end else if (clock_posedge) begin
|
||||
data_start_tx <= 0;
|
||||
data_start_rx <= 0;
|
||||
if (cmd_start) begin
|
||||
data_prepare_tx <= 0;
|
||||
if (command_reg[`CMD_WITH_DATA] == 2'b01) data_start_rx <= 1;
|
||||
else if (command_reg[`CMD_WITH_DATA] != 2'b00) data_prepare_tx <= 1;
|
||||
end else if (data_prepare_tx) begin
|
||||
if (cmd_int_status_reg[`INT_CMD_CC]) begin
|
||||
data_prepare_tx <= 0;
|
||||
data_start_tx <= 1;
|
||||
end else if (cmd_int_status_reg[`INT_CMD_EI]) begin
|
||||
data_prepare_tx <= 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// ------ SD Card Interface
|
||||
|
||||
sd_cmd_master sd_cmd_master0(
|
||||
.clock (clock),
|
||||
.clock_posedge (clock_posedge),
|
||||
.reset (reset | ctrl_rst),
|
||||
.start (cmd_start),
|
||||
.int_status_rst (cmd_int_rst),
|
||||
.setting (cmd_setting),
|
||||
.start_xfr (cmd_start_tx),
|
||||
.go_idle (go_idle),
|
||||
.cmd (cmd),
|
||||
.response (cmd_response),
|
||||
.crc_error (!cmd_crc_ok),
|
||||
.index_ok (cmd_index_ok),
|
||||
.busy (sd_data_busy),
|
||||
.finish (cmd_finish),
|
||||
.argument (argument_reg),
|
||||
.command (command_reg),
|
||||
.timeout (cmd_timeout_reg),
|
||||
.int_status (cmd_int_status_reg),
|
||||
.response_0 (response_0_reg),
|
||||
.response_1 (response_1_reg),
|
||||
.response_2 (response_2_reg),
|
||||
.response_3 (response_3_reg)
|
||||
);
|
||||
|
||||
sd_cmd_serial_host cmd_serial_host0(
|
||||
.clock (clock),
|
||||
.clock_posedge (clock_posedge),
|
||||
.clock_data_in (clock_data_in),
|
||||
.reset (reset | ctrl_rst | go_idle),
|
||||
.setting (cmd_setting),
|
||||
.cmd (cmd),
|
||||
.start (cmd_start_tx),
|
||||
.finish (cmd_finish),
|
||||
.response (cmd_response),
|
||||
.crc_ok (cmd_crc_ok),
|
||||
.index_ok (cmd_index_ok),
|
||||
.cmd_i (sd_cmd_i),
|
||||
.cmd_o (sd_cmd_o),
|
||||
.cmd_oe (sd_cmd_oe)
|
||||
);
|
||||
|
||||
sd_data_master sd_data_master0(
|
||||
.clock (clock),
|
||||
.clock_posedge (clock_posedge),
|
||||
.reset (reset | ctrl_rst),
|
||||
.start_tx (data_start_tx),
|
||||
.start_rx (data_start_rx),
|
||||
.timeout (data_timeout_reg),
|
||||
.d_write (d_write),
|
||||
.d_read (d_read),
|
||||
.en_tx_fifo (en_tx_fifo),
|
||||
.en_rx_fifo (en_rx_fifo),
|
||||
.fifo_empty (fifo_empty),
|
||||
.fifo_ready (fifo_ready),
|
||||
.fifo_full (fifo_full),
|
||||
.bus_cycle (m_axi_cyc || m_axi_bresp_cnt != 0),
|
||||
.xfr_complete (!data_busy),
|
||||
.crc_error (!data_crc_ok),
|
||||
.bus_error (m_bus_error),
|
||||
.int_status (data_int_status),
|
||||
.int_status_rst (data_int_rst)
|
||||
);
|
||||
|
||||
sd_data_serial_host sd_data_serial_host0(
|
||||
.clock (clock),
|
||||
.clock_posedge (clock_posedge),
|
||||
.clock_data_in (clock_data_in),
|
||||
.reset (reset | ctrl_rst),
|
||||
.data_in (fifo_dout),
|
||||
.rd (tx_fifo_re),
|
||||
.data_out (data_in_rx_fifo),
|
||||
.we (rx_fifo_we),
|
||||
.dat_oe (sd_dat_oe),
|
||||
.dat_o (sd_dat_o),
|
||||
.dat_i (sd_dat_i),
|
||||
.blksize (block_size_reg),
|
||||
.bus_4bit (controller_setting_reg[0]),
|
||||
.blkcnt (block_count_reg),
|
||||
.start ({d_read, d_write}),
|
||||
.byte_alignment (dma_addr_reg[1:0]),
|
||||
.sd_data_busy (sd_data_busy),
|
||||
.busy (data_busy),
|
||||
.crc_ok (data_crc_ok)
|
||||
);
|
||||
|
||||
assign interrupt =
|
||||
|(cmd_int_status_reg & cmd_int_enable_reg) ||
|
||||
|(data_int_status_reg & data_int_enable_reg) ||
|
||||
(sd_insert_int & sd_insert_ie) ||
|
||||
(sd_remove_int & sd_remove_ie);
|
||||
|
||||
endmodule
|
@ -117,8 +117,6 @@ $(TARGET).memfile: $(TARGET)
|
||||
@echo 'Making memory file'
|
||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input $^ --output $@
|
||||
extractFunctionRadix.sh $<.objdump
|
||||
mkdir -p ../../imperas-riscv-tests/work/rv64BP/
|
||||
cp -f $(TARGETDIR)/* ../../imperas-riscv-tests/work/rv64BP/
|
||||
@echo 'Splitting memfile.'
|
||||
./splitfile.sh $@
|
||||
mv boot.mem ../src/boot.mem
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
uint8_t spi_txrx(uint8_t byte) {
|
||||
spi_sendbyte(byte);
|
||||
waittx();
|
||||
waitrx();
|
||||
return spi_readbyte();
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,7 @@ static inline void waittx() {
|
||||
}
|
||||
|
||||
static inline void waitrx() {
|
||||
while(read_reg(SPI_IP) & 2) {}
|
||||
while(!(read_reg(SPI_IP) & 2)) {}
|
||||
}
|
||||
|
||||
static inline uint8_t spi_readbyte() {
|
||||
|
@ -1,21 +1,11 @@
|
||||
BUILDROOT := buildroot
|
||||
IMAGES := ${BUILDROOT}/output/images
|
||||
WALLY := $(shell dirname $(shell pwd))
|
||||
WALLYLINUX := $(shell pwd)
|
||||
WALLYLINUX := $(WALLY)/linux
|
||||
DIS := ${IMAGES}/disassembly
|
||||
BRPACKAGES := $(WALLYLINUX)/buildroot-packages
|
||||
BR2023 := $(WALLYLINUX)/buildroot-config-src/buildroot-2023.05.1
|
||||
BR2_EXTERNAL_TREE := $(WALLYLINUX)/br2-external-tree
|
||||
|
||||
# set sudo if needed depending on $RISCV
|
||||
ifeq ($(shell mkdir -p $(RISCV)/.test > /dev/null 2>&1 ; echo $$?), 0)
|
||||
SUDO :=
|
||||
else
|
||||
SUDO := sudo
|
||||
endif
|
||||
|
||||
# Buildroot Config Stuff
|
||||
WALLYBOARDSRC := $(WALLYLINUX)/buildroot-config-src/wally
|
||||
WALLYBOARD := $(BUILDROOT)/board/wally
|
||||
SUDO := $(shell mkdir -p $(RISCV)/.test > /dev/null 2>&1 || echo sudo)
|
||||
|
||||
# Device tree files
|
||||
DTS ?= $(shell find devicetree -type f -regex ".*\.dts" | sort)
|
||||
@ -105,19 +95,13 @@ $(IMAGES)/busybox:
|
||||
cp $$busyboxDir/busybox $@ ;\
|
||||
|
||||
# Generating new Buildroot directories --------------------------------
|
||||
download: $(WALLYBOARD)
|
||||
cp $(WALLYBOARD)/main.config $(BUILDROOT)/.config
|
||||
download: $(BUILDROOT)
|
||||
$(MAKE) -C $(BUILDROOT) wally_defconfig BR2_EXTERNAL=$(BR2_EXTERNAL_TREE)
|
||||
@echo "Buildroot successfully download."
|
||||
|
||||
# CONFIG DEPENDENCIES 2023.05.1 ---------------------------------------
|
||||
$(WALLYBOARD): $(BUILDROOT)
|
||||
cp -r $(WALLYBOARDSRC) $(BUILDROOT)/board
|
||||
cp $(BR2023)/main.config $(WALLYBOARD)/main.config
|
||||
cp $(BR2023)/linux.config $(WALLYBOARD)/linux.config
|
||||
|
||||
$(BUILDROOT):
|
||||
git clone https://github.com/buildroot/buildroot.git $@
|
||||
cd $@; git checkout 2023.05.x
|
||||
cd $@; git checkout 2024.11.x
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
|
||||
|
2
linux/br2-external-tree/Config.in
Normal file
2
linux/br2-external-tree/Config.in
Normal file
@ -0,0 +1,2 @@
|
||||
# required for buildroot external tree
|
||||
# delibarately empty
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Busybox version: 1.33.1
|
||||
# Thu Jul 15 15:59:54 2021
|
||||
# Busybox version: 1.36.1
|
||||
# Fri Jan 3 15:38:08 2025
|
||||
#
|
||||
CONFIG_HAVE_DOT_CONFIG=y
|
||||
|
||||
@ -93,10 +93,16 @@ CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
|
||||
# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
|
||||
CONFIG_PASSWORD_MINLEN=6
|
||||
CONFIG_MD5_SMALL=1
|
||||
CONFIG_SHA1_SMALL=3
|
||||
CONFIG_SHA1_HWACCEL=y
|
||||
CONFIG_SHA256_HWACCEL=y
|
||||
CONFIG_SHA3_SMALL=1
|
||||
# CONFIG_FEATURE_FAST_TOP is not set
|
||||
# CONFIG_FEATURE_ETC_NETWORKS is not set
|
||||
# CONFIG_FEATURE_ETC_SERVICES is not set
|
||||
# CONFIG_FEATURE_NON_POSIX_CP is not set
|
||||
CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y
|
||||
# CONFIG_FEATURE_USE_SENDFILE is not set
|
||||
CONFIG_FEATURE_COPYBUF_KB=4
|
||||
# CONFIG_MONOTONIC_SYSCALL is not set
|
||||
# CONFIG_IOCTL_HEX2STR_ERROR is not set
|
||||
# CONFIG_FEATURE_EDITING is not set
|
||||
CONFIG_FEATURE_EDITING_MAX_LEN=0
|
||||
# CONFIG_FEATURE_EDITING_VI is not set
|
||||
@ -120,14 +126,9 @@ CONFIG_LAST_SUPPORTED_WCHAR=0
|
||||
# CONFIG_UNICODE_BIDI_SUPPORT is not set
|
||||
# CONFIG_UNICODE_NEUTRAL_TABLE is not set
|
||||
# CONFIG_UNICODE_PRESERVE_BROKEN is not set
|
||||
# CONFIG_FEATURE_NON_POSIX_CP is not set
|
||||
CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y
|
||||
# CONFIG_FEATURE_USE_SENDFILE is not set
|
||||
CONFIG_FEATURE_COPYBUF_KB=4
|
||||
CONFIG_FEATURE_SKIP_ROOTFS=y
|
||||
# CONFIG_MONOTONIC_SYSCALL is not set
|
||||
# CONFIG_IOCTL_HEX2STR_ERROR is not set
|
||||
# CONFIG_FEATURE_HWIB is not set
|
||||
# CONFIG_LOOP_CONFIGURE is not set
|
||||
# CONFIG_NO_LOOP_CONFIGURE is not set
|
||||
CONFIG_TRY_LOOP_CONFIGURE=y
|
||||
|
||||
#
|
||||
# Applets
|
||||
@ -162,6 +163,8 @@ CONFIG_BZIP2_SMALL=0
|
||||
CONFIG_CPIO=y
|
||||
# CONFIG_FEATURE_CPIO_O is not set
|
||||
# CONFIG_FEATURE_CPIO_P is not set
|
||||
# CONFIG_FEATURE_CPIO_IGNORE_DEVNO is not set
|
||||
# CONFIG_FEATURE_CPIO_RENUMBER_INODES is not set
|
||||
# CONFIG_DPKG is not set
|
||||
# CONFIG_DPKG_DEB is not set
|
||||
CONFIG_GZIP=y
|
||||
@ -197,6 +200,22 @@ CONFIG_FEATURE_UNZIP_CDF=y
|
||||
#
|
||||
# Coreutils
|
||||
#
|
||||
CONFIG_FEATURE_VERBOSE=y
|
||||
|
||||
#
|
||||
# Common options for date and touch
|
||||
#
|
||||
# CONFIG_FEATURE_TIMEZONE is not set
|
||||
|
||||
#
|
||||
# Common options for cp and mv
|
||||
#
|
||||
CONFIG_FEATURE_PRESERVE_HARDLINKS=y
|
||||
|
||||
#
|
||||
# Common options for df, du, ls
|
||||
#
|
||||
CONFIG_FEATURE_HUMAN_READABLE=y
|
||||
CONFIG_BASENAME=y
|
||||
CONFIG_CAT=y
|
||||
CONFIG_FEATURE_CATN=y
|
||||
@ -207,11 +226,13 @@ CONFIG_CHOWN=y
|
||||
# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
|
||||
CONFIG_CHROOT=y
|
||||
CONFIG_CKSUM=y
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_COMM is not set
|
||||
CONFIG_CP=y
|
||||
# CONFIG_FEATURE_CP_LONG_OPTIONS is not set
|
||||
# CONFIG_FEATURE_CP_REFLINK is not set
|
||||
CONFIG_CUT=y
|
||||
CONFIG_FEATURE_CUT_REGEX=y
|
||||
CONFIG_DATE=y
|
||||
CONFIG_FEATURE_DATE_ISOFMT=y
|
||||
# CONFIG_FEATURE_DATE_NANO is not set
|
||||
@ -223,6 +244,7 @@ CONFIG_FEATURE_DD_IBS_OBS=y
|
||||
CONFIG_FEATURE_DD_STATUS=y
|
||||
CONFIG_DF=y
|
||||
# CONFIG_FEATURE_DF_FANCY is not set
|
||||
CONFIG_FEATURE_SKIP_ROOTFS=y
|
||||
CONFIG_DIRNAME=y
|
||||
# CONFIG_DOS2UNIX is not set
|
||||
# CONFIG_UNIX2DOS is not set
|
||||
@ -316,13 +338,13 @@ CONFIG_TEST2=y
|
||||
CONFIG_FEATURE_TEST_64=y
|
||||
# CONFIG_TIMEOUT is not set
|
||||
CONFIG_TOUCH=y
|
||||
# CONFIG_FEATURE_TOUCH_NODEREF is not set
|
||||
# CONFIG_FEATURE_TOUCH_SUSV3 is not set
|
||||
CONFIG_TR=y
|
||||
CONFIG_FEATURE_TR_CLASSES=y
|
||||
CONFIG_FEATURE_TR_EQUIV=y
|
||||
CONFIG_TRUE=y
|
||||
CONFIG_TRUNCATE=y
|
||||
CONFIG_TSORT=y
|
||||
CONFIG_TTY=y
|
||||
CONFIG_UNAME=y
|
||||
CONFIG_UNAME_OSNAME="GNU/Linux for Wally"
|
||||
@ -336,27 +358,12 @@ CONFIG_BASE64=y
|
||||
CONFIG_UUENCODE=y
|
||||
CONFIG_WC=y
|
||||
# CONFIG_FEATURE_WC_LARGE is not set
|
||||
CONFIG_WHOAMI=y
|
||||
# CONFIG_WHO is not set
|
||||
# CONFIG_W is not set
|
||||
# CONFIG_USERS is not set
|
||||
CONFIG_WHOAMI=y
|
||||
CONFIG_YES=y
|
||||
|
||||
#
|
||||
# Common options
|
||||
#
|
||||
CONFIG_FEATURE_VERBOSE=y
|
||||
|
||||
#
|
||||
# Common options for cp and mv
|
||||
#
|
||||
CONFIG_FEATURE_PRESERVE_HARDLINKS=y
|
||||
|
||||
#
|
||||
# Common options for df, du, ls
|
||||
#
|
||||
CONFIG_FEATURE_HUMAN_READABLE=y
|
||||
|
||||
#
|
||||
# Console Utilities
|
||||
#
|
||||
@ -420,6 +427,7 @@ CONFIG_VI=y
|
||||
CONFIG_FEATURE_VI_MAX_LEN=4096
|
||||
CONFIG_FEATURE_VI_8BIT=y
|
||||
CONFIG_FEATURE_VI_COLON=y
|
||||
CONFIG_FEATURE_VI_COLON_EXPAND=y
|
||||
CONFIG_FEATURE_VI_YANKMARK=y
|
||||
CONFIG_FEATURE_VI_SEARCH=y
|
||||
# CONFIG_FEATURE_VI_REGEX_SEARCH is not set
|
||||
@ -433,6 +441,7 @@ CONFIG_FEATURE_VI_ASK_TERMINAL=y
|
||||
CONFIG_FEATURE_VI_UNDO=y
|
||||
CONFIG_FEATURE_VI_UNDO_QUEUE=y
|
||||
CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256
|
||||
CONFIG_FEATURE_VI_VERBOSE_STATUS=y
|
||||
# CONFIG_FEATURE_ALLOW_EXEC is not set
|
||||
|
||||
#
|
||||
@ -441,7 +450,11 @@ CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256
|
||||
CONFIG_FIND=y
|
||||
CONFIG_FEATURE_FIND_PRINT0=y
|
||||
CONFIG_FEATURE_FIND_MTIME=y
|
||||
CONFIG_FEATURE_FIND_ATIME=y
|
||||
CONFIG_FEATURE_FIND_CTIME=y
|
||||
CONFIG_FEATURE_FIND_MMIN=y
|
||||
CONFIG_FEATURE_FIND_AMIN=y
|
||||
CONFIG_FEATURE_FIND_CMIN=y
|
||||
CONFIG_FEATURE_FIND_PERM=y
|
||||
CONFIG_FEATURE_FIND_TYPE=y
|
||||
CONFIG_FEATURE_FIND_EXECUTABLE=y
|
||||
@ -449,6 +462,7 @@ CONFIG_FEATURE_FIND_XDEV=y
|
||||
CONFIG_FEATURE_FIND_MAXDEPTH=y
|
||||
CONFIG_FEATURE_FIND_NEWER=y
|
||||
# CONFIG_FEATURE_FIND_INUM is not set
|
||||
CONFIG_FEATURE_FIND_SAMEFILE=y
|
||||
CONFIG_FEATURE_FIND_EXEC=y
|
||||
CONFIG_FEATURE_FIND_EXEC_PLUS=y
|
||||
CONFIG_FEATURE_FIND_USER=y
|
||||
@ -510,10 +524,10 @@ CONFIG_FEATURE_SHADOWPASSWDS=y
|
||||
# CONFIG_USE_BB_SHADOW is not set
|
||||
CONFIG_USE_BB_CRYPT=y
|
||||
CONFIG_USE_BB_CRYPT_SHA=y
|
||||
CONFIG_ADDGROUP=y
|
||||
# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set
|
||||
# CONFIG_ADD_SHELL is not set
|
||||
# CONFIG_REMOVE_SHELL is not set
|
||||
CONFIG_ADDGROUP=y
|
||||
# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set
|
||||
CONFIG_ADDUSER=y
|
||||
# CONFIG_FEATURE_CHECK_NAMES is not set
|
||||
CONFIG_LAST_ID=60000
|
||||
@ -739,6 +753,7 @@ CONFIG_FEATURE_VOLUMEID_FAT=y
|
||||
# Miscellaneous Utilities
|
||||
#
|
||||
# CONFIG_ADJTIMEX is not set
|
||||
CONFIG_ASCII=y
|
||||
# CONFIG_BBCONFIG is not set
|
||||
# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
|
||||
# CONFIG_BC is not set
|
||||
@ -772,10 +787,10 @@ CONFIG_CRONTAB=y
|
||||
# CONFIG_FEATURE_DEVFS is not set
|
||||
CONFIG_DEVMEM=y
|
||||
# CONFIG_FBSPLASH is not set
|
||||
# CONFIG_FLASHCP is not set
|
||||
# CONFIG_FLASH_ERASEALL is not set
|
||||
# CONFIG_FLASH_LOCK is not set
|
||||
# CONFIG_FLASH_UNLOCK is not set
|
||||
# CONFIG_FLASHCP is not set
|
||||
# CONFIG_HDPARM is not set
|
||||
# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set
|
||||
# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
|
||||
@ -819,21 +834,24 @@ CONFIG_PARTPROBE=y
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_RUNLEVEL is not set
|
||||
# CONFIG_RX is not set
|
||||
CONFIG_SEEDRNG=y
|
||||
CONFIG_SETFATTR=y
|
||||
CONFIG_SETSERIAL=y
|
||||
CONFIG_STRINGS=y
|
||||
CONFIG_TIME=y
|
||||
CONFIG_TREE=y
|
||||
CONFIG_TS=y
|
||||
# CONFIG_TTYSIZE is not set
|
||||
CONFIG_UBIRENAME=y
|
||||
# CONFIG_UBIATTACH is not set
|
||||
# CONFIG_UBIDETACH is not set
|
||||
# CONFIG_UBIMKVOL is not set
|
||||
# CONFIG_UBIRMVOL is not set
|
||||
# CONFIG_UBIRSVOL is not set
|
||||
# CONFIG_UBIUPDATEVOL is not set
|
||||
CONFIG_UBIRENAME=y
|
||||
# CONFIG_VOLNAME is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_FEATURE_WATCHDOG_OPEN_TWICE is not set
|
||||
|
||||
#
|
||||
# Networking Utilities
|
||||
@ -842,6 +860,9 @@ CONFIG_WATCHDOG=y
|
||||
# CONFIG_FEATURE_UNIX_LOCAL is not set
|
||||
# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set
|
||||
# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set
|
||||
# CONFIG_FEATURE_ETC_NETWORKS is not set
|
||||
# CONFIG_FEATURE_ETC_SERVICES is not set
|
||||
# CONFIG_FEATURE_HWIB is not set
|
||||
# CONFIG_FEATURE_TLS_SHA1 is not set
|
||||
# CONFIG_ARP is not set
|
||||
# CONFIG_ARPING is not set
|
||||
@ -860,6 +881,7 @@ CONFIG_WATCHDOG=y
|
||||
CONFIG_HOSTNAME=y
|
||||
# CONFIG_DNSDOMAINNAME is not set
|
||||
# CONFIG_HTTPD is not set
|
||||
CONFIG_FEATURE_HTTPD_PORT_DEFAULT=0
|
||||
# CONFIG_FEATURE_HTTPD_RANGES is not set
|
||||
# CONFIG_FEATURE_HTTPD_SETUID is not set
|
||||
# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set
|
||||
@ -952,6 +974,7 @@ CONFIG_FEATURE_IP_ROUTE_DIR=""
|
||||
# CONFIG_FEATURE_TELNET_WIDTH is not set
|
||||
# CONFIG_TELNETD is not set
|
||||
# CONFIG_FEATURE_TELNETD_STANDALONE is not set
|
||||
CONFIG_FEATURE_TELNETD_PORT_DEFAULT=0
|
||||
# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set
|
||||
# CONFIG_TFTP is not set
|
||||
# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set
|
||||
@ -972,6 +995,7 @@ CONFIG_FEATURE_IP_ROUTE_DIR=""
|
||||
# CONFIG_WGET is not set
|
||||
# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set
|
||||
# CONFIG_FEATURE_WGET_STATUSBAR is not set
|
||||
# CONFIG_FEATURE_WGET_FTP is not set
|
||||
# CONFIG_FEATURE_WGET_AUTHENTICATION is not set
|
||||
# CONFIG_FEATURE_WGET_TIMEOUT is not set
|
||||
# CONFIG_FEATURE_WGET_HTTPS is not set
|
||||
@ -988,11 +1012,13 @@ CONFIG_DHCPD_LEASES_FILE=""
|
||||
# CONFIG_FEATURE_UDHCPC_ARPING is not set
|
||||
# CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set
|
||||
CONFIG_UDHCPC_DEFAULT_SCRIPT=""
|
||||
CONFIG_UDHCPC6_DEFAULT_SCRIPT=""
|
||||
# CONFIG_UDHCPC6 is not set
|
||||
# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set
|
||||
# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set
|
||||
# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set
|
||||
# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set
|
||||
CONFIG_UDHCPC_DEFAULT_INTERFACE=""
|
||||
# CONFIG_FEATURE_UDHCP_PORT is not set
|
||||
CONFIG_UDHCP_DEBUG=0
|
||||
CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0
|
||||
@ -1010,17 +1036,19 @@ CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS=""
|
||||
#
|
||||
# Mail Utilities
|
||||
#
|
||||
CONFIG_FEATURE_MIME_CHARSET=""
|
||||
# CONFIG_MAKEMIME is not set
|
||||
# CONFIG_POPMAILDIR is not set
|
||||
# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set
|
||||
# CONFIG_REFORMIME is not set
|
||||
# CONFIG_FEATURE_REFORMIME_COMPAT is not set
|
||||
# CONFIG_SENDMAIL is not set
|
||||
CONFIG_FEATURE_MIME_CHARSET=""
|
||||
|
||||
#
|
||||
# Process Utilities
|
||||
#
|
||||
# CONFIG_FEATURE_FAST_TOP is not set
|
||||
# CONFIG_FEATURE_SHOW_THREADS is not set
|
||||
CONFIG_FREE=y
|
||||
CONFIG_FUSER=y
|
||||
# CONFIG_IOSTAT is not set
|
||||
@ -1059,7 +1087,6 @@ CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
|
||||
CONFIG_UPTIME=y
|
||||
# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
|
||||
CONFIG_WATCH=y
|
||||
# CONFIG_FEATURE_SHOW_THREADS is not set
|
||||
|
||||
#
|
||||
# Runit Utilities
|
||||
@ -1116,6 +1143,7 @@ CONFIG_ASH_IDLE_TIMEOUT=y
|
||||
CONFIG_ASH_ECHO=y
|
||||
CONFIG_ASH_PRINTF=y
|
||||
CONFIG_ASH_TEST=y
|
||||
CONFIG_ASH_SLEEP=y
|
||||
CONFIG_ASH_HELP=y
|
||||
CONFIG_ASH_GETOPTS=y
|
||||
CONFIG_ASH_CMDCMD=y
|
||||
@ -1124,8 +1152,8 @@ CONFIG_ASH_CMDCMD=y
|
||||
# CONFIG_SHELL_HUSH is not set
|
||||
# CONFIG_HUSH_BASH_COMPAT is not set
|
||||
# CONFIG_HUSH_BRACE_EXPANSION is not set
|
||||
# CONFIG_HUSH_LINENO_VAR is not set
|
||||
# CONFIG_HUSH_BASH_SOURCE_CURDIR is not set
|
||||
# CONFIG_HUSH_LINENO_VAR is not set
|
||||
# CONFIG_HUSH_INTERACTIVE is not set
|
||||
# CONFIG_HUSH_SAVEHISTORY is not set
|
||||
# CONFIG_HUSH_JOB is not set
|
92
linux/br2-external-tree/board/wally/linux.config
Normal file
92
linux/br2-external-tree/board/wally/linux.config
Normal file
@ -0,0 +1,92 @@
|
||||
CONFIG_DEFAULT_HOSTNAME="WallyDefaultHostname"
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE="${BR_BINARIES_DIR}/rootfs.cpio"
|
||||
# CONFIG_RD_GZIP is not set
|
||||
# CONFIG_RD_BZIP2 is not set
|
||||
# CONFIG_RD_LZMA is not set
|
||||
# CONFIG_RD_XZ is not set
|
||||
# CONFIG_RD_LZO is not set
|
||||
# CONFIG_RD_LZ4 is not set
|
||||
# CONFIG_RD_ZSTD is not set
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
# CONFIG_RISCV_ISA_V is not set
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_JUMP_LABEL=y
|
||||
# CONFIG_COMPAT_32BIT_TIME is not set
|
||||
# CONFIG_GCC_PLUGINS is not set
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_PAGE_REPORTING=y
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_SIFIVE=y
|
||||
CONFIG_SERIAL_SIFIVE_CONSOLE=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SIFIVE=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIOLIB_FASTPATH_LIMIT=32
|
||||
# CONFIG_GPIO_CDEV_V1 is not set
|
||||
CONFIG_GPIO_SIFIVE=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SPI=y
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_EFIVAR_FS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf"
|
||||
CONFIG_INIT_STACK_NONE=y
|
||||
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7
|
||||
CONFIG_READABLE_ASM=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
CONFIG_SCHED_STACK_END_CHECK=y
|
||||
CONFIG_DEBUG_VM=y
|
||||
CONFIG_DEBUG_VM_PGFLAGS=y
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
CONFIG_WQ_WATCHDOG=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_RWSEMS=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_STACKTRACE=y
|
||||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_DEBUG_PLIST=y
|
||||
CONFIG_DEBUG_SG=y
|
||||
CONFIG_RCU_EQS_DEBUG=y
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
CONFIG_MEMTEST=y
|
44
linux/br2-external-tree/configs/wally_defconfig
Normal file
44
linux/br2-external-tree/configs/wally_defconfig
Normal file
@ -0,0 +1,44 @@
|
||||
BR2_riscv=y
|
||||
BR2_RISCV_ISA_RVC=y
|
||||
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_11=y
|
||||
BR2_BINUTILS_VERSION_2_43_X=y
|
||||
BR2_GCC_VERSION_14_X=y
|
||||
BR2_TOOLCHAIN_BUILDROOT_CXX=y
|
||||
BR2_TOOLCHAIN_BUILDROOT_FORTRAN=y
|
||||
BR2_BACKUP_SITE="http://sources.buildroot.net"
|
||||
BR2_GNU_MIRROR="http://ftpmirror.gnu.org"
|
||||
BR2_ENABLE_DEBUG=y
|
||||
BR2_DEBUG_3=y
|
||||
# BR2_STRIP_strip is not set
|
||||
# BR2_PIC_PIE is not set
|
||||
BR2_SSP_NONE=y
|
||||
BR2_RELRO_NONE=y
|
||||
BR2_FORTIFY_SOURCE_NONE=y
|
||||
BR2_TARGET_GENERIC_HOSTNAME="WallyHostname"
|
||||
BR2_TARGET_GENERIC_ISSUE="Greetings! This RISC-V Linux image was built for Wally on Buildroot!"
|
||||
BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES=y
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_WALLY_PATH)/board/wally/rootfs_overlay"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.12.8"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_WALLY_PATH)/board/wally/linux.config"
|
||||
BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL_WALLY_PATH)/board/wally/busybox.config"
|
||||
BR2_PACKAGE_COREMARK=y
|
||||
BR2_PACKAGE_DHRYSTONE=y
|
||||
BR2_PACKAGE_RAMSPEED=y
|
||||
BR2_PACKAGE_WHETSTONE=y
|
||||
BR2_PACKAGE_SDL=y
|
||||
BR2_PACKAGE_ZSH=y
|
||||
# BR2_PACKAGE_UEMACS=y # temporarily disabled due to build issues with gcc 14
|
||||
BR2_TARGET_ROOTFS_INITRAMFS=y
|
||||
# BR2_TARGET_ROOTFS_TAR is not set
|
||||
BR2_TARGET_OPENSBI=y
|
||||
BR2_TARGET_OPENSBI_CUSTOM_VERSION=y
|
||||
BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.6"
|
||||
BR2_TARGET_OPENSBI_PLAT="generic"
|
||||
# BR2_TARGET_OPENSBI_INSTALL_DYNAMIC_IMG is not set
|
||||
BR2_PACKAGE_HOST_E2FSPROGS=y
|
||||
BR2_PACKAGE_HOST_QEMU=y
|
||||
BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE=y
|
2
linux/br2-external-tree/external.desc
Normal file
2
linux/br2-external-tree/external.desc
Normal file
@ -0,0 +1,2 @@
|
||||
name: WALLY
|
||||
desc: Buildroot configuration for wally
|
2
linux/br2-external-tree/external.mk
Normal file
2
linux/br2-external-tree/external.mk
Normal file
@ -0,0 +1,2 @@
|
||||
# required for buildroot external tree
|
||||
# delibarately empty
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@
|
||||
#size-cells = <0x02>;
|
||||
compatible = "wally-virt";
|
||||
model = "wally-virt,qemu";
|
||||
|
||||
|
||||
chosen {
|
||||
linux,initrd-end = <0x85c43a00>;
|
||||
linux,initrd-start = <0x84200000>;
|
||||
@ -30,9 +30,9 @@
|
||||
reg = <0x00>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdcsu";
|
||||
riscv,isa-base = "rv64i";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zicbom", "zicbop", "zicbopz", "zicntr", "zicsr", "zifencei", "zihpm";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svadu", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zca", "zcb", "zcd", "zfa", "zfh", "zkn", "zkt", "zicbom", "zicboz", "zicntr", "zicond", "zicsr", "zifencei", "zihpm";
|
||||
riscv,cboz-block-size = <64>;
|
||||
riscv,cbom-block-size = <64>;
|
||||
mmu-type = "riscv,sv48";
|
||||
|
||||
|
@ -30,9 +30,9 @@
|
||||
reg = <0x00>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdcsu";
|
||||
riscv,isa-base = "rv64i";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zicbom", "zicbop", "zicbopz", "zicntr", "zicsr", "zifencei", "zihpm";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svadu", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zca", "zcb", "zcd", "zfa", "zfh", "zkn", "zkt", "zicbom", "zicboz", "zicntr", "zicond", "zicsr", "zifencei", "zihpm";
|
||||
riscv,cboz-block-size = <64>;
|
||||
riscv,cbom-block-size = <64>;
|
||||
mmu-type = "riscv,sv48";
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
chosen {
|
||||
linux,initrd-end = <0x85c43a00>;
|
||||
linux,initrd-start = <0x84200000>;
|
||||
bootargs = "root=/dev/vda ro console=ttyS0,115200";
|
||||
bootargs = "root=/dev/vda ro console=ttyS0,115200";
|
||||
stdout-path = "/soc/uart@10000000";
|
||||
};
|
||||
|
||||
@ -30,8 +30,10 @@
|
||||
reg = <0x00>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdcsu";
|
||||
riscv,isa-extensions = "imafdc", "sstc", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zicbom", "zicbop", "zicbopz", "zicntr", "zicsr", "zifencei", "zihpm";
|
||||
riscv,isa-base = "rv64i";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svadu", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zca", "zcb", "zcd", "zfa", "zfh", "zkn", "zkt", "zicbom", "zicboz", "zicntr", "zicond", "zicsr", "zifencei", "zihpm";
|
||||
riscv,cboz-block-size = <64>;
|
||||
riscv,cbom-block-size = <64>;
|
||||
mmu-type = "riscv,sv48";
|
||||
|
||||
interrupt-controller {
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0x00 0x80000000 0x00 0x10000000>;
|
||||
reg = <0x00 0x80000000 0x00 0x10000000>;
|
||||
};
|
||||
|
||||
cpus {
|
||||
@ -30,8 +30,10 @@
|
||||
reg = <0x00>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdcsu";
|
||||
riscv,isa-extensions = "svadu";
|
||||
riscv,isa-base = "rv64i";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "sstc", "svadu", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zca", "zcb", "zcd", "zfa", "zfh", "zkn", "zkt", "zicbom", "zicboz", "zicntr", "zicond", "zicsr", "zifencei", "zihpm";
|
||||
riscv,cboz-block-size = <64>;
|
||||
riscv,cbom-block-size = <64>;
|
||||
mmu-type = "riscv,sv48";
|
||||
|
||||
interrupt-controller {
|
||||
|
@ -29,7 +29,7 @@ echo "Launching QEMU in replay mode!"
|
||||
(qemu-system-riscv64 \
|
||||
-M virt -m 256M -dtb "$DEVICE_TREE" \
|
||||
-nographic \
|
||||
-bios "$imageDir"/fw_jump.elf -kernel "$imageDir"/Image -append "root=/dev/vda ro" -initrd "$imageDir"/rootfs.cpio \
|
||||
-bios "$imageDir"/fw_jump.bin -kernel "$imageDir"/Image -append "root=/dev/vda ro" -initrd "$imageDir"/rootfs.cpio \
|
||||
-gdb tcp::$tcpPort -S) \
|
||||
& riscv64-unknown-elf-gdb --quiet \
|
||||
-ex "set pagination off" \
|
||||
|
@ -1,7 +0,0 @@
|
||||
.PHONY: all clean
|
||||
|
||||
all:
|
||||
./make-img.sh test.img
|
||||
|
||||
clean:
|
||||
rm -f test.img
|
@ -1,116 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Exit on any error (return code != 0)
|
||||
set -e
|
||||
|
||||
# Output colors
|
||||
GREEN='\033[1;32m'
|
||||
NC='\033[0m'
|
||||
NAME="$GREEN"${0:2}"$NC"
|
||||
|
||||
# File location variables
|
||||
IMAGES=$RISCV/buildroot/output/images
|
||||
FW_JUMP=$IMAGES/fw_jump.bin
|
||||
LINUX_KERNEL=$IMAGES/Image
|
||||
DEVICE_TREE=$IMAGES/wally-vcu108.dtb
|
||||
|
||||
# Mount Directory
|
||||
MNT_DIR=wallyimg
|
||||
|
||||
if [ ! -z "$2" ] ; then
|
||||
MNT_DIR=$2
|
||||
fi
|
||||
|
||||
# If images are not built, exit
|
||||
if [ ! -e $FW_JUMP ] || [ ! -e $LINUX_KERNEL ] ; then
|
||||
echo 'ERROR: Missing images in buildroot output directory.'
|
||||
echo ' Build images before running this script.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -e $DEVICE_TREE ] ; then
|
||||
echo 'ERROR: Missing device tree file'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Size of OpenSBI and the Kernel in 512B blocks
|
||||
DST_SIZE=$(ls -la --block-size=512 $DEVICE_TREE | cut -d' ' -f 5 )
|
||||
FW_JUMP_SIZE=$(ls -la --block-size=512 $FW_JUMP | cut -d' ' -f 5 )
|
||||
KERNEL_SIZE=$(ls -la --block-size=512 $LINUX_KERNEL | cut -d' ' -f 5 )
|
||||
|
||||
# Start sectors of OpenSBI and Kernel Partitions
|
||||
FW_JUMP_START=$(( 34 + $DST_SIZE ))
|
||||
KERNEL_START=$(( $FW_JUMP_START + $FW_JUMP_SIZE ))
|
||||
FS_START=$(( $KERNEL_START + $KERNEL_SIZE ))
|
||||
|
||||
# Print out the sizes of the binaries in 512B blocks
|
||||
echo -e "$NAME: Device tree block size: $DST_SIZE"
|
||||
echo -e "$NAME: OpenSBI FW_JUMP block size: $FW_JUMP_SIZE"
|
||||
echo -e "$NAME: Kernel block size: $KERNEL_SIZE"
|
||||
|
||||
if [ ! -e $1 ] ; then
|
||||
# Make empty image
|
||||
echo -e "$NAME: Creating blank image"
|
||||
sudo dd if=/dev/zero of=$1 bs=1M count=1536
|
||||
|
||||
# GUID Partition Tables (GPT)
|
||||
# ===============================================
|
||||
# -g Converts any existing mbr record to a gpt record
|
||||
# --clear clears any GPT partition table that already exists.
|
||||
# --set-alignment=1 that we want to align partition starting sectors
|
||||
# to 1 sector boundaries I think? This would normally be set to 2048
|
||||
# apparently.
|
||||
|
||||
# sudo sgdisk -g --clear --set-alignment=1 \
|
||||
# --new=1:34:+$FW_JUMP_SIZE: --change-name=1:'opensbi' --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985 \
|
||||
# --new=2:$KERNEL_START:+$KERNEL_SIZE --change-name=2:'kernel' --typecode=2:3000 \
|
||||
# --new=3:$FS_START:-0 --change-name=3:'filesystem' \
|
||||
# $1
|
||||
|
||||
# echo -e "$NAME: Creating GUID Partition Table"
|
||||
# sudo sgdisk -g --clear --set-alignment=1 \
|
||||
# --new=1:34:+$DST_SIZE: --change-name=1:'fdt' \
|
||||
# --new=2:$FW_JUMP_START:+$FW_JUMP_SIZE --change-name=2:'opensbi' --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985 \
|
||||
# --new=3:$KERNEL_START:+$KERNEL_SIZE --change-name=3:'kernel' \
|
||||
# --new=4:$FS_START:-0 --change-name=4:'filesystem' \
|
||||
# $1
|
||||
|
||||
echo -e "$NAME: Creating GUID Partition Table"
|
||||
sudo sgdisk -g --clear --set-alignment=1 \
|
||||
--new=1:34:+$DST_SIZE: --change-name=1:'fdt' \
|
||||
--new=2:$FW_JUMP_START:+$FW_JUMP_SIZE --change-name=2:'opensbi' --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985 \
|
||||
--new=3:$KERNEL_START:+$KERNEL_SIZE --change-name=3:'kernel' \
|
||||
$1
|
||||
|
||||
LOOPDEVICE=$(sudo losetup -f)
|
||||
echo -e "$NAME: Loop device: $LOOPDEVICE"
|
||||
|
||||
sudo losetup --partscan $LOOPDEVICE $1
|
||||
|
||||
echo -e "$NAME: Copying binaries into their partitions."
|
||||
DD_FLAGS="bs=4k iflag=fullblock oflag=direct conv=fsync status=progress"
|
||||
# Store device tree in device tree partition
|
||||
|
||||
echo -e "$NAME: Copying device tree"
|
||||
sudo dd if=$DEVICE_TREE of="$LOOPDEVICE"p1 $DD_FLAGS
|
||||
|
||||
echo -e "$NAME: Copying OpenSBI"
|
||||
sudo dd if=$FW_JUMP of="$LOOPDEVICE"p2 $DD_FLAGS
|
||||
|
||||
echo -e "$NAME: Copying Kernel"
|
||||
sudo dd if=$LINUX_KERNEL of="$LOOPDEVICE"p3 $DD_FLAGS
|
||||
|
||||
# sudo mkfs.ext4 "$LOOPDEVICE"p4
|
||||
# sudo mkdir /mnt/$MNT_DIR
|
||||
|
||||
# sudo mount -v "$LOOPDEVICE"p4 /mnt/$MNT_DIR
|
||||
|
||||
# sudo umount -v /mnt/$MNT_DIR
|
||||
|
||||
# sudo rmdir /mnt/$MNT_DIR
|
||||
sudo losetup -d $LOOPDEVICE
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "GPT Information for $1 ==================================="
|
||||
sgdisk -p $1
|
10
sim/Makefile
10
sim/Makefile
@ -29,8 +29,8 @@ deriv:
|
||||
|
||||
.PHONY: QuestaCodeCoverage collect_functcov combine_functcov remove_functcov_artifacts riscvdv riscvdv_functcov
|
||||
|
||||
QuestaCodeCoverage: questa/ucdb/rv64gc_arch64i.ucdb
|
||||
vcover merge -out questa/ucdb/cov.ucdb questa/ucdb/rv64gc_arch64i.ucdb questa/ucdb/rv64gc*.ucdb -logfile questa/cov/log
|
||||
QuestaCodeCoverage:
|
||||
vcover merge -out questa/ucdb/cov.ucdb questa/ucdb/rv64gc*.ucdb -logfile questa/cov/log
|
||||
# vcover merge -out questa/ucdb/cov.ucdb questa/ucdb/rv64gc_arch64i.ucdb questa/ucdb/rv64gc*.ucdb questa/ucdb/buildroot_buildroot.ucdb riscv.ucdb -logfile questa/cov/log
|
||||
vcover report -details questa/ucdb/cov.ucdb > questa/cov/rv64gc_coverage_details.rpt
|
||||
vcover report questa/ucdb/cov.ucdb -details -instance=/core/ebu. > questa/cov/rv64gc_coverage_ebu.rpt
|
||||
@ -55,9 +55,9 @@ collect_functcov: remove_functcov_artifacts riscvdv_functcov combine_functcov
|
||||
|
||||
riscvdv_functcov:
|
||||
mkdir -p ${SIM}/questa/fcov_logs
|
||||
mkdir -p ${SIM}/questa/fcov_ucdbs
|
||||
mkdir -p ${SIM}/questa/fcov_ucdb
|
||||
rm -rf ${SIM}/questa/fcov_logs/*
|
||||
rm -rf ${SIM}/questa/fcov_ucdbs/*
|
||||
rm -rf ${SIM}/questa/fcov_ucdb/*
|
||||
$(MAKE) riscvdv test_name=riscv_arithmetic_basic_test >> ${SIM}/questa/fcov.log 2>&1
|
||||
$(MAKE) riscvdv test_name=riscv_amo_test >> ${SIM}/questa/fcov.log 2>&1
|
||||
$(MAKE) riscvdv test_name=riscv_ebreak_debug_mode_test >> ${SIM}/questa/fcov.log 2>&1
|
||||
@ -109,7 +109,7 @@ combine_functcov:
|
||||
grep "Total Coverage By Instance" ${SIM}/questa/fcov/fcov.log
|
||||
|
||||
remove_functcov_artifacts:
|
||||
rm -rf ${SIM}/questa/riscv.ucdb ${SIM}/questa/fcov.log ${SIM}/questa/covhtmlreport/ ${SIM}/questa/fcov_logs/ ${SIM}/questa/fcov_ucdbs/ ${SIM}/questa/fcov/
|
||||
rm -rf ${SIM}/questa/riscv.ucdb ${SIM}/questa/fcov.log ${SIM}/questa/covhtmlreport/ ${SIM}/questa/fcov_logs/ ${SIM}/questa/fcov_ucdb/ ${SIM}/questa/fcov/
|
||||
|
||||
benchmarks:
|
||||
$(MAKE) -C ${WALLY}benchmarks/embench build
|
||||
|
@ -3,12 +3,12 @@
|
||||
#
|
||||
# Modification by Oklahoma State University & Harvey Mudd College
|
||||
# Use with Testbench
|
||||
# James Stine, 2008; David Harris 2021
|
||||
# James Stine, 2008; David Harris 2021; Jordan Carlin 2024
|
||||
# Go Cowboys!!!!!!
|
||||
#
|
||||
# Takes 1:10 to run RV64IC tests using gui
|
||||
|
||||
# Usage: do wally.do <config> <testcases> <testbench> [--ccov] [--fcov] [+acc] [--args "any number of +value"] [--params "any number of VAR=VAL parameter overrides"]
|
||||
# Usage: do wally.do <config> <testcases> <testbench> [--ccov] [--fcov] [--gui] [--args "any number of +value"] [--params "any number of VAR=VAL parameter overrides"] [--define "any number of +define+VAR=VAL"]
|
||||
# Example: do wally.do rv64gc arch64i testbench
|
||||
|
||||
# Use this wally.do file to run this example.
|
||||
@ -40,7 +40,6 @@ set TESTSUITE ${2}
|
||||
set TESTBENCH ${3}
|
||||
set WKDIR wkdir/${CFG}_${TESTSUITE}
|
||||
set WALLY $::env(WALLY)
|
||||
set IMPERAS_HOME $::env(IMPERAS_HOME)
|
||||
set CONFIG ${WALLY}/config
|
||||
set SRC ${WALLY}/src
|
||||
set TB ${WALLY}/testbench
|
||||
@ -55,6 +54,7 @@ vlib ${WKDIR}
|
||||
set PlusArgs ""
|
||||
set ParamArgs ""
|
||||
set ExpandedParamArgs {}
|
||||
set DefineArgs ""
|
||||
|
||||
set ccov 0
|
||||
set CoverageVoptArg ""
|
||||
@ -62,11 +62,14 @@ set CoverageVsimArg ""
|
||||
|
||||
set FunctCoverage 0
|
||||
set FCvlog ""
|
||||
set FCvopt ""
|
||||
set FCdefineCOVER_EXTS {}
|
||||
|
||||
set breker 0
|
||||
set brekervlog ""
|
||||
set brekervopt ""
|
||||
|
||||
set lockstep 0
|
||||
set lockstepvlog ""
|
||||
|
||||
set SVLib ""
|
||||
|
||||
set GUI 0
|
||||
@ -74,24 +77,27 @@ set accFlag ""
|
||||
|
||||
# Need to be able to pass arguments to vopt. Unforunately argv does not work because
|
||||
# it takes on different values if vsim and the do file are called from the command line or
|
||||
# if the do file is called from questa sim directly. This chunk of code uses the $4 through $n
|
||||
# variables and compacts into a single list for passing to vopt.
|
||||
set from 4
|
||||
set step 1
|
||||
# if the do file is called from questa sim directly. This chunk of code uses the $n variables
|
||||
# and compacts them into a single list for passing to vopt. Shift is used to move the arguments
|
||||
# through the list.
|
||||
set lst {}
|
||||
echo "number of args = $argc"
|
||||
|
||||
for {set i 0} true {incr i} {
|
||||
set x [expr {$i*$step + $from}]
|
||||
if {$x > $argc} break
|
||||
set arg [expr "$$x"]
|
||||
lappend lst $arg
|
||||
# Shift off the first three arguments (config, testcases, testbench)
|
||||
shift
|
||||
shift
|
||||
shift
|
||||
|
||||
# Copy the remaining arguments into a list
|
||||
while {$argc > 0} {
|
||||
lappend lst [expr "\$1"]
|
||||
shift
|
||||
}
|
||||
|
||||
echo "number of args = $argc"
|
||||
echo "lst = $lst"
|
||||
|
||||
# if +acc found set flag and remove from list
|
||||
if {[lcheck lst "+acc"]} {
|
||||
if {[lcheck lst "--gui"]} {
|
||||
set GUI 1
|
||||
set accFlag "+acc"
|
||||
}
|
||||
@ -106,26 +112,32 @@ if {[lcheck lst "--ccov"]} {
|
||||
# if --fcov found set flag and remove from list
|
||||
if {[lcheck lst "--fcov"]} {
|
||||
set FunctCoverage 1
|
||||
# COVER_BASE_RV32I is just needed to keep riscvISACOV happy, but no longer affects tests
|
||||
set FCvlog "+define+INCLUDE_TRACE2COV \
|
||||
+define+IDV_INCLUDE_TRACE2COV \
|
||||
+define+COVER_BASE_RV32I \
|
||||
+incdir+$env(WALLY)/addins/riscvISACOV/source \
|
||||
"
|
||||
|
||||
set FCvopt "+TRACE2COV_ENABLE=1 +IDV_TRACE2COV=1"
|
||||
|
||||
set FCvlog "+incdir+${FCRVVI}/unpriv \
|
||||
+incdir+${FCRVVI}/priv +incdir+${FCRVVI}/rv64_priv +incdir+${FCRVVI}/rv32_priv \
|
||||
+incdir+${FCRVVI}/common +incdir+${FCRVVI} \
|
||||
+incdir+$env(WALLY)/addins/cvw-arch-verif/riscvISACOV/source"
|
||||
}
|
||||
|
||||
# if --lockstep or --fcov found set flag and remove from list
|
||||
if {[lcheck lst "--lockstep"] || $FunctCoverage == 1} {
|
||||
set IMPERAS_HOME $::env(IMPERAS_HOME)
|
||||
set lockstep 1
|
||||
set lockstepvlog "+define+USE_IMPERAS_DV \
|
||||
+incdir+${IMPERAS_HOME}/ImpPublic/include/host \
|
||||
set lockstepvlog "+incdir+${IMPERAS_HOME}/ImpPublic/include/host \
|
||||
+incdir+${IMPERAS_HOME}/ImpProprietary/include/host \
|
||||
${IMPERAS_HOME}/ImpPublic/source/host/rvvi/*.sv \
|
||||
${IMPERAS_HOME}/ImpProprietary/source/host/idv/*.sv"
|
||||
set SVLib "-sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
|
||||
set SVLib " -sv_lib ${IMPERAS_HOME}/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model "
|
||||
}
|
||||
|
||||
# if --breker found set flag and remove from list
|
||||
# Requires a license for the breker tool. See tests/breker/README.md for details
|
||||
if {[lcheck lst "--breker"]} {
|
||||
set breker 1
|
||||
set BREKER_HOME $::env(BREKER_HOME)
|
||||
set brekervlog "+incdir+${WALLY}/testbench/trek_files \
|
||||
${WALLY}/testbench/trek_files/uvm_output/trek_uvm_pkg.sv"
|
||||
set brekervopt "${WKDIR}.trek_uvm"
|
||||
append SVLib " -sv_lib ${BREKER_HOME}/linux64/lib/libtrek "
|
||||
}
|
||||
|
||||
# Set PlusArgs passed using the --args flag
|
||||
@ -146,30 +158,39 @@ if {$ParamArgsIndex >= 0} {
|
||||
set lst [lreplace $lst $ParamArgsIndex [expr {$ParamArgsIndex + 1}]]
|
||||
}
|
||||
|
||||
# Set +define macros passed using the --define flag
|
||||
set DefineArgsIndex [lsearch -exact $lst "--define"]
|
||||
if {$DefineArgsIndex >= 0} {
|
||||
set DefineArgs [lindex $lst [expr {$DefineArgsIndex + 1}]]
|
||||
set lst [lreplace $lst $DefineArgsIndex [expr {$DefineArgsIndex + 1}]]
|
||||
}
|
||||
|
||||
# Debug print statements
|
||||
if {$DEBUG > 0} {
|
||||
echo "GUI = $GUI"
|
||||
echo "ccov = $ccov"
|
||||
echo "lockstep = $lockstep"
|
||||
echo "FunctCoverage = $FunctCoverage"
|
||||
echo "Breker = $breker"
|
||||
echo "remaining list = $lst"
|
||||
echo "Extra +args = $PlusArgs"
|
||||
echo "Extra -args = $ExpandedParamArgs"
|
||||
echo "Extra params = $ExpandedParamArgs"
|
||||
echo "Extra defines = $DefineArgs"
|
||||
}
|
||||
|
||||
# compile source files
|
||||
# suppress spurious warnngs about
|
||||
# "Extra checking for conflicts with always_comb done at vopt time"
|
||||
# because vsim will run vopt
|
||||
set INC_DIRS "+incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared +incdir+${FCRVVI} +incdir+${FCRVVI}/rv32 +incdir+${FCRVVI}/rv64 +incdir+${FCRVVI}/rv64_priv +incdir+${FCRVVI}/priv +incdir+${FCRVVI}/rv32_priv +incdir+${FCRVVI}/common +incdir+${FCRVVI}"
|
||||
set INC_DIRS "+incdir+${CONFIG}/${CFG} +incdir+${CONFIG}/deriv/${CFG} +incdir+${CONFIG}/shared"
|
||||
set SOURCES "${SRC}/cvw.sv ${TB}/${TESTBENCH}.sv ${TB}/common/*.sv ${SRC}/*/*.sv ${SRC}/*/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*/*/*.sv"
|
||||
vlog -permissive -lint -work ${WKDIR} {*}${INC_DIRS} {*}${FCvlog} {*}${FCdefineCOVER_EXTS} {*}${lockstepvlog} {*}${SOURCES} -suppress 2282,2583,7053,7063,2596,13286
|
||||
vlog -permissive -lint -work ${WKDIR} {*}${INC_DIRS} {*}${FCvlog} {*}${DefineArgs} {*}${lockstepvlog} {*}${brekervlog} {*}${SOURCES} -suppress 2282,2583,7053,7063,2596,13286,2605,2250
|
||||
|
||||
# start and run simulation
|
||||
# remove +acc flag for faster sim during regressions if there is no need to access internal signals
|
||||
vopt $accFlag wkdir/${CFG}_${TESTSUITE}.${TESTBENCH} -work ${WKDIR} {*}${ExpandedParamArgs} -o testbenchopt ${CoverageVoptArg}
|
||||
vopt $accFlag ${WKDIR}.${TESTBENCH} ${brekervopt} -work ${WKDIR} {*}${ExpandedParamArgs} -o testbenchopt ${CoverageVoptArg}
|
||||
|
||||
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} {*}${PlusArgs} -fatal 7 {*}${SVLib} {*}${FCvopt} -suppress 3829 ${CoverageVsimArg}
|
||||
vsim -lib ${WKDIR} testbenchopt +TEST=${TESTSUITE} {*}${PlusArgs} -fatal 7 {*}${SVLib} -suppress 3829 ${CoverageVsimArg}
|
||||
|
||||
# power add generates the logging necessary for saif generation.
|
||||
# power add -r /dut/core/*
|
||||
|
166
sim/vcs/run_vcs
166
sim/vcs/run_vcs
@ -2,98 +2,118 @@
|
||||
|
||||
# run_vcs
|
||||
# David_Harris@hmc.edu 2 July 2024
|
||||
# Modified Jordan Carlin jcarlin@hmc.edu Dec 9 2024
|
||||
# Run VCS on a given file, passing appropriate flags
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
# Global variables
|
||||
WALLY = os.environ.get('WALLY')
|
||||
simdir = f"{WALLY}/sim/vcs"
|
||||
cfgdir = f"{WALLY}/config"
|
||||
srcdir = f"{WALLY}/src"
|
||||
tbdir = f"{WALLY}/testbench"
|
||||
logdir = f"{simdir}/logs"
|
||||
|
||||
# run a Linux command and return the result as a string in a form that VCS can use
|
||||
def runfindcmd(cmd):
|
||||
# print("Executing: " + str(cmd) )
|
||||
res = subprocess.check_output(cmd, shell=True)
|
||||
def runFindCommand(cmd):
|
||||
res = subprocess.check_output(cmd, shell=True, )
|
||||
res = str(res)
|
||||
res = res.replace("\\n", " ") # replace newline with space
|
||||
res = res.replace("\'", "") # strip off quotation marks
|
||||
res = res[1:] # strip off leading b from byte string
|
||||
return res
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("config", help="Configuration file")
|
||||
parser.add_argument("testsuite", help="Test suite (or none, when running a single ELF file) ")
|
||||
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
|
||||
parser.add_argument("--elffile", "-e", help="ELF file name", default="")
|
||||
parser.add_argument("--coverage", "-c", help="Code & Functional Coverage", action="store_true")
|
||||
parser.add_argument("--fcov", "-f", help="Code & Functional Coverage", action="store_true")
|
||||
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
|
||||
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
|
||||
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
|
||||
# GUI not yet implemented
|
||||
#parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true")
|
||||
args = parser.parse_args()
|
||||
print("run_vcs Config=" + args.config + " tests=" + args.testsuite + " elffile=" + args.elffile + " lockstep=" + str(args.lockstep) + " args='" + args.args + "'")
|
||||
def parseArgs():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("config", help="Configuration file")
|
||||
parser.add_argument("testsuite", help="Test suite (or none, when running a single ELF file) ")
|
||||
parser.add_argument("--tb", "-t", help="Testbench", choices=["testbench", "testbench_fp"], default="testbench")
|
||||
parser.add_argument("--ccov", "-c", help="Code Coverage", action="store_true")
|
||||
parser.add_argument("--fcov", "-f", help="Functional Coverage", action="store_true")
|
||||
parser.add_argument("--args", "-a", help="Optional arguments passed to simulator via $value$plusargs", default="")
|
||||
parser.add_argument("--params", "-p", help="Optional top-level parameter overrides of the form param=value", default="")
|
||||
parser.add_argument("--define", "-d", help="Optional define macros passed to simulator", default="")
|
||||
parser.add_argument("--lockstep", "-l", help="Run ImperasDV lock, step, and compare.", action="store_true")
|
||||
#parser.add_argument("--gui", "-g", help="Simulate with GUI", action="store_true") # GUI not yet implemented
|
||||
return parser.parse_args()
|
||||
|
||||
cfgdir = "$WALLY/config"
|
||||
srcdir = "$WALLY/src"
|
||||
tbdir = "$WALLY/testbench"
|
||||
wkdir = "$WALLY/sim/vcs/wkdir/" + args.config + "_" + args.testsuite
|
||||
covdir = "$WALLY/sim/vcs/cov/" + args.config + "_" + args.testsuite
|
||||
logdir = "$WALLY/sim/vcs/logs"
|
||||
def createDirs(args):
|
||||
wkdir = f"{simdir}/wkdir/{args.config}_{args.testsuite}"
|
||||
covdir = f"{simdir}/cov/{args.config}_{args.testsuite}"
|
||||
os.makedirs(wkdir, exist_ok=True)
|
||||
os.makedirs(covdir, exist_ok=True)
|
||||
os.makedirs(logdir, exist_ok=True)
|
||||
return wkdir, covdir
|
||||
|
||||
os.system("mkdir -p " + wkdir)
|
||||
os.system("mkdir -p " + covdir)
|
||||
os.system("mkdir -p " + logdir)
|
||||
def generateFileList():
|
||||
rtlsrc_cmd = f'find {srcdir} -name "*.sv" ! -path "{srcdir}/generic/mem/rom1p1r_128x64.sv" ! -path "{srcdir}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "{srcdir}/generic/mem/rom1p1r_128x32.sv" ! -path "{srcdir}/generic/mem/ram2p1r1wbe_2048x64.sv"'
|
||||
rtlsrc_files = runFindCommand(rtlsrc_cmd)
|
||||
tbcommon_cmd = f'find {tbdir}/common -name "*.sv"'
|
||||
tbcommon_files = runFindCommand(tbcommon_cmd)
|
||||
tb_file = f'{tbdir}/{args.tb}.sv'
|
||||
return f"{tb_file} {rtlsrc_files} {tbcommon_files}"
|
||||
|
||||
# Find RTL source files
|
||||
rtlsrc_cmd = "find " + srcdir + ' -name "*.sv" ! -path "' + srcdir + '/generic/mem/rom1p1r_128x64.sv" ! -path "' + srcdir + '/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "' + srcdir + '/generic/mem/rom1p1r_128x32.sv" ! -path "' + srcdir + '/generic/mem/ram2p1r1wbe_2048x64.sv"'
|
||||
rtlsrc_files = runfindcmd(rtlsrc_cmd)
|
||||
tbcommon_cmd = 'find ' + tbdir+'/common -name "*.sv" ! -path "' + tbdir+'/common/wallyTracer.sv"'
|
||||
tbcommon_files = runfindcmd(tbcommon_cmd)
|
||||
tb_file = tbdir + "/" + args.tb + ".sv"
|
||||
RTL_FILES = tb_file + ' ' + str(rtlsrc_files) + ' ' + str(tbcommon_files)
|
||||
def processArgs(wkdir, args):
|
||||
compileOptions = []
|
||||
simvOptions = []
|
||||
if args.lockstep:
|
||||
compileOptions.extend(["+incdir+$IMPERAS_HOME/ImpPublic/include/host",
|
||||
"+incdir+$IMPERAS_HOME/ImpProprietary/include/host",
|
||||
"$IMPERAS_HOME/ImpPublic/source/host/rvvi/*.sv",
|
||||
"$IMPERAS_HOME/ImpProprietary/source/host/idv/*.sv"])
|
||||
simvOptions.append("-sv_lib $IMPERAS_HOME/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model")
|
||||
if args.ccov:
|
||||
compileOptions.extend(["-cm line+cond+branch+fsm+tgl", f"-cm_log {wkdir}/coverage.log", f"-cm_dir {wkdir}/coverage"])
|
||||
if args.params:
|
||||
compileOptions.append(setupParamOverrides(wkdir, args))
|
||||
if args.define:
|
||||
compileOptions.append(args.define)
|
||||
# if args.gui:
|
||||
# compileOptions.append("-debug_access+all+reverse -kdb +vcs+vcdpluson")
|
||||
compileOptions = " ".join(compileOptions)
|
||||
simvOptions = " ".join(simvOptions)
|
||||
return compileOptions, simvOptions
|
||||
|
||||
# Include directories
|
||||
INCLUDE_PATH="+incdir+" + cfgdir + "/" + args.config + " +incdir+" + cfgdir + "/deriv/" + args.config + " +incdir+" + cfgdir + "/shared +incdir+$WALLY/tests +incdir+" + tbdir + " +incdir+" + srcdir
|
||||
def setupParamOverrides(wkdir, args):
|
||||
paramOverrideFile = os.path.join(wkdir, "param_overrides.txt")
|
||||
with open(paramOverrideFile, "w") as f:
|
||||
for param in args.params.split():
|
||||
[param, value] = param.split("=")
|
||||
if fr"\'" in value: # for bit values
|
||||
value = value.replace(fr"\'", "'")
|
||||
else: # for strings
|
||||
value = f'"{value}"'
|
||||
f.write(f"assign {value} {args.tb}/{param}\n")
|
||||
return f" -parameters {wkdir}/param_overrides.txt "
|
||||
|
||||
# lockstep mode
|
||||
if (args.lockstep):
|
||||
LOCKSTEP_OPTIONS = " +define+USE_IMPERAS_DV +incdir+$IMPERAS_HOME/ImpPublic/include/host +incdir+$IMPERAS_HOME/ImpProprietary/include/host $IMPERAS_HOME/ImpPublic/source/host/rvvi/*.sv $IMPERAS_HOME/ImpProprietary/source/host/idv/*.sv " + tbdir + "/common/wallyTracer.sv"
|
||||
LOCKSTEP_SIMV = "-sv_lib $IMPERAS_HOME/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model"
|
||||
else:
|
||||
LOCKSTEP_OPTIONS = ""
|
||||
LOCKSTEP_SIMV = ""
|
||||
def setupCommands(wkdir, rtlFiles, compileOptions, simvOptions, args):
|
||||
includePath=f"+incdir+{cfgdir}/{args.config} +incdir+{cfgdir}/deriv/{args.config} +incdir+{cfgdir}/shared +incdir+$WALLY/tests +incdir+{tbdir} +incdir+{srcdir}"
|
||||
vcsStandardFlags = "+lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU,noSTASKW_CO,noSTASKW_CO1,noSTASKW_RMCOF -suppress +warn -sverilog +vc -Mupdate -line -full64 -lca -ntb_opts sensitive_dyn"
|
||||
vcsCMD = f"vcs {vcsStandardFlags} -top {args.tb} {compileOptions} -Mdir={wkdir} {includePath} {srcdir}/cvw.sv {rtlFiles} -o {wkdir}/sim_out -work {wkdir} -Mlib={wkdir} -l {logdir}/{args.config}_{args.testsuite}.log"
|
||||
simvCMD = f"{wkdir}/sim_out +TEST={args.testsuite} {args.args} -no_save {simvOptions}"
|
||||
return vcsCMD, simvCMD
|
||||
|
||||
# coverage mode
|
||||
if (args.coverage):
|
||||
COV_OPTIONS = "-cm line+cond+branch+fsm+tgl -cm_log " + wkdir + "/coverage.log -cm_dir " + wkdir + "/coverage"
|
||||
else:
|
||||
COV_OPTIONS = ""
|
||||
def runVCS(wkdir, vcsCMD, simvCMD):
|
||||
print(f"Executing: {vcsCMD}")
|
||||
subprocess.run(vcsCMD, shell=True)
|
||||
subprocess.run(simvCMD, shell=True)
|
||||
if (args.ccov):
|
||||
COV_RUN = f"urg -dir {wkdir}/coverage.vdb -format text -report IndividualCovReport/{args.config}_{args.testsuite}"
|
||||
subprocess.run(COV_RUN, shell=True)
|
||||
|
||||
# Write parameter overrides to a file
|
||||
f = open(os.path.expandvars(wkdir) + "/param_overrides.txt", "w")
|
||||
for param in args.params.split():
|
||||
[param, value] = param.split("=")
|
||||
if "\\'" in value: # for bit values
|
||||
value = value.replace("\\'", "'")
|
||||
else: # for strings
|
||||
value = "\"" + value + "\""
|
||||
# print("param=" + param + " value=" + value)
|
||||
f.write("assign " + value + " " + args.tb + "/" + param + "\n")
|
||||
f.close()
|
||||
PARAM_OVERRIDES=" -parameters " + wkdir + "/param_overrides.txt "
|
||||
def main(args):
|
||||
print(f"run_vcs Config={args.config} tests={args.testsuite} lockstep={args.lockstep} args='{args.args}' params='{args.params}' define='{args.define}'")
|
||||
wkdir, covdir = createDirs(args)
|
||||
rtlFiles = generateFileList()
|
||||
compileOptions, simvOptions = processArgs(wkdir, args)
|
||||
vcsCMD, simvCMD = setupCommands(wkdir, rtlFiles, compileOptions, simvOptions, args)
|
||||
runVCS(wkdir, vcsCMD, simvCMD)
|
||||
|
||||
# Simulation commands
|
||||
OUTPUT="sim_out"
|
||||
VCS_CMD="vcs +lint=all,noGCWM,noUI,noSVA-UA,noIDTS,noNS,noULCO,noCAWM-L,noWMIA-L,noSV-PIU,noSTASKW_CO,noSTASKW_CO1,noSTASKW_RMCOF -suppress +warn -sverilog +vc -Mupdate -line -full64 -lca -ntb_opts sensitive_dyn " + "-top " + args.tb + PARAM_OVERRIDES + INCLUDE_PATH # Disabled Debug flags; add them back for a GUI mode -debug_access+all+reverse -kdb +vcs+vcdpluson
|
||||
VCS = VCS_CMD + " -Mdir=" + wkdir + " " + srcdir + "/cvw.sv " + LOCKSTEP_OPTIONS + " " + COV_OPTIONS + " " + RTL_FILES + " -o " + wkdir + "/" + OUTPUT + " -work " + wkdir + " -Mlib=" + wkdir + " -l " + logdir + "/" + args.config + "_" + args.testsuite + ".log"
|
||||
SIMV_CMD= wkdir + "/" + OUTPUT + " +TEST=" + args.testsuite + " " + args.elffile + " " + args.args + " -no_save " + LOCKSTEP_SIMV
|
||||
|
||||
# Run simulation
|
||||
print("Executing: " + str(VCS) )
|
||||
subprocess.run(VCS, shell=True)
|
||||
subprocess.run(SIMV_CMD, shell=True)
|
||||
if (args.coverage):
|
||||
COV_RUN = "urg -dir " + wkdir + "/coverage.vdb -format text -report IndividualCovReport/" + args.config + "_" + args.testsuite
|
||||
subprocess.run(COV_RUN, shell=True)
|
||||
if __name__ == "__main__":
|
||||
args = parseArgs()
|
||||
sys.exit(main(args))
|
||||
|
@ -13,16 +13,15 @@ VERILATOR_DIR=${WALLY}/sim/verilator
|
||||
SOURCE=${WALLY}/config/shared/*.vh ${WALLY}/config/${WALLYCONF} ${WALLY}/config/deriv/${WALLYCONF} ${WALLY}/src/cvw.sv ${WALLY}/testbench/*.sv ${WALLY}/testbench/common/*.sv ${WALLY}/src/*/*.sv ${WALLY}/src/*/*/*.sv
|
||||
PLUS_ARGS=
|
||||
PARAM_ARGS=
|
||||
DEFINE_ARGS=
|
||||
EXPANDED_PARAM_ARGS:=$(patsubst %,-G%,$(PARAM_ARGS))
|
||||
|
||||
WALLYCONF?=rv64gc
|
||||
TEST?=arch64i
|
||||
TESTBENCH?=testbench
|
||||
TESTBENCH?=testbench
|
||||
|
||||
# constants
|
||||
# assume WALLY variable is correctly configured in the shell environment
|
||||
WORKING_DIR=${WALLY}/sim/verilator
|
||||
TARGET=$(WORKING_DIR)/target
|
||||
# INCLUDE_PATH are pathes that Verilator should search for files it needs
|
||||
INCLUDE_PATH="-I${WALLY}/config/shared" "-I${WALLY}/config/$(WALLYCONF)" "-I${WALLY}/config/deriv/$(WALLYCONF)"
|
||||
# SOURCES are source files
|
||||
@ -30,6 +29,8 @@ SOURCES=${WALLY}/src/cvw.sv ${WALLY}/testbench/${TESTBENCH}.sv ${WALLY}/testbenc
|
||||
# DEPENDENCIES are configuration files and source files, which leads to recompilation of executables
|
||||
DEPENDENCIES=${WALLY}/config/shared/*.vh $(SOURCES)
|
||||
|
||||
WORKDIR = $(VERILATOR_DIR)/wkdir/$(WALLYCONF)_$(TEST)
|
||||
|
||||
# regular testbench requires a wrapper defining getenvval
|
||||
ifeq ($(TESTBENCH), testbench)
|
||||
WRAPPER=${WALLY}/sim/verilator/wrapper.c
|
||||
@ -41,9 +42,9 @@ endif
|
||||
|
||||
default: run
|
||||
|
||||
run: wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}
|
||||
run: $(WORKDIR)/V${TESTBENCH}
|
||||
mkdir -p $(VERILATOR_DIR)/logs
|
||||
wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} ${ARGTEST} $(PLUS_ARGS)
|
||||
$(WORKDIR)/V${TESTBENCH} ${ARGTEST} $(PLUS_ARGS)
|
||||
|
||||
profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF)
|
||||
$(VERILATOR_DIR)/obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) ${ARGTEST}
|
||||
@ -54,15 +55,16 @@ profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF)
|
||||
mv gmon_$(WALLYCONF)* $(VERILATOR_DIR)/logs_profiling
|
||||
echo "Please check $(VERILATOR_DIR)/logs_profiling/gmon_$(WALLYCONF)* for logs and output files."
|
||||
|
||||
wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}: $(DEPENDENCIES)
|
||||
mkdir -p wkdir/$(WALLYCONF)_$(TEST)
|
||||
$(WORKDIR)/V${TESTBENCH}: $(DEPENDENCIES)
|
||||
mkdir -p $(WORKDIR)
|
||||
verilator \
|
||||
--Mdir wkdir/$(WALLYCONF)_$(TEST) -o V${TESTBENCH} \
|
||||
--Mdir $(WORKDIR) -o V${TESTBENCH} \
|
||||
--binary --trace \
|
||||
$(OPT) $(PARAMS) $(NONPROF) \
|
||||
--top-module ${TESTBENCH} --relative-includes \
|
||||
$(INCLUDE_PATH) \
|
||||
${WRAPPER} \
|
||||
${DEFINE_ARGS} \
|
||||
${EXPANDED_PARAM_ARGS} \
|
||||
$(SOURCES)
|
||||
|
||||
@ -75,6 +77,7 @@ obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF): $(DEPENDENCIES)
|
||||
--top-module ${TESTBENCH} --relative-includes \
|
||||
$(INCLUDE_PATH) \
|
||||
${WRAPPER} \
|
||||
${DEFINE_ARGS} \
|
||||
${EXPANDED_PARAM_ARGS} \
|
||||
$(SOURCES)
|
||||
|
||||
|
@ -15,6 +15,7 @@ export IMPERASD_LICENSE_FILE=27020@zircon.eng.hmc.edu # Change thi
|
||||
export QUESTA_HOME=/cad/mentor/questa_sim-2023.4/questasim # Change this for your path to Questa, excluding bin
|
||||
export DC_HOME=/cad/synopsys/SYN # Change this for your path to Synopsys DC, excluding bin
|
||||
export VCS_HOME=/cad/synopsys/vcs/U-2023.03-SP2-4 # Change this for your path to Synopsys VCS, excluding bin
|
||||
export BREKER_HOME=/cad/breker/trek5-2.1.10b-GCC6_el7 # Change this for your path to Breker Trek
|
||||
|
||||
# Tools
|
||||
# Questa and Synopsys
|
||||
@ -77,6 +78,8 @@ fi
|
||||
# Use newer gcc version for older distros
|
||||
if [ -e /opt/rh/gcc-toolset-13/enable ]; then
|
||||
source /opt/rh/gcc-toolset-13/enable # Red Hat Family
|
||||
elif [ -e $RISCV/gcc-13 ]; then
|
||||
export PATH=$RISCV/gcc-13/bin:$PATH # SUSE Family
|
||||
elif [ -e $RISCV/gcc-10 ]; then
|
||||
export PATH=$RISCV/gcc-10/bin:$PATH # Ubuntu 20.04 LTS
|
||||
fi
|
||||
|
@ -153,18 +153,20 @@ module fctrl import cvw::*; #(parameter cvw_t P) (
|
||||
endcase
|
||||
7'b11100??: if (Funct3D == 3'b001 & Rs2D == 5'b00000)
|
||||
ControlsD = `FCTRLW'b0_1_10_00_000_0_0_0_0_0; // fclass
|
||||
else if (Funct3D == 3'b000 & Rs2D == 5'b00000)
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_0_0; // fmv.x.w/d/h/q fp to int register
|
||||
else if (P.ZFA_SUPPORTED & P.XLEN == 32 & P.D_SUPPORTED & Funct7D[1:0] == 2'b01 & Funct3D == 3'b000 & Rs2D == 5'b00001)
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_1_0; // fmvh.x.d (Zfa)
|
||||
else if (Funct3D == 3'b000 & Rs2D == 5'b00000) begin
|
||||
if (Fmt[1:0] == 2'b00 | Fmt[1:0] == 2'b10 | (P.XLEN == 64 & Fmt[1:0] == 2'b01))
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_0_0; // fmv.x.w/d/h fp to int register (double only in RV64)
|
||||
end else if (P.ZFA_SUPPORTED & P.XLEN == 32 & P.D_SUPPORTED & Funct7D[1:0] == 2'b01 & Funct3D == 3'b000 & Rs2D == 5'b00001)
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_1_0; // fmvh.x.d (Zfa)
|
||||
// Q not supported in RV64GC
|
||||
// coverage off
|
||||
else if (P.ZFA_SUPPORTED & P.XLEN == 64 & P.Q_SUPPORTED & Funct7D[1:0] == 2'b11 & Funct3D == 3'b000 & Rs2D == 5'b00001)
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_1_0; // fmvh.x.q (Zfa)
|
||||
ControlsD = `FCTRLW'b0_1_11_00_000_0_0_0_1_0; // fmvh.x.q (Zfa)
|
||||
// coverage on
|
||||
7'b11110??: if (Funct3D == 3'b000 & Rs2D == 5'b00000)
|
||||
ControlsD = `FCTRLW'b1_0_00_00_011_0_0_0_0_0; // fmv.w/d/h/q.x int to fp reg
|
||||
else if (P.ZFA_SUPPORTED & Funct3D == 3'b000 & Rs2D == 5'b00001)
|
||||
7'b11110??: if (Funct3D == 3'b000 & Rs2D == 5'b00000) begin
|
||||
if (Fmt[1:0] == 2'b00 | Fmt[1:0] == 2'b10 | (P.XLEN == 64 & Fmt[1:0] == 2'b01))
|
||||
ControlsD = `FCTRLW'b1_0_00_00_011_0_0_0_0_0; // fmv.w/d/h.x int to fp reg (double only in RV64)
|
||||
end else if (P.ZFA_SUPPORTED & Funct3D == 3'b000 & Rs2D == 5'b00001)
|
||||
ControlsD = `FCTRLW'b1_0_00_00_111_0_0_0_1_0; // fli (Zfa)
|
||||
7'b0100000: if (Rs2D[4:2] == 3'b000 & SupportedFmt2 & Rs2D[1:0] != 2'b00)
|
||||
ControlsD = `FCTRLW'b1_0_01_00_000_0_0_0_0_0; // fcvt.s.(d/q/h)
|
||||
@ -196,54 +198,54 @@ module fctrl import cvw::*; #(parameter cvw_t P) (
|
||||
7'b1101000: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fcvt.s.w w->s
|
||||
5'b00001: ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0_0_0; // fcvt.s.wu wu->s
|
||||
5'b00010: ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.s.l l->s
|
||||
5'b00011: ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.s.lu lu->s
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.s.l l->s
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.s.lu lu->s
|
||||
endcase
|
||||
7'b1100000: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1_0_0; // fcvt.w.s s->w
|
||||
5'b00001: ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1_0_0; // fcvt.wu.s s->wu
|
||||
5'b00010: ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.s s->l
|
||||
5'b00011: ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.s s->lu
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.s s->l
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.s s->lu
|
||||
endcase
|
||||
7'b1101001: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fcvt.d.w w->d
|
||||
5'b00001: ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0_0_0; // fcvt.d.wu wu->d
|
||||
5'b00010: ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.d.l l->d
|
||||
5'b00011: ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.d.lu lu->d
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.d.l l->d
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.d.lu lu->d
|
||||
endcase
|
||||
7'b1100001: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1_0_0; // fcvt.w.d d->w
|
||||
5'b00001: ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1_0_0; // fcvt.wu.d d->wu
|
||||
5'b00010: ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.d d->l
|
||||
5'b00011: ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.d d->lu
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.d d->l
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.d d->lu
|
||||
5'b01000: if (P.ZFA_SUPPORTED & P.D_SUPPORTED & Funct3D == 3'b001)
|
||||
ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1_1_0; // fcvtmod.w.d (Zfa)
|
||||
endcase
|
||||
7'b1101010: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fcvt.h.w w->h
|
||||
5'b00001: ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0_0_0; // fcvt.h.wu wu->h
|
||||
5'b00010: ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.h.l l->h
|
||||
5'b00011: ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.h.lu lu->h
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.h.l l->h
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.h.lu lu->h
|
||||
endcase
|
||||
7'b1100010: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1_0_0; // fcvt.w.h h->w
|
||||
5'b00001: ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1_0_0; // fcvt.wu.h h->wu
|
||||
5'b00010: ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.h h->l
|
||||
5'b00011: ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.h h->lu
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.h h->l
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.h h->lu
|
||||
endcase
|
||||
// Not covered in testing because rv64gc does not support quad precision
|
||||
// coverage off
|
||||
7'b1101011: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fcvt.q.w w->q
|
||||
5'b00001: ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0_0_0; // fcvt.q.wu wu->q
|
||||
5'b00010: ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.q.l l->q
|
||||
5'b00011: ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.q.lu lu->q
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0_0_0; // fcvt.q.l l->q
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0_0_0; // fcvt.q.lu lu->q
|
||||
endcase
|
||||
7'b1100011: case(Rs2D)
|
||||
5'b00000: ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1_0_0; // fcvt.w.q q->w
|
||||
5'b00001: ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1_0_0; // fcvt.wu.q q->wu
|
||||
5'b00010: ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.q q->l
|
||||
5'b00011: ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.q q->lu
|
||||
5'b00010: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1_0_0; // fcvt.l.q q->l
|
||||
5'b00011: if (P.XLEN == 64) ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1_0_0; // fcvt.lu.q q->lu
|
||||
endcase
|
||||
// coverage off
|
||||
// Not covered in testing because rv64gc is not RV64Q or RV32D
|
||||
|
@ -119,13 +119,11 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
||||
if (P.ZBC_SUPPORTED)
|
||||
casez({OpD, Funct7D, Funct3D})
|
||||
17'b0110011_0000101_010: BMUControlsD = `BMUCTRLW'b000_0011_0001_1_0_0_0_1_0_0_0_0_0; // clmulr
|
||||
17'b0110011_0000101_0??: BMUControlsD = `BMUCTRLW'b000_0011_0000_1_0_0_0_1_0_0_0_0_0; // clmul/clmulh
|
||||
17'b0110011_0000101_0?1: BMUControlsD = `BMUCTRLW'b000_0011_0000_1_0_0_0_1_0_0_0_0_0; // clmul/clmulh
|
||||
endcase
|
||||
if (P.ZBKC_SUPPORTED) begin
|
||||
casez({OpD, Funct7D, Funct3D})
|
||||
17'b0110011_0000101_0??: BMUControlsD = `BMUCTRLW'b000_0011_0000_1_0_0_0_1_0_0_0_0_0; // clmul/clmulh
|
||||
// 17'b0110011_0000101_001: BMUControlsD = `BMUCTRLW'b000_0011_0000_1_0_0_0_1_0_0_0_0_0; // clmul
|
||||
// 17'b0110011_0000101_011: BMUControlsD = `BMUCTRLW'b000_0011_0001_1_0_0_0_1_0_0_0_0_0; // clmulh
|
||||
17'b0110011_0000101_0?1: BMUControlsD = `BMUCTRLW'b000_0011_0000_1_0_0_0_1_0_0_0_0_0; // clmul/clmulh
|
||||
endcase
|
||||
end
|
||||
|
||||
@ -153,10 +151,17 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
||||
end
|
||||
if (P.ZBB_SUPPORTED | P.ZBS_SUPPORTED) // rv32i/64i shift instructions need BMU ALUSelect when BMU shifter is used
|
||||
casez({OpD, Funct7D, Funct3D})
|
||||
17'b0110011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_0_0_1_0_0_0_0_0; // sra, srl, sll
|
||||
17'b0010011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_0_0_1_0_0_0_0_0; // srai, srli, slli
|
||||
17'b0111011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_1_0_1_0_0_0_0_0; // sraw, srlw, sllw
|
||||
17'b0011011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_1_0_1_0_0_0_0_0; // sraiw, srliw, slliw
|
||||
// variable shifts don't encode shift amount in funct7
|
||||
17'b0110011_0000000_001: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_0_0_1_0_0_0_0_0; // sll
|
||||
17'b0110011_0?00000_101: BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_0_0_1_0_0_0_0_0; // sra, srl
|
||||
// Immediate Shifts by more than 32 (Funct7[0]) are only supported in RV64
|
||||
17'b0010011_000000?_001: if (P.XLEN == 64 | !Funct7D[0]) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_0_0_1_0_0_0_0_0; // slli
|
||||
17'b0010011_0?0000?_101: if (P.XLEN == 64 | !Funct7D[0]) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_0_0_1_0_0_0_0_0; // srai, srli
|
||||
// w-type shifts only supported in RV64 and must have Funct7[0] = 0 because the shift amount is < 32
|
||||
17'b0111011_0000000_001: if (P.XLEN == 64) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_1_0_1_0_0_0_0_0; // sllw
|
||||
17'b0111011_0?00000_101: if (P.XLEN == 64) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_0_1_0_1_0_0_0_0_0; // sraw, srlw
|
||||
17'b0011011_0000000_001: if (P.XLEN == 64) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_1_0_1_0_0_0_0_0; // slliw
|
||||
17'b0011011_0?00000_101: if (P.XLEN == 64) BMUControlsD = `BMUCTRLW'b001_0000_0000_1_1_1_0_1_0_0_0_0_0; // sraiw, srliw
|
||||
endcase
|
||||
|
||||
if (P.ZBKB_SUPPORTED) begin // ZBKB Bitmanip
|
||||
|
@ -181,8 +181,8 @@ module controller import cvw::*; #(parameter cvw_t P) (
|
||||
assign Funct7ZeroD = (Funct7D == 7'b0000000); // most R-type instructions
|
||||
assign Funct7b5D = (Funct7D == 7'b0100000); // srai, sub
|
||||
assign FunctCZeroD = (Funct3D == 3'b101 | Funct3D == 3'b111) & (Funct7D == 7'b0000111) & P.ZICOND_SUPPORTED; // czero.eqz or czero.nez
|
||||
assign Funct7ShiftZeroD = (P.XLEN==64) ? (Funct7D[6:1] == 6'b000000) : Funct7ZeroD;
|
||||
assign Funct7Shiftb5D = (P.XLEN==64) ? (Funct7D[6:1] == 6'b010000) : Funct7b5D;
|
||||
assign Funct7ShiftZeroD = (P.XLEN==64 & ~OpD[3]) ? (Funct7D[6:1] == 6'b000000) : Funct7ZeroD; // 64-bit logical shifts allowed on XLEN=64, non-W
|
||||
assign Funct7Shiftb5D = (P.XLEN==64 & ~OpD[3]) ? (Funct7D[6:1] == 6'b010000) : Funct7b5D; // 64-bit arithmetic shifts allowed on XLEN=64, non-W
|
||||
assign IShiftD = (Funct3D == 3'b001 & Funct7ShiftZeroD) | (Funct3D == 3'b101 & (Funct7ShiftZeroD | Funct7Shiftb5D)); // slli, srli, srai, or w forms
|
||||
assign INoShiftD = ((Funct3D != 3'b001) & (Funct3D != 3'b101));
|
||||
assign IFunctD = IShiftD | INoShiftD;
|
||||
@ -300,7 +300,6 @@ module controller import cvw::*; #(parameter cvw_t P) (
|
||||
// Squash control signals if coming from an illegal compressed instruction
|
||||
// On RV32E, can't write to upper 16 registers. Checking reads to upper 16 is more costly so disregard them.
|
||||
assign IllegalERegAdrD = P.E_SUPPORTED & P.ZICSR_SUPPORTED & ControlsD[`CTRLW-1] & InstrD[11];
|
||||
//assign IllegalBaseInstrD = 1'b0;
|
||||
assign {BaseRegWriteD, PreImmSrcD, ALUSrcAD, BaseALUSrcBD, MemRWD,
|
||||
ResultSrcD, BranchD, ALUOpD, JumpD, ALUResultSrcD, BaseW64D, CSRReadD,
|
||||
PrivilegedD, FenceXD, MDUD, AtomicD, CMOD, unused} = IllegalIEUFPUInstrD ? `CTRLW'b0 : ControlsD;
|
||||
|
@ -118,7 +118,7 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
||||
if (P.PMP_ENTRIES > 0) begin : pmp
|
||||
pmpchecker #(P) pmpchecker(.PhysicalAddress, .PrivilegeModeW,
|
||||
.PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW,
|
||||
.ExecuteAccessF, .WriteAccessM, .ReadAccessM, .CMOpM,
|
||||
.ExecuteAccessF, .WriteAccessM, .ReadAccessM, .Size, .CMOpM,
|
||||
.PMPInstrAccessFaultF, .PMPLoadAccessFaultM, .PMPStoreAmoAccessFaultM);
|
||||
end else begin
|
||||
assign PMPInstrAccessFaultF = 1'b0;
|
||||
@ -131,7 +131,7 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
||||
|
||||
// Misaligned faults
|
||||
always_comb // exclusion-tag: immu-wordaccess
|
||||
case(Size[1:0])
|
||||
case(Size)
|
||||
2'b00: DataMisalignedM = 1'b0; // lb, sb, lbu
|
||||
2'b01: DataMisalignedM = VAdr[0]; // lh, sh, lhu
|
||||
2'b10: DataMisalignedM = VAdr[1] | VAdr[0]; // lw, sw, flw, fsw, lwu
|
||||
|
@ -35,9 +35,11 @@ module pmpadrdec import cvw::*; #(parameter cvw_t P) (
|
||||
input logic [P.PA_BITS-1:0] PhysicalAddress,
|
||||
input logic [7:0] PMPCfg,
|
||||
input logic [P.PA_BITS-3:0] PMPAdr,
|
||||
input logic FirstMatch,
|
||||
input logic PAgePMPAdrIn,
|
||||
output logic PAgePMPAdrOut,
|
||||
output logic Match,
|
||||
output logic [P.PA_BITS-1:0] PMPTop,
|
||||
output logic L, X, W, R
|
||||
);
|
||||
|
||||
@ -50,7 +52,8 @@ module pmpadrdec import cvw::*; #(parameter cvw_t P) (
|
||||
logic PAltPMPAdr;
|
||||
logic [P.PA_BITS-1:0] CurrentAdrFull;
|
||||
logic [1:0] AdrMode;
|
||||
|
||||
logic [P.PA_BITS-1:0] PMPTop1;
|
||||
|
||||
assign AdrMode = PMPCfg[4:3];
|
||||
|
||||
// The two lsb of the physical address don't matter for this checking.
|
||||
@ -71,20 +74,22 @@ module pmpadrdec import cvw::*; #(parameter cvw_t P) (
|
||||
assign NAMask[P.PA_BITS-1:2] = (PMPAdr + {{(P.PA_BITS-3){1'b0}}, (AdrMode == NAPOT)}) ^ PMPAdr;
|
||||
// form a mask where the bottom k bits are 1, corresponding to a size of 2^k bytes for this memory region.
|
||||
// This assumes we're using at least an NA4 region, but works for any size NAPOT region.
|
||||
assign NABase = {(PMPAdr & ~NAMask[P.PA_BITS-1:2]), 2'b00}; // base physical address of the pmp.
|
||||
|
||||
assign NABase = {(PMPAdr & ~NAMask[P.PA_BITS-1:2]), 2'b00}; // base physical address of the pmp region
|
||||
assign NAMatch = &((NABase ~^ PhysicalAddress) | NAMask); // check if upper bits of base address match, ignore lower bits correspoonding to inside the memory range
|
||||
|
||||
// finally pick the appropriate match for the access type
|
||||
assign Match = (AdrMode == TOR) ? TORMatch :
|
||||
(AdrMode == NA4 | AdrMode == NAPOT) ? NAMatch :
|
||||
1'b0;
|
||||
|
||||
// Report top of region for first matching region
|
||||
assign PMPTop1 = {PMPAdr,2'b00} | NAMask; // top of the pmp region. All 1s in the lower bits. Used to check the address doesn't pass the top
|
||||
assign PMPTop = FirstMatch ? PMPTop1 : '0; // AND portion of distributed AND-OR mux (OR portion in pmpchhecker)
|
||||
|
||||
// PMP should match but fail if the size is too big (8-byte accesses spanning to TOR or NA4 region)
|
||||
assign L = PMPCfg[7];
|
||||
assign X = PMPCfg[2];
|
||||
assign W = PMPCfg[1];
|
||||
assign R = PMPCfg[0];
|
||||
|
||||
// known bug: The size of the access is not yet checked. For example, if an NA4 entry matches 0xC-0xF and the system
|
||||
// attempts an 8-byte access to 0x8, the access should fail (see page 60 of privileged specification 20211203). This
|
||||
// implementation will not detect the failure.
|
||||
endmodule
|
||||
endmodule
|
||||
|
@ -43,6 +43,7 @@ module pmpchecker import cvw::*; #(parameter cvw_t P) (
|
||||
input var logic [7:0] PMPCFG_ARRAY_REGW[P.PMP_ENTRIES-1:0],
|
||||
input var logic [P.PA_BITS-3:0] PMPADDR_ARRAY_REGW [P.PMP_ENTRIES-1:0],
|
||||
input logic ExecuteAccessF, WriteAccessM, ReadAccessM,
|
||||
input logic [1:0] Size,
|
||||
input logic [3:0] CMOpM,
|
||||
output logic PMPInstrAccessFaultF,
|
||||
output logic PMPLoadAccessFaultM,
|
||||
@ -55,29 +56,55 @@ module pmpchecker import cvw::*; #(parameter cvw_t P) (
|
||||
logic [P.PMP_ENTRIES-1:0] FirstMatch; // onehot encoding for the first pmpaddr to match the current address.
|
||||
logic [P.PMP_ENTRIES-1:0] L, X, W, R; // PMP matches and has flag set
|
||||
logic [P.PMP_ENTRIES-1:0] PAgePMPAdr; // for TOR PMP matching, PhysicalAddress > PMPAdr[i]
|
||||
logic [P.PA_BITS-1:0] PMPTop[P.PMP_ENTRIES-1:0]; // Upper end of each region, for checking that the access is fully within the region
|
||||
logic PMPCMOAccessFault, PMPCBOMAccessFault, PMPCBOZAccessFault;
|
||||
|
||||
logic [2:0] SizeBytesMinus1;
|
||||
logic MatchingR, MatchingW, MatchingX, MatchingL;
|
||||
logic [P.PA_BITS-1:0] MatchingPMPTop, PhysicalAddressTop;
|
||||
logic TooBig;
|
||||
|
||||
if (P.PMP_ENTRIES > 0) begin: pmp // prevent complaints about array of no elements when PMP_ENTRIES = 0
|
||||
pmpadrdec #(P) pmpadrdecs[P.PMP_ENTRIES-1:0](
|
||||
.PhysicalAddress,
|
||||
.PMPCfg(PMPCFG_ARRAY_REGW),
|
||||
.PMPAdr(PMPADDR_ARRAY_REGW),
|
||||
.FirstMatch,
|
||||
.PAgePMPAdrIn({PAgePMPAdr[P.PMP_ENTRIES-2:0], 1'b1}),
|
||||
.PAgePMPAdrOut(PAgePMPAdr),
|
||||
.Match, .L, .X, .W, .R);
|
||||
.Match, .PMPTop, .L, .X, .W, .R);
|
||||
end
|
||||
|
||||
priorityonehot #(P.PMP_ENTRIES) pmppriority(.a(Match), .y(FirstMatch)); // combine the match signal from all the adress decoders to find the first one that matches.
|
||||
|
||||
// Only enforce PMP checking for S and U modes or in Machine mode when L bit is set in selected region
|
||||
assign EnforcePMP = (PrivilegeModeW != P.M_MODE) | (|(L & FirstMatch));
|
||||
// Distributed AND-OR mux to select the first matching results
|
||||
// If the access does not match all bytes of the PMP region, it is too big and the matches are disabled
|
||||
assign MatchingR = |(R & FirstMatch) & ~TooBig;
|
||||
assign MatchingW = |(W & FirstMatch) & ~TooBig;
|
||||
assign MatchingX = |(X & FirstMatch) & ~TooBig;
|
||||
assign MatchingL = |(L & FirstMatch);
|
||||
or_rows #(P.PMP_ENTRIES, P.PA_BITS) PTEOr(PMPTop, MatchingPMPTop);
|
||||
|
||||
assign PMPCBOMAccessFault = EnforcePMP & (|CMOpM[2:0]) & ~|((R|W) & FirstMatch) ; // exclusion-tag: immu-pmpcbom
|
||||
assign PMPCBOZAccessFault = EnforcePMP & CMOpM[3] & ~|(W & FirstMatch) ; // exclusion-tag: immu-pmpcboz
|
||||
// Matching PMP entry must match all bytes of an access, or the access fails (Priv Spec 3.7.1.3)
|
||||
// First find the size of the access in terms of the offset to the most significant byte
|
||||
always_comb
|
||||
case (Size)
|
||||
2'b00: SizeBytesMinus1 = 3'd0;
|
||||
2'b01: SizeBytesMinus1 = 3'd1;
|
||||
2'b10: SizeBytesMinus1 = 3'd3;
|
||||
2'b11: SizeBytesMinus1 = 3'd7;
|
||||
endcase
|
||||
// Then find the top of the access and see if it is beyond the top of the region
|
||||
assign PhysicalAddressTop = PhysicalAddress + {{P.PA_BITS-3{1'b0}}, SizeBytesMinus1}; // top of the access range
|
||||
assign TooBig = PhysicalAddressTop > MatchingPMPTop; // check if the access goes beyond the top of the PMP region
|
||||
|
||||
// Only enforce PMP checking for S and U modes or in Machine mode when L bit is set in selected region
|
||||
assign EnforcePMP = (PrivilegeModeW != P.M_MODE) | MatchingL;
|
||||
|
||||
assign PMPCBOMAccessFault = EnforcePMP & (|CMOpM[2:0]) & ~MatchingR ; // checking R is sufficient because W implies R in PMP // exclusion-tag: immu-pmpcbom
|
||||
assign PMPCBOZAccessFault = EnforcePMP & CMOpM[3] & ~MatchingW ; // exclusion-tag: immu-pmpcboz
|
||||
assign PMPCMOAccessFault = PMPCBOZAccessFault | PMPCBOMAccessFault; // exclusion-tag: immu-pmpcboaccess
|
||||
|
||||
assign PMPInstrAccessFaultF = EnforcePMP & ExecuteAccessF & ~|(X & FirstMatch) ;
|
||||
assign PMPStoreAmoAccessFaultM = (EnforcePMP & WriteAccessM & ~|(W & FirstMatch)) | PMPCMOAccessFault; // exclusion-tag: immu-pmpstoreamoaccessfault
|
||||
assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~WriteAccessM & ~|(R & FirstMatch) ;
|
||||
|
||||
assign PMPInstrAccessFaultF = EnforcePMP & ExecuteAccessF & ~MatchingX ;
|
||||
assign PMPStoreAmoAccessFaultM = (EnforcePMP & WriteAccessM & ~MatchingW) | PMPCMOAccessFault; // exclusion-tag: immu-pmpstoreamoaccessfault
|
||||
assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~WriteAccessM & ~MatchingR;
|
||||
endmodule
|
||||
|
@ -61,6 +61,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
||||
logic TLBAccess;
|
||||
logic ImproperPrivilege;
|
||||
logic BadPBMT, BadNAPOT, BadReserved;
|
||||
logic ReservedRW;
|
||||
logic InvalidAccess;
|
||||
logic PreUpdateDA, PrePageFault;
|
||||
|
||||
@ -88,6 +89,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
||||
assign BadPBMT = ((PTE_PBMT != 0) & ~(P.SVPBMT_SUPPORTED & ENVCFG_PBMTE)) | PTE_PBMT == 3; // PBMT must be zero if not supported; value of 3 is reserved
|
||||
assign BadNAPOT = PTE_N & (~P.SVNAPOT_SUPPORTED | ~NAPOT4); // N must be be 0 if CVNAPOT is not supported or not 64 KiB contiguous region
|
||||
assign BadReserved = PTE_RESERVED; // Reserved bits must be zero
|
||||
assign ReservedRW = PTE_W & ~PTE_R; // page fault on reserved encoding with R=0, W=1 per Privileged Spec 10.3.1
|
||||
|
||||
// Check whether the access is allowed, page faulting if not.
|
||||
if (ITLB == 1) begin:itlb // Instruction TLB fault checking
|
||||
@ -95,9 +97,9 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
||||
// only execute non-user mode pages.
|
||||
assign ImproperPrivilege = ((PrivilegeModeW == P.U_MODE) & ~PTE_U) | ((PrivilegeModeW == P.S_MODE) & PTE_U);
|
||||
assign PreUpdateDA = ~PTE_A;
|
||||
assign InvalidAccess = ~PTE_X;
|
||||
assign InvalidAccess = ~PTE_X | ReservedRW;
|
||||
end else begin:dtlb // Data TLB fault checking
|
||||
logic InvalidRead, InvalidWrite, ReservedEncoding;
|
||||
logic InvalidRead, InvalidWrite;
|
||||
logic InvalidCBOM, InvalidCBOZ;
|
||||
|
||||
// User mode may only load/store from user mode pages, and supervisor mode
|
||||
@ -112,8 +114,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
||||
assign InvalidWrite = WriteAccess & ~PTE_W;
|
||||
assign InvalidCBOM = (|CMOpM[2:0]) & (~PTE_R & (~STATUS_MXR | ~PTE_X));
|
||||
assign InvalidCBOZ = CMOpM[3] & ~PTE_W;
|
||||
assign ReservedEncoding = PTE_W & ~PTE_R; // fault on reserved encoding with R=0, W=1 to match ImperasDV behavior
|
||||
assign InvalidAccess = InvalidRead | InvalidWrite | InvalidCBOM | InvalidCBOZ | ReservedEncoding;
|
||||
assign InvalidAccess = InvalidRead | InvalidWrite | InvalidCBOM | InvalidCBOZ | ReservedRW;
|
||||
assign PreUpdateDA = ~PTE_A | WriteAccess & ~PTE_D;
|
||||
end
|
||||
|
||||
|
@ -51,6 +51,6 @@ module tlbram import cvw::*; #(parameter cvw_t P,
|
||||
or_rows #(TLB_ENTRIES, P.XLEN) PTEOr(RamRead, PageTableEntry);
|
||||
|
||||
// Rename the bits read from the TLB RAM
|
||||
assign PTEAccessBits = {PageTableEntry[P.XLEN-1:P.XLEN-4] & {4{P.XLEN == 64}}, PageTableEntry[7:0]}; // for RV64 include N and PBMT bits and OR of reserved bitss
|
||||
assign PTEAccessBits = {PageTableEntry[P.XLEN-1:P.XLEN-4] & {4{P.XLEN == 64}}, PageTableEntry[7:0]}; // for RV64 include N and PBMT bits and OR of reserved bits
|
||||
assign PPN = PageTableEntry[P.PPN_BITS+9:10];
|
||||
endmodule
|
||||
|
@ -121,7 +121,7 @@ module csrm import cvw::*; #(parameter cvw_t P) (
|
||||
assign ADDRLocked[i] = PMPCFG_ARRAY_REGW[i][7];
|
||||
else
|
||||
assign ADDRLocked[i] = PMPCFG_ARRAY_REGW[i][7] | (PMPCFG_ARRAY_REGW[i+1][7] & PMPCFG_ARRAY_REGW[i+1][4:3] == 2'b01);
|
||||
|
||||
|
||||
assign WritePMPADDRM[i] = (CSRMWriteM & (CSRAdrM == (PMPADDR0+i))) & ~ADDRLocked[i];
|
||||
flopenr #(P.PA_BITS-2) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM[P.PA_BITS-3:0], PMPADDR_ARRAY_REGW[i]);
|
||||
if (P.XLEN==64) begin
|
||||
@ -134,7 +134,7 @@ module csrm import cvw::*; #(parameter cvw_t P) (
|
||||
|
||||
assign CSRPMPWRLegalizedWriteValM[i] = {(CSRPMPWriteValM[i][1] & CSRPMPWriteValM[i][0]), CSRPMPWriteValM[i][0]}; // legalize WR fields (reserved 10 written as 00)
|
||||
assign CSRPMPLegalizedWriteValM[i] = {CSRPMPWriteValM[i][7], 2'b00, CSRPMPWriteValM[i][4:2], CSRPMPWRLegalizedWriteValM[i]};
|
||||
flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRPMPWriteValM[i], PMPCFG_ARRAY_REGW[i]);
|
||||
flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRPMPLegalizedWriteValM[i], PMPCFG_ARRAY_REGW[i]);
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -59,7 +59,7 @@ module privdec import cvw::*; #(parameter cvw_t P) (
|
||||
|
||||
// svinval instructions
|
||||
// any svinval instruction is treated as sfence.vma on Wally
|
||||
assign sinvalvmaM = (InstrM[31:25] == 7'b0001001);
|
||||
assign sinvalvmaM = (InstrM[31:25] == 7'b0001011);
|
||||
assign sfencewinvalM = (InstrM[31:20] == 12'b000110000000) & rs1zeroM;
|
||||
assign sfenceinvalirM = (InstrM[31:20] == 12'b000110000001) & rs1zeroM;
|
||||
assign invalM = P.SVINVAL_SUPPORTED & (sinvalvmaM | sfencewinvalM | sfenceinvalirM);
|
||||
|
@ -174,16 +174,12 @@ module spi_apb import cvw::*; #(parameter cvw_t P) (
|
||||
SPI_CSMODE: ChipSelectMode <= Din[1:0];
|
||||
SPI_DELAY0: Delay0 <= {Din[23:16], Din[7:0]};
|
||||
SPI_DELAY1: Delay1 <= {Din[23:16], Din[7:0]};
|
||||
SPI_FMT: Format <= {Din[19:16], Din[2]};
|
||||
SPI_FMT: Format <= {Din[19:16], Din[2]};
|
||||
SPI_TXDATA: if (~TransmitFIFOFull) TransmitData[7:0] <= Din[7:0];
|
||||
SPI_TXMARK: TransmitWatermark <= Din[2:0];
|
||||
SPI_RXMARK: ReceiveWatermark <= Din[2:0];
|
||||
SPI_IE: InterruptEnable <= Din[1:0];
|
||||
endcase
|
||||
|
||||
if (Memwrite)
|
||||
case(Entry)
|
||||
SPI_TXDATA: if (~TransmitFIFOFull) TransmitData[7:0] <= Din[7:0];
|
||||
endcase
|
||||
/* verilator lint_on CASEINCOMPLETE */
|
||||
|
||||
// According to FU540 spec: Once interrupt is pending, it will remain set until number
|
||||
|
@ -75,6 +75,7 @@ module spi_controller (
|
||||
logic ShiftEdgePulse;
|
||||
logic SampleEdgePulse;
|
||||
logic EndOfFramePulse;
|
||||
logic InvertClock;
|
||||
|
||||
// Frame stuff
|
||||
logic [3:0] BitNum;
|
||||
@ -107,8 +108,8 @@ module spi_controller (
|
||||
|
||||
logic [7:0] DelayCounter;
|
||||
|
||||
logic DelayIsNext;
|
||||
logic DelayState;
|
||||
logic DelayState;
|
||||
|
||||
// Convenient Delay Reg Names
|
||||
assign cssck = Delay0[7:0];
|
||||
assign sckcs = Delay0[15:8];
|
||||
@ -130,10 +131,6 @@ module spi_controller (
|
||||
assign EndOfDelay = EndOfCSSCK | EndOfSCKCS | EndOfINTERCS | EndOfINTERXFR;
|
||||
|
||||
// Clock Signal Stuff -----------------------------------------------
|
||||
// I'm going to handle all clock stuff here, including ShiftEdge and
|
||||
// SampleEdge. This makes sure that SPICLK is an output of a register
|
||||
// and it properly synchronizes signals.
|
||||
|
||||
// SPI enable generation, where SCLK = PCLK/(2*(SckDiv + 1))
|
||||
// Asserts SCLKenable at the rising and falling edge of SCLK by counting from 0 to SckDiv
|
||||
// Active at 2x SCLK frequency to account for implicit half cycle delays and actions on both clock edges depending on phase
|
||||
@ -166,12 +163,14 @@ module spi_controller (
|
||||
end
|
||||
|
||||
// SPICLK Logic
|
||||
|
||||
// We only want to trigger the clock during Transmission.
|
||||
// If Phase == 1, then we want to trigger as soon as NextState == TRANSMIT
|
||||
// Otherwise, only trigger the clock when the CurrState is TRANSMIT.
|
||||
// We never want to trigger the clock if the NextState is NOT TRANSMIT
|
||||
if (TransmitStart & ~DelayState) begin
|
||||
SPICLK <= SckMode[1];
|
||||
end else if (SCLKenable) begin
|
||||
if (Phase & (NextState == TRANSMIT)) SPICLK <= (~EndTransmission & ~DelayIsNext) ? ~SPICLK : SckMode[1];
|
||||
else if (Transmitting) SPICLK <= (~EndTransmission & ~DelayIsNext) ? ~SPICLK : SckMode[1];
|
||||
end else if (SCLKenable) begin
|
||||
SPICLK <= (NextState == TRANSMIT) & (~Phase & Transmitting | Phase) ? ~SPICLK : SckMode[1];
|
||||
end
|
||||
|
||||
// Reset divider
|
||||
@ -201,32 +200,25 @@ module spi_controller (
|
||||
// Possible pulses for all edge types. Combined with SPICLK to get
|
||||
// edges for different phase and polarity modes.
|
||||
assign ShiftEdgePulse = EdgePulse & ~LastBit;
|
||||
assign SampleEdgePulse = EdgePulse & ~DelayIsNext;
|
||||
assign SampleEdgePulse = EdgePulse & (NextState == TRANSMIT);
|
||||
assign EndOfFramePulse = EdgePulse & LastBit;
|
||||
|
||||
// Delay ShiftEdge and SampleEdge by a half PCLK period
|
||||
// Aligned EXACTLY ON THE MIDDLE of the leading and trailing edges.
|
||||
// Sweeeeeeeeeet...
|
||||
assign InvertClock = ^SckMode;
|
||||
always_ff @(posedge ~PCLK) begin
|
||||
if (~PRESETn | TransmitStart) begin
|
||||
ShiftEdge <= 0;
|
||||
SampleEdge <= 0;
|
||||
EndOfFrame <= 0;
|
||||
end else if (^SckMode) begin
|
||||
ShiftEdge <= ~SPICLK & ShiftEdgePulse;
|
||||
SampleEdge <= SPICLK & SampleEdgePulse;
|
||||
EndOfFrame <= ~SPICLK & EndOfFramePulse;
|
||||
end else begin
|
||||
ShiftEdge <= SPICLK & ShiftEdgePulse;
|
||||
SampleEdge <= ~SPICLK & SampleEdgePulse;
|
||||
EndOfFrame <= SPICLK & EndOfFramePulse;
|
||||
end
|
||||
end else begin
|
||||
ShiftEdge <= (InvertClock ^ SPICLK) & ShiftEdgePulse;
|
||||
SampleEdge <= (InvertClock ^ ~SPICLK) & SampleEdgePulse;
|
||||
EndOfFrame <= (InvertClock ^ SPICLK) & EndOfFramePulse;
|
||||
end
|
||||
end
|
||||
|
||||
// Logic for continuing to transmit through Delay states after end of frame
|
||||
assign NextEndDelay = NextState == SCKCS | NextState == INTERCS | NextState == INTERXFR;
|
||||
assign CurrentEndDelay = CurrState == SCKCS | CurrState == INTERCS | CurrState == INTERXFR;
|
||||
|
||||
always_ff @(posedge PCLK) begin
|
||||
if (~PRESETn) begin
|
||||
CurrState <= INACTIVE;
|
||||
@ -305,7 +297,6 @@ module spi_controller (
|
||||
end
|
||||
|
||||
assign Transmitting = CurrState == TRANSMIT;
|
||||
assign DelayIsNext = (NextState == CSSCK | NextState == SCKCS | NextState == INTERCS | NextState == INTERXFR);
|
||||
assign DelayState = (CurrState == CSSCK | CurrState == SCKCS | CurrState == INTERCS | CurrState == INTERXFR);
|
||||
assign InactiveState = CurrState == INACTIVE | CurrState == INTERCS;
|
||||
|
||||
|
@ -26,7 +26,7 @@ module spi_fifo #(parameter M=3, N=8)( // 2^M entries of N bits
|
||||
|
||||
assign rdata = mem[raddr];
|
||||
always_ff @(posedge PCLK)
|
||||
if (winc & ~wfull) mem[waddr] <= wdata;
|
||||
if (winc & wen & ~wfull) mem[waddr] <= wdata;
|
||||
|
||||
// write and read are enabled
|
||||
always_ff @(posedge PCLK)
|
||||
|
@ -1,12 +1,20 @@
|
||||
# Makefile for testbench to create .memfile, .objdump.addr, and .objdump.lab from an ELF
|
||||
# David_Harris@hmc.edu 3 July 2024
|
||||
# james.stine@okstate.edu 24 Jan 2025
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||
|
||||
%.elf.memfile: %.elf
|
||||
riscv64-unknown-elf-elf2hex --bit-width $(if $(findstring rv32,$*),32,64) --input $< --output $@
|
||||
# the width is set by the elf's type to allow for individual elf compilation
|
||||
%.memfile: %
|
||||
@if grep -q 'elf32' $*.objdump; then \
|
||||
BIT_WIDTH=32; \
|
||||
else \
|
||||
BIT_WIDTH=64; \
|
||||
fi; \
|
||||
echo "Processing $< with --bit-width $$BIT_WIDTH"; \
|
||||
riscv64-unknown-elf-elf2hex --bit-width $$BIT_WIDTH --input $< --output $@
|
||||
|
||||
%.elf.objdump.addr: %.elf.objdump
|
||||
%.objdump.addr: %.objdump
|
||||
extractFunctionRadix.sh $<
|
||||
|
||||
%.elf.objdump: %.elf
|
||||
riscv64-unknown-elf-objdump -S -D $< > $@
|
||||
%.objdump: %
|
||||
riscv64-unknown-elf-objdump -S -D $< > $@
|
||||
|
@ -70,7 +70,7 @@ module FunctionName import cvw::*; #(parameter cvw_t P) (
|
||||
|
||||
begin
|
||||
if ( pc == 0 ) begin
|
||||
// *** want to keep the old value for mid and minval
|
||||
// want to keep the old value for mid and minval
|
||||
mid = 0;
|
||||
return;
|
||||
end
|
||||
|
@ -22,333 +22,418 @@
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// decode the instruction name, to help the test bench
|
||||
module instrNameDecTB(
|
||||
module instrNameDecTB #(parameter XLEN) (
|
||||
input logic [31:0] instr,
|
||||
output string name);
|
||||
|
||||
logic [6:0] op;
|
||||
logic funct1;
|
||||
logic [1:0] funct2;
|
||||
logic [2:0] funct3;
|
||||
logic [4:0] funct5;
|
||||
logic [6:0] funct7;
|
||||
logic [11:0] imm;
|
||||
logic [4:0] rs2, rd;
|
||||
logic [4:0] rs2, rd, CRrs2;
|
||||
logic [1:0] compressedOp;
|
||||
logic [5:0] compressed15_10;
|
||||
|
||||
|
||||
assign op = instr[6:0];
|
||||
assign funct1 = instr[6];
|
||||
assign funct2 = instr[6:5];
|
||||
assign funct3 = instr[14:12];
|
||||
assign funct5 = instr[6:2];
|
||||
assign funct7 = instr[31:25];
|
||||
assign imm = instr[31:20];
|
||||
assign rs2 = instr[24:20];
|
||||
assign rd = instr[11:7];
|
||||
assign compressedOp = instr[1:0];
|
||||
assign compressed15_10 = instr[15:10];
|
||||
assign CRrs2 = instr[6:2];
|
||||
|
||||
// it would be nice to add the operands to the name
|
||||
// create another variable called decoded
|
||||
|
||||
always_comb
|
||||
casez({op, funct3})
|
||||
10'b0000000_000: name = "BAD";
|
||||
10'b0000011_000: name = "LB";
|
||||
10'b0000011_001: name = "LH";
|
||||
10'b0000011_010: name = "LW";
|
||||
10'b0000011_011: name = "LD";
|
||||
10'b0000011_100: name = "LBU";
|
||||
10'b0000011_101: name = "LHU";
|
||||
10'b0000011_110: name = "LWU";
|
||||
10'b0010011_000: if (instr[31:15] == 0 & instr[11:7] ==0) name = "NOP/FLUSH";
|
||||
else name = "ADDI";
|
||||
10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI";
|
||||
else if (funct7[6:1] == 6'b010010) name = "BCLRI";
|
||||
else if (funct7[6:1] == 6'b011010) name = "BINVI";
|
||||
else if (funct7[6:1] == 6'b001010) name = "BSETI";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b01111) name = "ZIP";
|
||||
else if (funct7 == 7'b0011000 & rs2 == 5'b00000) name = "AES64IM";
|
||||
else if (funct7 == 7'b0011000 & rs2[4] == 1'b1) name = "AES64KS1I";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00010) name = "SHA256SIG0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00011) name = "SHA256SIG1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00000) name = "SHA256SUM0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00001) name = "SHA256SUM1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00110) name = "SHA512SIG0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00111) name = "SHA512SIG1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00100) name = "SHA512SUM0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00101) name = "SHA512SUM1";
|
||||
else if (funct7 == 7'b0110000) begin
|
||||
case (rs2)
|
||||
5'b00000: name = "CLZ";
|
||||
5'b00010: name = "CPOP";
|
||||
5'b00001: name = "CTZ";
|
||||
5'b00100: name = "SEXT.B";
|
||||
5'b00101: name = "SEXT.H";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
end else name = "ILLEGAL";
|
||||
10'b0010011_010: name = "SLTI";
|
||||
10'b0010011_011: name = "SLTIU";
|
||||
10'b0010011_100: name = "XORI";
|
||||
10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI";
|
||||
else if (funct7[6:1] == 6'b010000) name = "SRAI";
|
||||
else if (funct7[6:1] == 6'b011010 & rs2 == 5'b11000) name = "REV8";
|
||||
else if (funct7[6:1] == 6'b011000) name = "RORI";
|
||||
else if (funct7[6:1] == 6'b010010) name = "BEXTI";
|
||||
else if (funct7 == 7'b0010100 & rs2 == 5'b00111) name = "ORC.B";
|
||||
else if (imm == 12'b011010000111) name = "BREV8";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b01111) name = "UNZIP";
|
||||
else name = "ILLEGAL";
|
||||
10'b0010011_110: if (rd == 0 & rs2 == 0) name = "PREFETCH.I";
|
||||
else if (rd == 0 & rs2 == 1) name = "PREFETCH.R";
|
||||
else if (rd == 0 & rs2 == 3) name = "PREFETCH.W";
|
||||
else name = "ORI";
|
||||
10'b0010011_111: name = "ANDI";
|
||||
10'b0010111_???: name = "AUIPC";
|
||||
10'b0100011_000: name = "SB";
|
||||
10'b0100011_001: name = "SH";
|
||||
10'b0100011_010: name = "SW";
|
||||
10'b0100011_011: name = "SD";
|
||||
10'b0011011_000: name = "ADDIW";
|
||||
10'b0011011_001: if (funct7 == 7'b0000000 )name = "SLLIW";
|
||||
else if (funct7[6:1] == 6'b000010) name = "SLLI.UW";
|
||||
else if (funct7 == 7'b0110000) begin
|
||||
case (rs2)
|
||||
5'b00000: name = "CLZW";
|
||||
5'b00010: name = "CPOPW";
|
||||
5'b00001: name = "CTZW";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
end else name = "ILLEGAL";
|
||||
10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW";
|
||||
else if (funct7 == 7'b0100000) name = "SRAIW";
|
||||
else if (funct7 == 7'b0110000) name = "RORIW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW";
|
||||
else if (funct7 == 7'b0100000) name = "SUBW";
|
||||
else if (funct7 == 7'b0000001) name = "MULW";
|
||||
else if (funct7 == 7'b0000100) name = "ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW";
|
||||
else if (funct7 == 7'b0000001) name = "DIVW";
|
||||
else if (funct7 == 7'b0110000) name = "ROLW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_010: if (funct7 == 7'b0010000) name = "SH1ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_100: if (funct7 == 7'b0010000) name = "SH2ADD.UW";
|
||||
else if (funct7 == 7'b0000100) name = "ZEXT.H";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW";
|
||||
else if (funct7 == 7'b0100000) name = "SRAW";
|
||||
else if (funct7 == 7'b0000001) name = "DIVUW";
|
||||
else if (funct7 == 7'b0110000) name = "RORW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW";
|
||||
else if (funct7 == 7'b0010000) name = "SH3ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD";
|
||||
else if (funct7 == 7'b0000001) name = "MUL";
|
||||
else if (funct7 == 7'b0100000) name = "SUB";
|
||||
else if (funct7[4:0] == 5'b10101) name = "AES32DSI";
|
||||
else if (funct7[4:0] == 5'b10111) name = "AES32DSMI";
|
||||
else if (funct7 == 7'b0011101) name = "AES64DS";
|
||||
else if (funct7 == 7'b0011111) name = "AES64DSM";
|
||||
else if (funct7[4:0] == 5'b10001) name = "AES32ESI";
|
||||
else if (funct7[4:0] == 5'b10011) name = "AES32ESMI";
|
||||
else if (funct7 == 7'b0011001) name = "AES64ES";
|
||||
else if (funct7 == 7'b0011011) name = "AES64ESM";
|
||||
else if (funct7 == 7'b0111111) name = "AES64KS2";
|
||||
else if (funct7 == 7'b0101110) name = "SHA512SIG0H";
|
||||
else if (funct7 == 7'b0101010) name = "SHA512SIG0L";
|
||||
else if (funct7 == 7'b0101111) name = "SHA512SIG1H";
|
||||
else if (funct7 == 7'b0101011) name = "SHA512SIG1L";
|
||||
else if (funct7 == 7'b0101000) name = "SHA512SUM0R";
|
||||
else if (funct7 == 7'b0101001) name = "SHA512SUM1R";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL";
|
||||
else if (funct7 == 7'b0000001) name = "MULH";
|
||||
else if (funct7 == 7'b0110000) name = "ROL";
|
||||
else if (funct7 == 7'b0000101) name = "CLMUL";
|
||||
else if (funct7 == 7'b0100100) name = "BCLR";
|
||||
else if (funct7 == 7'b0110100) name = "BINV";
|
||||
else if (funct7 == 7'b0010100) name = "BSET";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT";
|
||||
else if (funct7 == 7'b0000001) name = "MULHSU";
|
||||
else if (funct7 == 7'b0010000) name = "SH1ADD";
|
||||
else if (funct7 == 7'b0000101) name = "CLMULR";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU";
|
||||
else if (funct7 == 7'b0000001) name = "MULHU";
|
||||
else if (funct7 == 7'b0000101) name = "CLMULH";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR";
|
||||
else if (funct7 == 7'b0000001) name = "DIV";
|
||||
else if (funct7 == 7'b0010000) name = "SH2ADD";
|
||||
else if (funct7 == 7'b0000101) name = "MIN";
|
||||
else if (funct7 == 7'b0100000) name = "ORN";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b00000) name = "ZEXT.H";
|
||||
else if (funct7 == 7'b0000100 & op == 7'b0110011) name = "PACK";
|
||||
else if (funct7 == 7'b0000100 & op == 7'b0111011) name = "PACKW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL";
|
||||
else if (funct7 == 7'b0000001) name = "DIVU";
|
||||
else if (funct7 == 7'b0100000) name = "SRA";
|
||||
else if (funct7 == 7'b0000101) name = "MINU";
|
||||
else if (funct7 == 7'b0110000) name = "ROR";
|
||||
else if (funct7 == 7'b0100100) name = "BEXT";
|
||||
else if (funct7 == 7'b0000111) name = "CZERO.EQZ";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_110: if (funct7 == 7'b0000000) name = "OR";
|
||||
else if (funct7 == 7'b0000001) name = "REM";
|
||||
else if (funct7 == 7'b0010000) name = "SH3ADD";
|
||||
else if (funct7 == 7'b0000101) name = "MAX";
|
||||
else if (funct7 == 7'b0100000) name = "XNOR";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_111: if (funct7 == 7'b0000000) name = "AND";
|
||||
else if (funct7 == 7'b0000001) name = "REMU";
|
||||
else if (funct7 == 7'b0000101) name = "MAXU";
|
||||
else if (funct7 == 7'b0100000) name = "ANDN";
|
||||
else if (funct7 == 7'b0000111) name = "CZERO.NEZ";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110111_???: name = "LUI";
|
||||
10'b1100011_000: name = "BEQ";
|
||||
10'b1100011_001: name = "BNE";
|
||||
10'b1100011_100: name = "BLT";
|
||||
10'b1100011_101: name = "BGE";
|
||||
10'b1100011_110: name = "BLTU";
|
||||
10'b1100011_111: name = "BGEU";
|
||||
10'b1100111_000: name = "JALR";
|
||||
10'b1101111_???: name = "JAL";
|
||||
10'b1110011_000: if (imm == 0) name = "ECALL";
|
||||
else if (imm == 1) name = "EBREAK";
|
||||
else if (imm == 258) name = "SRET";
|
||||
else if (imm == 770) name = "MRET";
|
||||
else if (funct7 == 9) name = "SFENCE.VMA";
|
||||
else if (imm == 261) name = "WFI";
|
||||
else name = "ILLEGAL";
|
||||
10'b1110011_001: name = "CSRRW";
|
||||
10'b1110011_010: name = "CSRRS";
|
||||
10'b1110011_011: name = "CSRRC";
|
||||
10'b1110011_101: name = "CSRRWI";
|
||||
10'b1110011_110: name = "CSRRSI";
|
||||
10'b1110011_111: name = "CSRRCI";
|
||||
10'b0101111_010: if (funct7[6:2] == 5'b00010) name = "LR.W";
|
||||
else if (funct7[6:2] == 5'b00011) name = "SC.W";
|
||||
else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.W";
|
||||
else if (funct7[6:2] == 5'b00000) name = "AMOADD.W";
|
||||
else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.W";
|
||||
else if (funct7[6:2] == 5'b01100) name = "AMOAND.W";
|
||||
else if (funct7[6:2] == 5'b01000) name = "AMOOR.W";
|
||||
else if (funct7[6:2] == 5'b10000) name = "AMOMIN.W";
|
||||
else if (funct7[6:2] == 5'b10100) name = "AMOMAX.W";
|
||||
else if (funct7[6:2] == 5'b11000) name = "AMOMINU.W";
|
||||
else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.W";
|
||||
else name = "ILLEGAL";
|
||||
10'b0101111_011: if (funct7[6:2] == 5'b00010) name = "LR.D";
|
||||
else if (funct7[6:2] == 5'b00011) name = "SC.D";
|
||||
else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.D";
|
||||
else if (funct7[6:2] == 5'b00000) name = "AMOADD.D";
|
||||
else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.D";
|
||||
else if (funct7[6:2] == 5'b01100) name = "AMOAND.D";
|
||||
else if (funct7[6:2] == 5'b01000) name = "AMOOR.D";
|
||||
else if (funct7[6:2] == 5'b10000) name = "AMOMIN.D";
|
||||
else if (funct7[6:2] == 5'b10100) name = "AMOMAX.D";
|
||||
else if (funct7[6:2] == 5'b11000) name = "AMOMINU.D";
|
||||
else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.D";
|
||||
else name = "ILLEGAL";
|
||||
10'b0001111_000: name = "FENCE";
|
||||
10'b0001111_001: name = "FENCE.I";
|
||||
10'b0001111_010: if (instr[31:20] == 12'd0) name = "CBO.INVAL";
|
||||
else if (instr[31:20] == 12'd1) name = "CBO.CLEAN";
|
||||
else if (instr[31:20] == 12'd2) name = "CBO.FLUSH";
|
||||
else if (instr[31:20] == 12'd4) name = "CBO.ZERO";
|
||||
else name = "ILLEGAL";
|
||||
10'b1000011_???: name = "FMADD";
|
||||
10'b1000111_???: name = "FMSUB";
|
||||
10'b1001011_???: name = "FNMSUB";
|
||||
10'b1001111_???: name = "FNMADD";
|
||||
10'b1010011_???: if (funct7[6:2] == 5'b00000) name = "FADD";
|
||||
else if (funct7[6:2] == 5'b00001) name = "FSUB";
|
||||
else if (funct7[6:2] == 5'b00010) name = "FMUL";
|
||||
else if (funct7[6:2] == 5'b00011) name = "FDIV";
|
||||
else if (funct7[6:2] == 5'b01011) name = "FSQRT";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00000) name = "FCVT.W.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00001) name = "FCVT.WU.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00010) name = "FCVT.L.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00011) name = "FCVT.LU.S";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00000) name = "FCVT.S.W";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00001) name = "FCVT.S.WU";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00010) name = "FCVT.S.L";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00011) name = "FCVT.S.LU";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00000) name = "FCVT.W.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00001) name = "FCVT.WU.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00010) name = "FCVT.L.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00011) name = "FCVT.LU.D";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00000) name = "FCVT.D.W";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00001) name = "FCVT.D.WU";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00010) name = "FCVT.D.L";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00011) name = "FCVT.D.LU";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00001) name = "FCVT.S.D";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00000) name = "FCVT.D.S";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00000) name = "FCVT.W.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00001) name = "FCVT.WU.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00010) name = "FCVT.L.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00011) name = "FCVT.LU.H";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00000) name = "FCVT.H.W";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00001) name = "FCVT.H.WU";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00010) name = "FCVT.H.L";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00011) name = "FCVT.H.LU";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00000) name = "FCVT.W.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00001) name = "FCVT.WU.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00010) name = "FCVT.L.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00011) name = "FCVT.LU.Q";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00000) name = "FCVT.Q.W";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00001) name = "FCVT.Q.WU";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00010) name = "FCVT.Q.L";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00011) name = "FCVT.Q.LU";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00001) name = "FCVT.S.D";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00010) name = "FCVT.S.H";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00011) name = "FCVT.S.Q";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00000) name = "FCVT.D.S";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00010) name = "FCVT.D.H";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00011) name = "FCVT.D.Q";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00000) name = "FCVT.H.S";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00001) name = "FCVT.H.D";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00011) name = "FCVT.H.Q";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00000) name = "FCVT.Q.S";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00001) name = "FCVT.Q.D";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00010) name = "FCVT.Q.H";
|
||||
else if (funct7 == 7'b1110000 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.W";
|
||||
else if (funct7 == 7'b1111000 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.W.X";
|
||||
else if (funct7 == 7'b1110001 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.D";
|
||||
else if (funct7 == 7'b1111001 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.D.X";
|
||||
else if (funct7 == 7'b1110010 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.H";
|
||||
else if (funct7 == 7'b1111010 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.H.X";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b000) name = "FSGNJ";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b000) name = "FMIN";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b000) name = "FLE";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b001) name = "FSGNJN";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b001) name = "FMAX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b001) name = "FLT";
|
||||
else if (funct7[6:2] == 5'b11100 & funct3 == 3'b001) name = "FCLASS";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b010) name = "FSGNJX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b010) name = "FEQ";
|
||||
else if (funct7[6:2] == 5'b11110 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FLI";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b010) name = "FMINM";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b011) name = "FMAXM";
|
||||
else if (funct7[6:2] == 5'b01000 & rs2 == 5'b00100) name = "FROUND";
|
||||
else if (funct7[6:2] == 5'b01000 & rs2 == 5'b00101) name = "FROUNDNX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b100) name = "FLEQ";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b101) name = "FLTQ";
|
||||
else if (funct7 == 7'b1110001 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FMVH.X.D";
|
||||
else if (funct7 == 7'b1110011 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FMVH.X.Q";
|
||||
else if (funct7 == 7'b1011001 & funct3 == 3'b000) name = "FMVP.D.X";
|
||||
else if (funct7 == 7'b1011011 & funct3 == 3'b000) name = "FMVP.Q.X";
|
||||
else if (funct7 == 7'b1100001 & funct3 == 3'b001 & rs2 == 5'b01000) name = "FCVTMOD.W.D";
|
||||
else name = "ILLEGAL";
|
||||
10'b0000111_001: name = "FLH";
|
||||
10'b0000111_010: name = "FLW";
|
||||
10'b0000111_011: name = "FLD";
|
||||
10'b0000111_100: name = "FLQ";
|
||||
10'b0100111_001: name = "FSH";
|
||||
10'b0100111_010: name = "FSW";
|
||||
10'b0100111_011: name = "FSD";
|
||||
10'b0100111_100: name = "FSQ";
|
||||
default: name = "ILLEGAL";
|
||||
always_comb
|
||||
case (compressedOp)
|
||||
2'b00:
|
||||
casez (compressed15_10)
|
||||
6'b000???: if (instr[12:5] != 8'b0) name = "C.ADDI4SPN";
|
||||
else if(compressed15_10 == 6'b000000 & op == 7'b0000000 & funct3 == 3'b000) name = "BAD";
|
||||
6'b010???: name = "C.LW";
|
||||
6'b110???: name = "C.SW";
|
||||
6'b011???: if (XLEN == 32'd32) name = "C.FLW";
|
||||
else name = "C.LD";
|
||||
6'b111???: if (XLEN == 32'd32) name = "C.FSW";
|
||||
else name = "C.SD";
|
||||
6'b100000: name = "C.LBU";
|
||||
6'b100001: if (funct1 == 1'b1) name = "C.LH";
|
||||
else if (funct1 == 1'b0) name = "C.LHU";
|
||||
6'b100010: name = "C.SB";
|
||||
6'b100011: if (funct1 == 1'b0) name = "C.SH";
|
||||
6'b001???: name = "C.FLD";
|
||||
6'b101???: name = "C.FSD";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
2'b01:
|
||||
casez (compressed15_10)
|
||||
6'b000???: if (instr[12:10] == 3'b0 & rd == 5'b00000 & instr[6:2] == 5'b00000) name = "C.NOP";
|
||||
else if (rd != 5'b00000 & instr[6:2] != 5'b00000) name = "C.ADDI";
|
||||
6'b010???: if (rd != 5'b00000) name = "C.LI";
|
||||
6'b011???: if (rd != 5'b00000 & rd != 5'b00010 & instr[6:2] != 5'b00000) name = "C.LUI";
|
||||
else if (rd == 5'b00010 & instr[6:2] != 5'b00000) name = "C.ADDI16SP";
|
||||
6'b100?00: name = "C.SRLI";
|
||||
6'b100?01: name = "C.SRAI";
|
||||
6'b100?10: name = "C.ANDI";
|
||||
6'b100011: if (funct2 == 2'b00) name = "C.SUB";
|
||||
else if (funct2 == 2'b01) name = "C.XOR";
|
||||
else if (funct2 == 2'b10) name = "C.OR";
|
||||
else if (funct2 == 2'b11) name = "C.AND";
|
||||
6'b101???: name = "C.J";
|
||||
6'b110???: name = "C.BEQZ";
|
||||
6'b111???: name = "C.BNEZ";
|
||||
6'b001???: if (XLEN == 32'd32) name = "C.JAL";
|
||||
else if (XLEN == 32'd64 & rd != 5'b00000) name = "C.ADDIW";
|
||||
6'b100111: if (XLEN == 32'd64 & funct2 == 2'b00) name = "C.SUBW";
|
||||
else if (XLEN == 32'd64 & funct2 == 2'b01) name = "C.ADDW";
|
||||
else if (funct5 == 5'b11000) name = "C.ZEXT.B";
|
||||
else if (funct5 == 5'b11001) name = "C.SEXT.B";
|
||||
else if (funct5 == 5'b11010) name = "C.ZEXT.H";
|
||||
else if (funct5 == 5'b11011) name = "C.SEXT.H";
|
||||
else if (funct5 == 5'b11101) name = "C.NOT";
|
||||
else if (funct2 == 2'b10) name = "C.MUL";
|
||||
else if (funct5 == 5'b11100) name = "C.ZEXT.W";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
2'b10:
|
||||
casez (compressed15_10)
|
||||
6'b000???: if (rd != 5'b00000) name = "C.SLLI";
|
||||
6'b010???: if (rd != 5'b00000) name = "C.LWSP";
|
||||
6'b1000??: if (rd != 5'b00000 & CRrs2 == 5'b00000 ) name = "C.JR";
|
||||
else if (rd != 5'b00000 & CRrs2 != 5'b00000 ) name = "C.MV";
|
||||
6'b1001??: if (rd == 5'b00000 & CRrs2 == 5'b00000 ) name = "C.EBREAK";
|
||||
else if (rd != 5'b00000 & CRrs2 == 5'b00000 ) name = "C.JALR";
|
||||
else if (rd != 5'b00000 & CRrs2 != 5'b00000 ) name = "C.ADD";
|
||||
6'b110???: name = "C.SWSP";
|
||||
6'b011???: if (XLEN == 32'd32) name = "C.FLWSP";
|
||||
else if (rd != 5'b00000) name = "C.LDSP";
|
||||
6'b111???: if (XLEN == 32'd32) name = "C.FSWSP";
|
||||
else name = "C.SDSP";
|
||||
6'b001???: name = "C.FLDSP";
|
||||
6'b101???: name = "C.FSDSP";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
2'b11:
|
||||
casez({op, funct3})
|
||||
10'b0000011_000: name = "LB";
|
||||
10'b0000011_001: name = "LH";
|
||||
10'b0000011_010: name = "LW";
|
||||
10'b0000011_011: name = "LD";
|
||||
10'b0000011_100: name = "LBU";
|
||||
10'b0000011_101: name = "LHU";
|
||||
10'b0000011_110: name = "LWU";
|
||||
10'b0010011_000: if (instr[31:15] == 0 & instr[11:7] ==0) name = "NOP/FLUSH";
|
||||
else name = "ADDI";
|
||||
10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI";
|
||||
else if (funct7[6:1] == 6'b010010) name = "BCLRI";
|
||||
else if (funct7[6:1] == 6'b011010) name = "BINVI";
|
||||
else if (funct7[6:1] == 6'b001010) name = "BSETI";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b01111) name = "ZIP";
|
||||
else if (funct7 == 7'b0011000 & rs2 == 5'b00000) name = "AES64IM";
|
||||
else if (funct7 == 7'b0011000 & rs2[4] == 1'b1) name = "AES64KS1I";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00010) name = "SHA256SIG0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00011) name = "SHA256SIG1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00000) name = "SHA256SUM0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00001) name = "SHA256SUM1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00110) name = "SHA512SIG0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00111) name = "SHA512SIG1";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00100) name = "SHA512SUM0";
|
||||
else if (funct7 == 7'b0001000 & rs2 == 5'b00101) name = "SHA512SUM1";
|
||||
else if (funct7 == 7'b0110000) begin
|
||||
case (rs2)
|
||||
5'b00000: name = "CLZ";
|
||||
5'b00010: name = "CPOP";
|
||||
5'b00001: name = "CTZ";
|
||||
5'b00100: name = "SEXT.B";
|
||||
5'b00101: name = "SEXT.H";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
end else name = "ILLEGAL";
|
||||
10'b0010011_010: name = "SLTI";
|
||||
10'b0010011_011: name = "SLTIU";
|
||||
10'b0010011_100: name = "XORI";
|
||||
10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI";
|
||||
else if (funct7[6:1] == 6'b010000) name = "SRAI";
|
||||
else if (funct7[6:1] == 6'b011010 & rs2 == 5'b11000) name = "REV8";
|
||||
else if (funct7[6:1] == 6'b011000) name = "RORI";
|
||||
else if (funct7[6:1] == 6'b010010) name = "BEXTI";
|
||||
else if (funct7 == 7'b0010100 & rs2 == 5'b00111) name = "ORC.B";
|
||||
else if (imm == 12'b011010000111) name = "BREV8";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b01111) name = "UNZIP";
|
||||
else name = "ILLEGAL";
|
||||
10'b0010011_110: if (rd == 0 & rs2 == 0) name = "PREFETCH.I";
|
||||
else if (rd == 0 & rs2 == 1) name = "PREFETCH.R";
|
||||
else if (rd == 0 & rs2 == 3) name = "PREFETCH.W";
|
||||
else name = "ORI";
|
||||
10'b0010011_111: name = "ANDI";
|
||||
10'b0010111_???: name = "AUIPC";
|
||||
10'b0100011_000: name = "SB";
|
||||
10'b0100011_001: name = "SH";
|
||||
10'b0100011_010: name = "SW";
|
||||
10'b0100011_011: name = "SD";
|
||||
10'b0011011_000: name = "ADDIW";
|
||||
10'b0011011_001: if (funct7 == 7'b0000000 )name = "SLLIW";
|
||||
else if (funct7[6:1] == 6'b000010) name = "SLLI.UW";
|
||||
else if (funct7 == 7'b0110000) begin
|
||||
case (rs2)
|
||||
5'b00000: name = "CLZW";
|
||||
5'b00010: name = "CPOPW";
|
||||
5'b00001: name = "CTZW";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
end else name = "ILLEGAL";
|
||||
10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW";
|
||||
else if (funct7 == 7'b0100000) name = "SRAIW";
|
||||
else if (funct7 == 7'b0110000) name = "RORIW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW";
|
||||
else if (funct7 == 7'b0100000) name = "SUBW";
|
||||
else if (funct7 == 7'b0000001) name = "MULW";
|
||||
else if (funct7 == 7'b0000100) name = "ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_001: if (funct7 == 7'b0000000) name = "SLLW";
|
||||
else if (funct7 == 7'b0000001) name = "DIVW";
|
||||
else if (funct7 == 7'b0110000) name = "ROLW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_010: if (funct7 == 7'b0010000) name = "SH1ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_100: if (funct7 == 7'b0010000) name = "SH2ADD.UW";
|
||||
else if (funct7 == 7'b0000100) name = "ZEXT.H";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW";
|
||||
else if (funct7 == 7'b0100000) name = "SRAW";
|
||||
else if (funct7 == 7'b0000001) name = "DIVUW";
|
||||
else if (funct7 == 7'b0110000) name = "RORW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_110: if (funct7 == 7'b0000001) name = "REMW";
|
||||
else if (funct7 == 7'b0010000) name = "SH3ADD.UW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0111011_111: if (funct7 == 7'b0000001) name = "REMUW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD";
|
||||
else if (funct7 == 7'b0000001) name = "MUL";
|
||||
else if (funct7 == 7'b0100000) name = "SUB";
|
||||
else if (funct7[4:0] == 5'b10101) name = "AES32DSI";
|
||||
else if (funct7[4:0] == 5'b10111) name = "AES32DSMI";
|
||||
else if (funct7 == 7'b0011101) name = "AES64DS";
|
||||
else if (funct7 == 7'b0011111) name = "AES64DSM";
|
||||
else if (funct7[4:0] == 5'b10001) name = "AES32ESI";
|
||||
else if (funct7[4:0] == 5'b10011) name = "AES32ESMI";
|
||||
else if (funct7 == 7'b0011001) name = "AES64ES";
|
||||
else if (funct7 == 7'b0011011) name = "AES64ESM";
|
||||
else if (funct7 == 7'b0111111) name = "AES64KS2";
|
||||
else if (funct7 == 7'b0101110) name = "SHA512SIG0H";
|
||||
else if (funct7 == 7'b0101010) name = "SHA512SIG0L";
|
||||
else if (funct7 == 7'b0101111) name = "SHA512SIG1H";
|
||||
else if (funct7 == 7'b0101011) name = "SHA512SIG1L";
|
||||
else if (funct7 == 7'b0101000) name = "SHA512SUM0R";
|
||||
else if (funct7 == 7'b0101001) name = "SHA512SUM1R";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL";
|
||||
else if (funct7 == 7'b0000001) name = "MULH";
|
||||
else if (funct7 == 7'b0110000) name = "ROL";
|
||||
else if (funct7 == 7'b0000101) name = "CLMUL";
|
||||
else if (funct7 == 7'b0100100) name = "BCLR";
|
||||
else if (funct7 == 7'b0110100) name = "BINV";
|
||||
else if (funct7 == 7'b0010100) name = "BSET";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT";
|
||||
else if (funct7 == 7'b0000001) name = "MULHSU";
|
||||
else if (funct7 == 7'b0010000) name = "SH1ADD";
|
||||
else if (funct7 == 7'b0000101) name = "CLMULR";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU";
|
||||
else if (funct7 == 7'b0000001) name = "MULHU";
|
||||
else if (funct7 == 7'b0000101) name = "CLMULH";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR";
|
||||
else if (funct7 == 7'b0000001) name = "DIV";
|
||||
else if (funct7 == 7'b0010000) name = "SH2ADD";
|
||||
else if (funct7 == 7'b0000101) name = "MIN";
|
||||
else if (funct7 == 7'b0100000) name = "ORN";
|
||||
else if (funct7 == 7'b0000100 & rs2 == 5'b00000) name = "ZEXT.H";
|
||||
else if (funct7 == 7'b0000100 & op == 7'b0110011) name = "PACK";
|
||||
else if (funct7 == 7'b0000100 & op == 7'b0111011) name = "PACKW";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL";
|
||||
else if (funct7 == 7'b0000001) name = "DIVU";
|
||||
else if (funct7 == 7'b0100000) name = "SRA";
|
||||
else if (funct7 == 7'b0000101) name = "MINU";
|
||||
else if (funct7 == 7'b0110000) name = "ROR";
|
||||
else if (funct7 == 7'b0100100) name = "BEXT";
|
||||
else if (funct7 == 7'b0000111) name = "CZERO.EQZ";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_110: if (funct7 == 7'b0000000) name = "OR";
|
||||
else if (funct7 == 7'b0000001) name = "REM";
|
||||
else if (funct7 == 7'b0010000) name = "SH3ADD";
|
||||
else if (funct7 == 7'b0000101) name = "MAX";
|
||||
else if (funct7 == 7'b0100000) name = "XNOR";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110011_111: if (funct7 == 7'b0000000) name = "AND";
|
||||
else if (funct7 == 7'b0000001) name = "REMU";
|
||||
else if (funct7 == 7'b0000101) name = "MAXU";
|
||||
else if (funct7 == 7'b0100000) name = "ANDN";
|
||||
else if (funct7 == 7'b0000111) name = "CZERO.NEZ";
|
||||
else name = "ILLEGAL";
|
||||
10'b0110111_???: name = "LUI";
|
||||
10'b1100011_000: name = "BEQ";
|
||||
10'b1100011_001: name = "BNE";
|
||||
10'b1100011_100: name = "BLT";
|
||||
10'b1100011_101: name = "BGE";
|
||||
10'b1100011_110: name = "BLTU";
|
||||
10'b1100011_111: name = "BGEU";
|
||||
10'b1100111_000: name = "JALR";
|
||||
10'b1101111_???: name = "JAL";
|
||||
10'b1110011_000: if (imm == 0) name = "ECALL";
|
||||
else if (imm == 1) name = "EBREAK";
|
||||
else if (imm == 258) name = "SRET";
|
||||
else if (imm == 770) name = "MRET";
|
||||
else if (funct7 == 9) name = "SFENCE.VMA";
|
||||
else if (funct7 == 11) name = "SINVAL.VMA";
|
||||
else if (funct7 == 12 & rs2 == 0) name = "SFENCE.W.INVAL";
|
||||
else if (funct7 == 12 & rs2 == 1) name = "SFENCE.INVAL.IR";
|
||||
else if (imm == 259) name = "WFI";
|
||||
else if (imm == 261) name = "WFI";
|
||||
else name = "ILLEGAL";
|
||||
10'b1110011_001: name = "CSRRW";
|
||||
10'b1110011_010: name = "CSRRS";
|
||||
10'b1110011_011: name = "CSRRC";
|
||||
10'b1110011_101: name = "CSRRWI";
|
||||
10'b1110011_110: name = "CSRRSI";
|
||||
10'b1110011_111: name = "CSRRCI";
|
||||
10'b0101111_010: if (funct7[6:2] == 5'b00010) name = "LR.W";
|
||||
else if (funct7[6:2] == 5'b00011) name = "SC.W";
|
||||
else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.W";
|
||||
else if (funct7[6:2] == 5'b00000) name = "AMOADD.W";
|
||||
else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.W";
|
||||
else if (funct7[6:2] == 5'b01100) name = "AMOAND.W";
|
||||
else if (funct7[6:2] == 5'b01000) name = "AMOOR.W";
|
||||
else if (funct7[6:2] == 5'b10000) name = "AMOMIN.W";
|
||||
else if (funct7[6:2] == 5'b10100) name = "AMOMAX.W";
|
||||
else if (funct7[6:2] == 5'b11000) name = "AMOMINU.W";
|
||||
else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.W";
|
||||
else name = "ILLEGAL";
|
||||
10'b0101111_011: if (funct7[6:2] == 5'b00010) name = "LR.D";
|
||||
else if (funct7[6:2] == 5'b00011) name = "SC.D";
|
||||
else if (funct7[6:2] == 5'b00001) name = "AMOSWAP.D";
|
||||
else if (funct7[6:2] == 5'b00000) name = "AMOADD.D";
|
||||
else if (funct7[6:2] == 5'b00100) name = "AMOAXOR.D";
|
||||
else if (funct7[6:2] == 5'b01100) name = "AMOAND.D";
|
||||
else if (funct7[6:2] == 5'b01000) name = "AMOOR.D";
|
||||
else if (funct7[6:2] == 5'b10000) name = "AMOMIN.D";
|
||||
else if (funct7[6:2] == 5'b10100) name = "AMOMAX.D";
|
||||
else if (funct7[6:2] == 5'b11000) name = "AMOMINU.D";
|
||||
else if (funct7[6:2] == 5'b11100) name = "AMOMAXU.D";
|
||||
else name = "ILLEGAL";
|
||||
10'b0001111_000: name = "FENCE";
|
||||
10'b0001111_001: name = "FENCE.I";
|
||||
10'b0001111_010: if (instr[31:20] == 12'd0) name = "CBO.INVAL";
|
||||
else if (instr[31:20] == 12'd1) name = "CBO.CLEAN";
|
||||
else if (instr[31:20] == 12'd2) name = "CBO.FLUSH";
|
||||
else if (instr[31:20] == 12'd4) name = "CBO.ZERO";
|
||||
else name = "ILLEGAL";
|
||||
10'b1000011_???: name = "FMADD";
|
||||
10'b1000111_???: name = "FMSUB";
|
||||
10'b1001011_???: name = "FNMSUB";
|
||||
10'b1001111_???: name = "FNMADD";
|
||||
10'b1010011_???: if (funct7[6:2] == 5'b00000) name = "FADD";
|
||||
else if (funct7[6:2] == 5'b00001) name = "FSUB";
|
||||
else if (funct7[6:2] == 5'b00010) name = "FMUL";
|
||||
else if (funct7[6:2] == 5'b00011) name = "FDIV";
|
||||
else if (funct7[6:2] == 5'b01011) name = "FSQRT";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00000) name = "FCVT.W.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00001) name = "FCVT.WU.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00010) name = "FCVT.L.S";
|
||||
else if (funct7 == 7'b1100000 & rs2 == 5'b00011) name = "FCVT.LU.S";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00000) name = "FCVT.S.W";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00001) name = "FCVT.S.WU";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00010) name = "FCVT.S.L";
|
||||
else if (funct7 == 7'b1101000 & rs2 == 5'b00011) name = "FCVT.S.LU";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00000) name = "FCVT.W.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00001) name = "FCVT.WU.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00010) name = "FCVT.L.D";
|
||||
else if (funct7 == 7'b1100001 & rs2 == 5'b00011) name = "FCVT.LU.D";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00000) name = "FCVT.D.W";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00001) name = "FCVT.D.WU";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00010) name = "FCVT.D.L";
|
||||
else if (funct7 == 7'b1101001 & rs2 == 5'b00011) name = "FCVT.D.LU";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00001) name = "FCVT.S.D";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00000) name = "FCVT.D.S";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00000) name = "FCVT.W.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00001) name = "FCVT.WU.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00010) name = "FCVT.L.H";
|
||||
else if (funct7 == 7'b1100010 & rs2 == 5'b00011) name = "FCVT.LU.H";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00000) name = "FCVT.H.W";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00001) name = "FCVT.H.WU";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00010) name = "FCVT.H.L";
|
||||
else if (funct7 == 7'b1101010 & rs2 == 5'b00011) name = "FCVT.H.LU";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00000) name = "FCVT.W.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00001) name = "FCVT.WU.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00010) name = "FCVT.L.Q";
|
||||
else if (funct7 == 7'b1100011 & rs2 == 5'b00011) name = "FCVT.LU.Q";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00000) name = "FCVT.Q.W";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00001) name = "FCVT.Q.WU";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00010) name = "FCVT.Q.L";
|
||||
else if (funct7 == 7'b1101011 & rs2 == 5'b00011) name = "FCVT.Q.LU";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00001) name = "FCVT.S.D";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00010) name = "FCVT.S.H";
|
||||
else if (funct7 == 7'b0100000 & rs2 == 5'b00011) name = "FCVT.S.Q";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00000) name = "FCVT.D.S";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00010) name = "FCVT.D.H";
|
||||
else if (funct7 == 7'b0100001 & rs2 == 5'b00011) name = "FCVT.D.Q";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00000) name = "FCVT.H.S";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00001) name = "FCVT.H.D";
|
||||
else if (funct7 == 7'b0100010 & rs2 == 5'b00011) name = "FCVT.H.Q";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00000) name = "FCVT.Q.S";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00001) name = "FCVT.Q.D";
|
||||
else if (funct7 == 7'b0100011 & rs2 == 5'b00010) name = "FCVT.Q.H";
|
||||
else if (funct7 == 7'b1110000 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.W";
|
||||
else if (funct7 == 7'b1111000 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.W.X";
|
||||
else if (funct7 == 7'b1110001 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.D";
|
||||
else if (funct7 == 7'b1111001 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.D.X";
|
||||
else if (funct7 == 7'b1110010 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.X.H";
|
||||
else if (funct7 == 7'b1111010 & rs2 == 5'b00000 & funct3 == 3'b000) name = "FMV.H.X";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b000) name = "FSGNJ";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b000) name = "FMIN";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b000) name = "FLE";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b001) name = "FSGNJN";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b001) name = "FMAX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b001) name = "FLT";
|
||||
else if (funct7[6:2] == 5'b11100 & funct3 == 3'b001) name = "FCLASS";
|
||||
else if (funct7[6:2] == 5'b00100 & funct3 == 3'b010) name = "FSGNJX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b010) name = "FEQ";
|
||||
else if (funct7[6:2] == 5'b11110 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FLI";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b010) name = "FMINM";
|
||||
else if (funct7[6:2] == 5'b00101 & funct3 == 3'b011) name = "FMAXM";
|
||||
else if (funct7[6:2] == 5'b01000 & rs2 == 5'b00100) name = "FROUND";
|
||||
else if (funct7[6:2] == 5'b01000 & rs2 == 5'b00101) name = "FROUNDNX";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b100) name = "FLEQ";
|
||||
else if (funct7[6:2] == 5'b10100 & funct3 == 3'b101) name = "FLTQ";
|
||||
else if (funct7 == 7'b1110001 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FMVH.X.D";
|
||||
else if (funct7 == 7'b1110011 & funct3 == 3'b000 & rs2 == 5'b00001) name = "FMVH.X.Q";
|
||||
else if (funct7 == 7'b1011001 & funct3 == 3'b000) name = "FMVP.D.X";
|
||||
else if (funct7 == 7'b1011011 & funct3 == 3'b000) name = "FMVP.Q.X";
|
||||
else if (funct7 == 7'b1100001 & funct3 == 3'b001 & rs2 == 5'b01000) name = "FCVTMOD.W.D";
|
||||
else name = "ILLEGAL";
|
||||
10'b0000111_001: name = "FLH";
|
||||
10'b0000111_010: name = "FLW";
|
||||
10'b0000111_011: name = "FLD";
|
||||
10'b0000111_100: name = "FLQ";
|
||||
10'b0100111_001: name = "FSH";
|
||||
10'b0100111_010: name = "FSW";
|
||||
10'b0100111_011: name = "FSD";
|
||||
10'b0100111_100: name = "FSQ";
|
||||
default: name = "ILLEGAL";
|
||||
endcase
|
||||
endcase
|
||||
endmodule
|
||||
|
@ -19,7 +19,7 @@
|
||||
// and limitations under the License.
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module instrTrackerTB(
|
||||
module instrTrackerTB #(parameter XLEN) (
|
||||
input logic clk, reset, FlushE,
|
||||
input logic [31:0] InstrF, InstrD,
|
||||
input logic [31:0] InstrE, InstrM,
|
||||
@ -30,9 +30,9 @@ module instrTrackerTB(
|
||||
// stage Instr to Writeback for visualization
|
||||
// flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
||||
|
||||
instrNameDecTB fdec(InstrF, InstrFName);
|
||||
instrNameDecTB ddec(InstrD, InstrDName);
|
||||
instrNameDecTB edec(InstrE, InstrEName);
|
||||
instrNameDecTB mdec(InstrM, InstrMName);
|
||||
instrNameDecTB wdec(InstrW, InstrWName);
|
||||
instrNameDecTB #(XLEN) fdec(InstrF, InstrFName);
|
||||
instrNameDecTB #(XLEN) ddec(InstrD, InstrDName);
|
||||
instrNameDecTB #(XLEN) edec(InstrE, InstrEName);
|
||||
instrNameDecTB #(XLEN) mdec(InstrM, InstrMName);
|
||||
instrNameDecTB #(XLEN) wdec(InstrW, InstrWName);
|
||||
endmodule
|
||||
|
@ -39,7 +39,7 @@ module ramxdetector #(parameter XLEN, LLEN) (
|
||||
/* verilator lint_off WIDTHXZEXPAND */
|
||||
if (MemReadM & ~LSULoadAccessFaultM & (ReadDataM === 'bx)) begin
|
||||
/* verilator lint_on WIDTHXZEXPAND */
|
||||
$display("WARNING: Attempting to read from unitialized RAM. Processor may go haywire if it uses x value. But this is normal in WALLY-mmu tests.");
|
||||
$display("WARNING: Attempting to read from unitialized RAM. Processor may go haywire if it uses x value. But this is normal in WALLY-mmu and ExceptionInstr tests.");
|
||||
$display(" PCM = %x InstrM = %x (%s), IEUAdrM = %x", PCM, InstrM, InstrMName, IEUAdrM);
|
||||
//$stop;
|
||||
end
|
||||
|
@ -23,7 +23,7 @@
|
||||
`define NUM_REGS 32
|
||||
`define NUM_CSRS 4096
|
||||
|
||||
`define STD_LOG 1
|
||||
`define STD_LOG 0
|
||||
`define PRINT_PC_INSTR 0
|
||||
`define PRINT_MOST 0
|
||||
`define PRINT_ALL 0
|
||||
@ -44,6 +44,8 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
logic [31:0] InstrRawD, InstrRawE, InstrRawM, InstrRawW;
|
||||
logic InstrValidM, InstrValidW;
|
||||
logic StallE, StallM, StallW;
|
||||
logic GatedStallW;
|
||||
logic SelHPTW;
|
||||
logic FlushD, FlushE, FlushM, FlushW;
|
||||
logic TrapM, TrapW;
|
||||
logic HaltM, HaltW;
|
||||
@ -65,10 +67,11 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
logic InterruptM, InterruptW;
|
||||
|
||||
//For VM Verification
|
||||
logic [(P.XLEN-1):0] VAdrIM,VAdrDM,VAdrIW,VAdrDW;
|
||||
logic [(P.XLEN-1):0] PTE_iM,PTE_dM,PTE_iW,PTE_dW;
|
||||
logic [(P.PA_BITS-1):0] PAIM,PADM,PAIW,PADW;
|
||||
logic [(P.PPN_BITS-1):0] PPN_iM,PPN_dM,PPN_iW,PPN_dW;
|
||||
logic [(P.XLEN-1):0] IVAdrF,IVAdrD,IVAdrE,IVAdrM,IVAdrW,DVAdrM,DVAdrW;
|
||||
logic [(P.XLEN-1):0] IPTEF,IPTED,IPTEE,IPTEM,IPTEW,DPTEM,DPTEW;
|
||||
logic [(P.PA_BITS-1):0] IPAF,IPAD,IPAE,IPAM,IPAW,DPAM,DPAW;
|
||||
logic [(P.PPN_BITS-1):0] IPPNF,IPPND,IPPNE,IPPNM,IPPNW,DPPNM,DPPNW;
|
||||
logic [1:0] IPageTypeF, IPageTypeD, IPageTypeE, IPageTypeM, IPageTypeW, DPageTypeM, DPageTypeW;
|
||||
logic ReadAccessM,WriteAccessM,ReadAccessW,WriteAccessW;
|
||||
logic ExecuteAccessF,ExecuteAccessD,ExecuteAccessE,ExecuteAccessM,ExecuteAccessW;
|
||||
|
||||
@ -89,208 +92,224 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
assign StallE = testbench.dut.core.StallE;
|
||||
assign StallM = testbench.dut.core.StallM;
|
||||
assign StallW = testbench.dut.core.StallW;
|
||||
assign GatedStallW = testbench.dut.core.lsu.GatedStallW;
|
||||
assign SelHPTW = testbench.dut.core.lsu.hptw.hptw.SelHPTW;
|
||||
assign FlushD = testbench.dut.core.FlushD;
|
||||
assign FlushE = testbench.dut.core.FlushE;
|
||||
assign FlushM = testbench.dut.core.FlushM;
|
||||
assign FlushW = testbench.dut.core.FlushW;
|
||||
assign TrapM = testbench.dut.core.TrapM;
|
||||
assign HaltM = testbench.DCacheFlushStart;
|
||||
assign PrivilegeModeW = testbench.dut.core.priv.priv.privmode.PrivilegeModeW;
|
||||
assign STATUS_SXL = testbench.dut.core.priv.priv.csr.csrsr.STATUS_SXL;
|
||||
assign STATUS_UXL = testbench.dut.core.priv.priv.csr.csrsr.STATUS_UXL;
|
||||
assign wfiM = testbench.dut.core.priv.priv.wfiM;
|
||||
assign InterruptM = testbench.dut.core.priv.priv.InterruptM;
|
||||
if (P.ZICSR_SUPPORTED) begin
|
||||
assign PrivilegeModeW = testbench.dut.core.priv.priv.privmode.PrivilegeModeW;
|
||||
assign STATUS_SXL = testbench.dut.core.priv.priv.csr.csrsr.STATUS_SXL;
|
||||
assign STATUS_UXL = testbench.dut.core.priv.priv.csr.csrsr.STATUS_UXL;
|
||||
assign wfiM = testbench.dut.core.priv.priv.wfiM;
|
||||
assign InterruptM = testbench.dut.core.priv.priv.InterruptM;
|
||||
end else begin
|
||||
assign PrivilegeModeW = 2'b11;
|
||||
assign STATUS_SXL = 0;
|
||||
assign STATUS_UXL = 0;
|
||||
assign wfiM = 0;
|
||||
assign InterruptM = 0;
|
||||
end
|
||||
|
||||
//For VM Verification
|
||||
assign VAdrIM = testbench.dut.core.ifu.immu.immu.tlb.tlb.VAdr;
|
||||
assign VAdrDM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.VAdr;
|
||||
assign PAIM = testbench.dut.core.ifu.immu.immu.PhysicalAddress;
|
||||
assign PADM = testbench.dut.core.lsu.dmmu.dmmu.PhysicalAddress;
|
||||
assign IVAdrF = testbench.dut.core.ifu.immu.immu.tlb.tlb.VAdr;
|
||||
assign DVAdrM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.VAdr;
|
||||
assign IPAF = testbench.dut.core.ifu.immu.immu.PhysicalAddress;
|
||||
assign DPAM = testbench.dut.core.lsu.dmmu.dmmu.PhysicalAddress;
|
||||
assign ReadAccessM = testbench.dut.core.lsu.dmmu.dmmu.ReadAccessM;
|
||||
assign WriteAccessM = testbench.dut.core.lsu.dmmu.dmmu.WriteAccessM;
|
||||
assign ExecuteAccessF = testbench.dut.core.ifu.immu.immu.ExecuteAccessF;
|
||||
assign PTE_iM = testbench.dut.core.ifu.immu.immu.PTE;
|
||||
assign PTE_dM = testbench.dut.core.lsu.dmmu.dmmu.PTE;
|
||||
assign PPN_iM = testbench.dut.core.ifu.immu.immu.tlb.tlb.PPN;
|
||||
assign PPN_dM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.PPN;
|
||||
assign IPTEF = testbench.dut.core.ifu.immu.immu.PTE;
|
||||
assign DPTEM = testbench.dut.core.lsu.dmmu.dmmu.PTE;
|
||||
assign IPPNF = testbench.dut.core.ifu.immu.immu.tlb.tlb.PPN;
|
||||
assign DPPNM = testbench.dut.core.lsu.dmmu.dmmu.tlb.tlb.PPN;
|
||||
assign IPageTypeF = testbench.dut.core.ifu.immu.immu.PageTypeWriteVal;
|
||||
assign DPageTypeM = testbench.dut.core.lsu.dmmu.dmmu.PageTypeWriteVal;
|
||||
|
||||
logic valid;
|
||||
|
||||
always_comb begin
|
||||
// Since we are detected the CSR change by comparing the old value we need to
|
||||
// ensure the CSR is detected when the pipeline's Writeback stage is not
|
||||
// stalled. If it is stalled we want CSRArray to hold the old value.
|
||||
if(valid) begin
|
||||
// PMPCFG CSRs (space is 0-15 3a0 - 3af)
|
||||
localparam inc = P.XLEN == 32 ? 4 : 8;
|
||||
int i, i4, i8, csrid;
|
||||
logic [P.XLEN-1:0] pmp;
|
||||
if (P.ZICSR_SUPPORTED) begin
|
||||
always_comb begin
|
||||
// Since we are detected the CSR change by comparing the old value we need to
|
||||
// ensure the CSR is detected when the pipeline's Writeback stage is not
|
||||
// stalled. If it is stalled we want CSRArray to hold the old value.
|
||||
if(valid) begin
|
||||
// PMPCFG CSRs (space is 0-15 3a0 - 3af)
|
||||
localparam inc = P.XLEN == 32 ? 4 : 8;
|
||||
int i, i4, i8, csrid;
|
||||
logic [P.XLEN-1:0] pmp;
|
||||
|
||||
for (i=0; i<P.PMP_ENTRIES; i+=inc) begin
|
||||
i4 = i / 4;
|
||||
i8 = (i / inc) * inc;
|
||||
csrid = 12'h3A0 + i4;
|
||||
pmp = 0;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+0] << 0;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+1] << 8;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+2] << 16;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+3] << 24;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+4] << 32;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+5] << 40;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+6] << 48;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+7] << 56;
|
||||
for (i=0; i<P.PMP_ENTRIES; i+=inc) begin
|
||||
i4 = i / 4;
|
||||
i8 = (i / inc) * inc;
|
||||
csrid = 12'h3A0 + i4;
|
||||
pmp = 0;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+0] << 0;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+1] << 8;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+2] << 16;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+3] << 24;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+4] << 32;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+5] << 40;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+6] << 48;
|
||||
pmp |= testbench.dut.core.priv.priv.csr.csrm.PMPCFG_ARRAY_REGW[i8+7] << 56;
|
||||
|
||||
CSRArray[csrid] = pmp;
|
||||
end
|
||||
|
||||
// PMPADDR CSRs (space is 0-63 3b0 - 3ef)
|
||||
for (i=0; i<P.PMP_ENTRIES; i++) begin
|
||||
csrid = 12'h3B0 + i;;
|
||||
pmp = testbench.dut.core.priv.priv.csr.csrm.PMPADDR_ARRAY_REGW[i];
|
||||
CSRArray[csrid] = pmp;
|
||||
end
|
||||
|
||||
// M-mode trap CSRs
|
||||
CSRArray[12'h300] = testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW;
|
||||
CSRArray[12'h302] = testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW;
|
||||
CSRArray[12'h303] = testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW;
|
||||
CSRArray[12'h304] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW;
|
||||
CSRArray[12'h305] = testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW;
|
||||
CSRArray[12'h340] = testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW;
|
||||
CSRArray[12'h341] = testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW;
|
||||
CSRArray[12'h342] = testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW;
|
||||
CSRArray[12'h343] = testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW;
|
||||
CSRArray[12'h344] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW;
|
||||
|
||||
CSRArray[csrid] = pmp;
|
||||
end
|
||||
// S-mode trap CSRs
|
||||
CSRArray[12'h100] = testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW;
|
||||
CSRArray[12'h104] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222;
|
||||
CSRArray[12'h105] = testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW;
|
||||
CSRArray[12'h140] = testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW;
|
||||
CSRArray[12'h141] = testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW;
|
||||
CSRArray[12'h142] = testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW;
|
||||
CSRArray[12'h143] = testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW;
|
||||
CSRArray[12'h144] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW;
|
||||
|
||||
// PMPADDR CSRs (space is 0-63 3b0 - 3ef)
|
||||
for (i=0; i<P.PMP_ENTRIES; i++) begin
|
||||
csrid = 12'h3B0 + i;;
|
||||
pmp = testbench.dut.core.priv.priv.csr.csrm.PMPADDR_ARRAY_REGW[i];
|
||||
CSRArray[csrid] = pmp;
|
||||
end
|
||||
// Virtual Memory CSRs
|
||||
CSRArray[12'h180] = testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW;
|
||||
|
||||
// M-mode trap CSRs
|
||||
CSRArray[12'h300] = testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW;
|
||||
CSRArray[12'h302] = testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW;
|
||||
CSRArray[12'h303] = testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW;
|
||||
CSRArray[12'h304] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW;
|
||||
CSRArray[12'h305] = testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW;
|
||||
CSRArray[12'h340] = testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW;
|
||||
CSRArray[12'h341] = testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW;
|
||||
CSRArray[12'h342] = testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW;
|
||||
CSRArray[12'h343] = testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW;
|
||||
CSRArray[12'h344] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW;
|
||||
|
||||
// S-mode trap CSRs
|
||||
CSRArray[12'h100] = testbench.dut.core.priv.priv.csr.csrs.csrs.SSTATUS_REGW;
|
||||
CSRArray[12'h104] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222;
|
||||
CSRArray[12'h105] = testbench.dut.core.priv.priv.csr.csrs.csrs.STVEC_REGW;
|
||||
CSRArray[12'h140] = testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW;
|
||||
CSRArray[12'h141] = testbench.dut.core.priv.priv.csr.csrs.csrs.SEPC_REGW;
|
||||
CSRArray[12'h142] = testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW;
|
||||
CSRArray[12'h143] = testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW;
|
||||
CSRArray[12'h144] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW;
|
||||
// Floating-Point CSRs
|
||||
CSRArray[12'h001] = testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW;
|
||||
CSRArray[12'h002] = testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW;
|
||||
CSRArray[12'h003] = {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW};
|
||||
|
||||
// Virtual Memory CSRs
|
||||
CSRArray[12'h180] = testbench.dut.core.priv.priv.csr.csrs.csrs.SATP_REGW;
|
||||
// Counters / Performance Monitoring CSRs
|
||||
CSRArray[12'h306] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW;
|
||||
CSRArray[12'h106] = testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW;
|
||||
CSRArray[12'h320] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW;
|
||||
// mhpmevent3-31 not connected (232-33F)
|
||||
CSRArray[12'hB00] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]; // MCYCLE
|
||||
CSRArray[12'hB02] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]; // MINSTRET
|
||||
// mhpmcounter3-31 not connected (B03-B1F)
|
||||
// cycle, time, instret not connected (C00-C02)
|
||||
// hpmcounter3-31 not connected (C03-C1F)
|
||||
|
||||
// Floating-Point CSRs
|
||||
CSRArray[12'h001] = testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW;
|
||||
CSRArray[12'h002] = testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW;
|
||||
CSRArray[12'h003] = {testbench.dut.core.priv.priv.csr.csru.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW};
|
||||
// Machine Information Registers and Configuration CSRs
|
||||
CSRArray[12'h301] = testbench.dut.core.priv.priv.csr.csrm.MISA_REGW;
|
||||
CSRArray[12'h30A] = testbench.dut.core.priv.priv.csr.csrm.MENVCFG_REGW;
|
||||
CSRArray[12'h10A] = testbench.dut.core.priv.priv.csr.csrs.csrs.SENVCFG_REGW;
|
||||
CSRArray[12'h747] = 0; // mseccfg
|
||||
CSRArray[12'hF11] = 0; //mvendorid
|
||||
CSRArray[12'hF12] = 0; // marchid
|
||||
CSRArray[12'hF13] = {{P.XLEN-12{1'b0}}, 12'h100}; // mimpid
|
||||
CSRArray[12'hF14] = testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW;
|
||||
CSRArray[12'hF15] = 0; //mconfigptr
|
||||
|
||||
// Counters / Performance Monitoring CSRs
|
||||
CSRArray[12'h306] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW;
|
||||
CSRArray[12'h106] = testbench.dut.core.priv.priv.csr.csrs.csrs.SCOUNTEREN_REGW;
|
||||
CSRArray[12'h320] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW;
|
||||
// mhpmevent3-31 not connected (232-33F)
|
||||
CSRArray[12'hB00] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]; // MCYCLE
|
||||
CSRArray[12'hB02] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]; // MINSTRET
|
||||
// mhpmcounter3-31 not connected (B03-B1F)
|
||||
// cycle, time, instret not connected (C00-C02)
|
||||
// hpmcounter3-31 not connected (C03-C1F)
|
||||
// Sstc CSRs
|
||||
CSRArray[12'h14D] = testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0];
|
||||
|
||||
// Zkr CSRs
|
||||
// seed not connected (015)
|
||||
|
||||
// Machine Information Registers and Configuration CSRs
|
||||
CSRArray[12'h301] = testbench.dut.core.priv.priv.csr.csrm.MISA_REGW;
|
||||
CSRArray[12'h30A] = testbench.dut.core.priv.priv.csr.csrm.MENVCFG_REGW;
|
||||
CSRArray[12'h10A] = testbench.dut.core.priv.priv.csr.csrs.csrs.SENVCFG_REGW;
|
||||
CSRArray[12'h747] = 0; // mseccfg
|
||||
CSRArray[12'hF11] = 0; //mvendorid
|
||||
CSRArray[12'hF12] = 0; // marchid
|
||||
CSRArray[12'hF13] = {{P.XLEN-12{1'b0}}, 12'h100}; // mimpid
|
||||
CSRArray[12'hF14] = testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW;
|
||||
CSRArray[12'hF15] = 0; //mconfigptr
|
||||
// extra CSRs for RV32
|
||||
if (P.XLEN == 32) begin
|
||||
CSRArray[12'h310] = testbench.dut.core.priv.priv.csr.csrsr.MSTATUSH_REGW;
|
||||
CSRArray[12'h31A] = testbench.dut.core.priv.priv.csr.csrm.MENVCFGH_REGW;
|
||||
CSRArray[12'h757] = 0; // mseccfgh
|
||||
CSRArray[12'h15D] = testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[63:32];
|
||||
end
|
||||
end else begin // hold the old value if the pipeline is stalled.
|
||||
// PMP CFG 3A0 to 3AF
|
||||
int csrid;
|
||||
for(csrid='h3A0; csrid<='h3AF; csrid++)
|
||||
CSRArray[csrid] = CSRArrayOld[csrid];
|
||||
|
||||
// PMP ADDR 3B0 to 3EF
|
||||
for(csrid='h3B0; csrid<='h3EF; csrid++)
|
||||
CSRArray[csrid] = CSRArrayOld[csrid];
|
||||
|
||||
// Sstc CSRs
|
||||
CSRArray[12'h14D] = testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[P.XLEN-1:0];
|
||||
|
||||
// Zkr CSRs
|
||||
// seed not connected (015)
|
||||
// M-mode trap CSRs
|
||||
CSRArray[12'h300] = CSRArrayOld[12'h300];
|
||||
CSRArray[12'h302] = CSRArrayOld[12'h302];
|
||||
CSRArray[12'h303] = CSRArrayOld[12'h303];
|
||||
CSRArray[12'h304] = CSRArrayOld[12'h304];
|
||||
CSRArray[12'h305] = CSRArrayOld[12'h305];
|
||||
CSRArray[12'h340] = CSRArrayOld[12'h340];
|
||||
CSRArray[12'h341] = CSRArrayOld[12'h341];
|
||||
CSRArray[12'h342] = CSRArrayOld[12'h342];
|
||||
CSRArray[12'h343] = CSRArrayOld[12'h343];
|
||||
CSRArray[12'h344] = CSRArrayOld[12'h344];
|
||||
|
||||
// extra CSRs for RV32
|
||||
if (P.XLEN == 32) begin
|
||||
CSRArray[12'h310] = testbench.dut.core.priv.priv.csr.csrsr.MSTATUSH_REGW;
|
||||
CSRArray[12'h31A] = testbench.dut.core.priv.priv.csr.csrm.MENVCFGH_REGW;
|
||||
CSRArray[12'h757] = 0; // mseccfgh
|
||||
CSRArray[12'h15D] = testbench.dut.core.priv.priv.csr.csrs.csrs.STIMECMP_REGW[63:32];
|
||||
end
|
||||
end else begin // hold the old value if the pipeline is stalled.
|
||||
// PMP CFG 3A0 to 3AF
|
||||
int csrid;
|
||||
for(csrid='h3A0; csrid<='h3AF; csrid++)
|
||||
CSRArray[csrid] = CSRArrayOld[csrid];
|
||||
|
||||
// PMP ADDR 3B0 to 3EF
|
||||
for(csrid='h3B0; csrid<='h3EF; csrid++)
|
||||
CSRArray[csrid] = CSRArrayOld[csrid];
|
||||
// S-mode trap CSRs
|
||||
CSRArray[12'h100] = CSRArrayOld[12'h100];
|
||||
CSRArray[12'h104] = CSRArrayOld[12'h104];
|
||||
CSRArray[12'h105] = CSRArrayOld[12'h105];
|
||||
CSRArray[12'h140] = CSRArrayOld[12'h140];
|
||||
CSRArray[12'h141] = CSRArrayOld[12'h141];
|
||||
CSRArray[12'h142] = CSRArrayOld[12'h142];
|
||||
CSRArray[12'h143] = CSRArrayOld[12'h143];
|
||||
CSRArray[12'h144] = CSRArrayOld[12'h144];
|
||||
|
||||
// M-mode trap CSRs
|
||||
CSRArray[12'h300] = CSRArrayOld[12'h300];
|
||||
CSRArray[12'h302] = CSRArrayOld[12'h302];
|
||||
CSRArray[12'h303] = CSRArrayOld[12'h303];
|
||||
CSRArray[12'h304] = CSRArrayOld[12'h304];
|
||||
CSRArray[12'h305] = CSRArrayOld[12'h305];
|
||||
CSRArray[12'h340] = CSRArrayOld[12'h340];
|
||||
CSRArray[12'h341] = CSRArrayOld[12'h341];
|
||||
CSRArray[12'h342] = CSRArrayOld[12'h342];
|
||||
CSRArray[12'h343] = CSRArrayOld[12'h343];
|
||||
CSRArray[12'h344] = CSRArrayOld[12'h344];
|
||||
// Virtual Memory CSRs
|
||||
CSRArray[12'h180] = CSRArrayOld[12'h180] ;
|
||||
|
||||
// S-mode trap CSRs
|
||||
CSRArray[12'h100] = CSRArrayOld[12'h100];
|
||||
CSRArray[12'h104] = CSRArrayOld[12'h104];
|
||||
CSRArray[12'h105] = CSRArrayOld[12'h105];
|
||||
CSRArray[12'h140] = CSRArrayOld[12'h140];
|
||||
CSRArray[12'h141] = CSRArrayOld[12'h141];
|
||||
CSRArray[12'h142] = CSRArrayOld[12'h142];
|
||||
CSRArray[12'h143] = CSRArrayOld[12'h143];
|
||||
CSRArray[12'h144] = CSRArrayOld[12'h144];
|
||||
// Floating-Point CSRs
|
||||
CSRArray[12'h001] = CSRArrayOld[12'h001];
|
||||
CSRArray[12'h002] = CSRArrayOld[12'h002];
|
||||
CSRArray[12'h003] = CSRArrayOld[12'h003];
|
||||
|
||||
// Virtual Memory CSRs
|
||||
CSRArray[12'h180] = CSRArrayOld[12'h180] ;
|
||||
// Counters / Performance Monitoring CSRs
|
||||
CSRArray[12'h306] = CSRArrayOld[12'h306];
|
||||
CSRArray[12'h106] = CSRArrayOld[12'h106];
|
||||
CSRArray[12'h320] = CSRArrayOld[12'h320];
|
||||
// mhpmevent3-31 not connected (232-33F)
|
||||
CSRArray[12'hB00] = CSRArrayOld[12'hB00];
|
||||
CSRArray[12'hB02] = CSRArrayOld[12'hB02];
|
||||
// mhpmcounter3-31 not connected (B03-B1F)
|
||||
// cycle, time, instret not connected (C00-C02)
|
||||
// hpmcounter3-31 not connected (C03-C1F)
|
||||
|
||||
// Floating-Point CSRs
|
||||
CSRArray[12'h001] = CSRArrayOld[12'h001];
|
||||
CSRArray[12'h002] = CSRArrayOld[12'h002];
|
||||
CSRArray[12'h003] = CSRArrayOld[12'h003];
|
||||
// Machine Information Registers and Configuration CSRs
|
||||
CSRArray[12'h301] = CSRArrayOld[12'h301];
|
||||
CSRArray[12'h30A] = CSRArrayOld[12'h30A];
|
||||
CSRArray[12'h10A] = CSRArrayOld[12'h10A];
|
||||
CSRArray[12'h747] = CSRArrayOld[12'h747];
|
||||
CSRArray[12'hF11] = CSRArrayOld[12'hF11];
|
||||
CSRArray[12'hF12] = CSRArrayOld[12'hF12];
|
||||
CSRArray[12'hF13] = CSRArrayOld[12'hF13];
|
||||
CSRArray[12'hF14] = CSRArrayOld[12'hF14];
|
||||
CSRArray[12'hF15] = CSRArrayOld[12'hF15];
|
||||
|
||||
// Counters / Performance Monitoring CSRs
|
||||
CSRArray[12'h306] = CSRArrayOld[12'h306];
|
||||
CSRArray[12'h106] = CSRArrayOld[12'h106];
|
||||
CSRArray[12'h320] = CSRArrayOld[12'h320];
|
||||
// mhpmevent3-31 not connected (232-33F)
|
||||
CSRArray[12'hB00] = CSRArrayOld[12'hB00];
|
||||
CSRArray[12'hB02] = CSRArrayOld[12'hB02];
|
||||
// mhpmcounter3-31 not connected (B03-B1F)
|
||||
// cycle, time, instret not connected (C00-C02)
|
||||
// hpmcounter3-31 not connected (C03-C1F)
|
||||
// Sstc CSRs
|
||||
CSRArray[12'h14D] = CSRArrayOld[12'h14D];
|
||||
|
||||
// Zkr CSRs
|
||||
// seed not connected (015)
|
||||
|
||||
// Machine Information Registers and Configuration CSRs
|
||||
CSRArray[12'h301] = CSRArrayOld[12'h301];
|
||||
CSRArray[12'h30A] = CSRArrayOld[12'h30A];
|
||||
CSRArray[12'h10A] = CSRArrayOld[12'h10A];
|
||||
CSRArray[12'h747] = CSRArrayOld[12'h747];
|
||||
CSRArray[12'hF11] = CSRArrayOld[12'hF11];
|
||||
CSRArray[12'hF12] = CSRArrayOld[12'hF12];
|
||||
CSRArray[12'hF13] = CSRArrayOld[12'hF13];
|
||||
CSRArray[12'hF14] = CSRArrayOld[12'hF14];
|
||||
CSRArray[12'hF15] = CSRArrayOld[12'hF15];
|
||||
|
||||
// Sstc CSRs
|
||||
CSRArray[12'h14D] = CSRArrayOld[12'h14D];
|
||||
|
||||
// Zkr CSRs
|
||||
// seed not connected (015)
|
||||
|
||||
// extra CSRs for RV32
|
||||
if (P.XLEN == 32) begin
|
||||
CSRArray[12'h310] = CSRArrayOld[12'h310];
|
||||
CSRArray[12'h31A] = CSRArrayOld[12'h31A];
|
||||
CSRArray[12'h757] = CSRArrayOld[12'h757];
|
||||
CSRArray[12'h15D] = CSRArrayOld[12'h15D];
|
||||
end
|
||||
end
|
||||
// extra CSRs for RV32
|
||||
if (P.XLEN == 32) begin
|
||||
CSRArray[12'h310] = CSRArrayOld[12'h310];
|
||||
CSRArray[12'h31A] = CSRArrayOld[12'h31A];
|
||||
CSRArray[12'h757] = CSRArrayOld[12'h757];
|
||||
CSRArray[12'h15D] = CSRArrayOld[12'h15D];
|
||||
end
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
// no CSRArray
|
||||
end
|
||||
|
||||
genvar index;
|
||||
@ -307,11 +326,18 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
rf_wb[rf_a3] <= 1'b1;
|
||||
end
|
||||
|
||||
for(index = 0; index < NUMREGS; index += 1)
|
||||
assign frf[index] = testbench.dut.core.fpu.fpu.fregfile.rf[index];
|
||||
if (P.F_SUPPORTED) begin
|
||||
assign frf_a4 = testbench.dut.core.fpu.fpu.fregfile.a4;
|
||||
assign frf_we4 = testbench.dut.core.fpu.fpu.fregfile.we4;
|
||||
for(index = 0; index < NUMREGS; index += 1)
|
||||
assign frf[index] = testbench.dut.core.fpu.fpu.fregfile.rf[index];
|
||||
end else begin
|
||||
assign frf_a4 = '0;
|
||||
assign frf_we4 = 0;
|
||||
for(index = 0; index < NUMREGS; index += 1)
|
||||
assign frf[index] = '0;
|
||||
end
|
||||
|
||||
assign frf_a4 = testbench.dut.core.fpu.fpu.fregfile.a4;
|
||||
assign frf_we4 = testbench.dut.core.fpu.fpu.fregfile.we4;
|
||||
|
||||
always_comb begin
|
||||
frf_wb <= 0;
|
||||
@ -336,21 +362,43 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
flopenrc #(1) CSRWriteWReg (clk, reset, FlushW, ~StallW, CSRWriteM, CSRWriteW);
|
||||
|
||||
//for VM Verification
|
||||
flopenrc #(P.XLEN) VAdrIWReg (clk, reset, FlushW, ~StallW, VAdrIM, VAdrIW);
|
||||
flopenrc #(P.XLEN) VAdrDWReg (clk, reset, FlushW, ~StallW, VAdrDM, VAdrDW);
|
||||
flopenrc #(P.PA_BITS) PAIWReg (clk, reset, FlushW, ~StallW, PAIM, PAIW);
|
||||
flopenrc #(P.PA_BITS) PADWReg (clk, reset, FlushW, ~StallW, PADM, PADW);
|
||||
flopenrc #(P.XLEN) PTE_iWReg (clk, reset, FlushW, ~StallW, PTE_iM, PTE_iW);
|
||||
flopenrc #(P.XLEN) PTE_dWReg (clk, reset, FlushW, ~StallW, PTE_dM, PTE_dW);
|
||||
flopenrc #(P.PPN_BITS) PPN_iWReg (clk, reset, FlushW, ~StallW, PPN_iM, PPN_iW);
|
||||
flopenrc #(P.PPN_BITS) PPN_dWReg (clk, reset, FlushW, ~StallW, PPN_dM, PPN_dW);
|
||||
flopenrc #(1) ReadAccessWReg (clk, reset, FlushW, ~StallW, ReadAccessM, ReadAccessW);
|
||||
flopenrc #(1) WriteAccessWReg (clk, reset, FlushW, ~StallW, WriteAccessM, WriteAccessW);
|
||||
// *** what is this used for?
|
||||
flopenrc #(1) ExecuteAccessDReg (clk, reset, FlushE, ~StallE, ExecuteAccessF, ExecuteAccessD);
|
||||
flopenrc #(1) ExecuteAccessEReg (clk, reset, FlushE, ~StallE, ExecuteAccessD, ExecuteAccessE);
|
||||
flopenrc #(1) ExecuteAccessMReg (clk, reset, FlushM, ~StallM, ExecuteAccessE, ExecuteAccessM);
|
||||
flopenrc #(1) ExecuteAccessWReg (clk, reset, FlushW, ~StallW, ExecuteAccessM, ExecuteAccessW);
|
||||
flopenrc #(P.XLEN) IVAdrDReg (clk, reset, 1'b0, SelHPTW, IVAdrF, IVAdrD); //Virtual Address for IMMU // *** RT: possible bug SelHPTW probably should be ~StallD
|
||||
flopenrc #(P.XLEN) IVAdrEReg (clk, reset, 1'b0, ~StallE, IVAdrD, IVAdrE); //Virtual Address for IMMU
|
||||
flopenrc #(P.XLEN) IVAdrMReg (clk, reset, 1'b0, ~StallM, IVAdrE, IVAdrM); //Virtual Address for IMMU
|
||||
flopenrc #(P.XLEN) IVAdrWReg (clk, reset, 1'b0, SelHPTW, IVAdrM, IVAdrW); //Virtual Address for IMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
flopenrc #(P.XLEN) DVAdrWReg (clk, reset, 1'b0, SelHPTW, DVAdrM, DVAdrW); //Virtual Address for DMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
|
||||
flopenrc #(P.PA_BITS) IPADReg (clk, reset, 1'b0, SelHPTW, IPAF, IPAD); //Physical Address for IMMU // *** RT: possible bug SelHPTW probably should be ~StallD
|
||||
flopenrc #(P.PA_BITS) IPAEReg (clk, reset, 1'b0, ~StallE, IPAD, IPAE); //Physical Address for IMMU
|
||||
flopenrc #(P.PA_BITS) IPAMReg (clk, reset, 1'b0, ~StallM, IPAE, IPAM); //Physical Address for IMMU
|
||||
flopenrc #(P.PA_BITS) IPAWReg (clk, reset, 1'b0, SelHPTW, IPAM, IPAW); //Physical Address for IMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
flopenrc #(P.PA_BITS) DPAWReg (clk, reset, 1'b0, SelHPTW, DPAM, DPAW); //Physical Address for DMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
|
||||
flopenrc #(P.XLEN) IPTEDReg (clk, reset, 1'b0, SelHPTW, IPTEF, IPTED); //PTE for IMMU // *** RT: possible bug SelHPTW probably should be ~StallD
|
||||
flopenrc #(P.XLEN) IPTEEReg (clk, reset, 1'b0, ~StallE, IPTED, IPTEE); //PTE for IMMU
|
||||
flopenrc #(P.XLEN) IPTEMReg (clk, reset, 1'b0, ~StallM, IPTEE, IPTEM); //PTE for IMMU
|
||||
flopenrc #(P.XLEN) IPTEWReg (clk, reset, 1'b0, SelHPTW, IPTEM, IPTEW); //PTE for IMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
flopenrc #(P.XLEN) DPTEWReg (clk, reset, 1'b0, SelHPTW, DPTEM, DPTEW); //PTE for DMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
|
||||
flopenrc #(2) IPageTypeDReg (clk, reset, 1'b0, SelHPTW, IPageTypeF, IPageTypeD); //PageType (kilo, mega, giga, tera) from IMMU // *** RT: possible bug SelHPTW probably should be ~StallD
|
||||
flopenrc #(2) IPageTypeEReg (clk, reset, 1'b0, ~StallE, IPageTypeD, IPageTypeE); //PageType (kilo, mega, giga, tera) from IMMU
|
||||
flopenrc #(2) IPageTypeMReg (clk, reset, 1'b0, ~StallM, IPageTypeE, IPageTypeM); //PageType (kilo, mega, giga, tera) from IMMU
|
||||
flopenrc #(2) IPageTypeWReg (clk, reset, 1'b0, SelHPTW, IPageTypeM, IPageTypeW); //PageType (kilo, mega, giga, tera) from IMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
flopenrc #(2) DPageTypeWReg (clk, reset, 1'b0, SelHPTW, DPageTypeM, DPageTypeW); //PageType (kilo, mega, giga, tera) from DMMU // *** RT: possible bug SelHPTW probably should be ~GatedStallW
|
||||
|
||||
flopenrc #(P.PPN_BITS) IPPNDReg (clk, reset, 1'b0, ~StallD, IPPNF, IPPND); //Physical Page Number for IMMU
|
||||
flopenrc #(P.PPN_BITS) IPPNEReg (clk, reset, 1'b0, ~StallE, IPPND, IPPNE); //Physical Page Number for IMMU
|
||||
flopenrc #(P.PPN_BITS) IPPNMReg (clk, reset, 1'b0, ~StallM, IPPNE, IPPNM); //Physical Page Number for IMMU
|
||||
flopenrc #(P.PPN_BITS) IPPNWReg (clk, reset, 1'b0, ~StallW, IPPNM, IPPNW); //Physical Page Number for IMMU
|
||||
flopenrc #(P.PPN_BITS) DPPNWReg (clk, reset, 1'b0, ~StallW, DPPNM, DPPNW); //Physical Page Number for DMMU
|
||||
|
||||
flopenrc #(1) ReadAccessWReg (clk, reset, 1'b0, ~GatedStallW, ReadAccessM, ReadAccessW); //LoadAccess
|
||||
flopenrc #(1) WriteAccessWReg (clk, reset, 1'b0, ~GatedStallW, WriteAccessM, WriteAccessW); //StoreAccess
|
||||
|
||||
flopenrc #(1) ExecuteAccessDReg (clk, reset, 1'b0, ~StallD, ExecuteAccessF, ExecuteAccessD); //Instruction Fetch Access
|
||||
flopenrc #(1) ExecuteAccessEReg (clk, reset, 1'b0, ~StallE, ExecuteAccessD, ExecuteAccessE); //Instruction Fetch Access
|
||||
flopenrc #(1) ExecuteAccessMReg (clk, reset, 1'b0, ~StallM, ExecuteAccessE, ExecuteAccessM); //Instruction Fetch Access
|
||||
flopenrc #(1) ExecuteAccessWReg (clk, reset, 1'b0, ~StallW, ExecuteAccessM, ExecuteAccessW); //Instruction Fetch Access
|
||||
|
||||
// Initially connecting the writeback stage signals, but may need to use M stage
|
||||
// and gate on ~FlushW.
|
||||
@ -685,7 +733,7 @@ module wallyTracer import cvw::*; #(parameter cvw_t P) (rvviTrace rvvi);
|
||||
int file;
|
||||
string LogFile;
|
||||
if(`STD_LOG) begin
|
||||
instrNameDecTB NameDecoder(rvvi.insn[0][0], instrWName);
|
||||
instrNameDecTB #(P.XLEN) NameDecoder(rvvi.insn[0][0], instrWName);
|
||||
initial begin
|
||||
LogFile = "logs/boottrace.log";
|
||||
file = $fopen(LogFile, "w");
|
||||
|
@ -44,6 +44,15 @@ module testbench;
|
||||
parameter I_CACHE_ADDR_LOGGER=0;
|
||||
parameter D_CACHE_ADDR_LOGGER=0;
|
||||
parameter RVVI_SYNTH_SUPPORTED=0;
|
||||
parameter MAKE_VCD=0;
|
||||
|
||||
// TREK Requires a license for the Breker tool. See tests/breker/README.md for details
|
||||
`ifdef USE_TREK_DV
|
||||
event trek_start;
|
||||
always @(testbench.trek_start) begin
|
||||
trek_uvm_pkg::trek_uvm_events::do_backdoor_init();
|
||||
end
|
||||
`endif
|
||||
|
||||
`ifdef USE_IMPERAS_DV
|
||||
import idvPkg::*;
|
||||
@ -136,7 +145,9 @@ module testbench;
|
||||
"arch64i": tests = arch64i;
|
||||
"arch64priv": tests = arch64priv;
|
||||
"arch64c": if (P.ZCA_SUPPORTED)
|
||||
if (P.ZICSR_SUPPORTED) tests = {arch64c, arch64cpriv};
|
||||
if (P.ZICSR_SUPPORTED)
|
||||
if (P.ZCD_SUPPORTED) tests = {arch64c, arch64cpriv, arch64zcd};
|
||||
else tests = {arch64c, arch64cpriv};
|
||||
else tests = {arch64c};
|
||||
"arch64m": if (P.M_SUPPORTED) tests = arch64m;
|
||||
"arch64a_amo": if (P.ZAAMO_SUPPORTED) tests = arch64a_amo;
|
||||
@ -163,7 +174,9 @@ module testbench;
|
||||
"arch64zbs": if (P.ZBS_SUPPORTED) tests = arch64zbs;
|
||||
"arch64zicboz": if (P.ZICBOZ_SUPPORTED) tests = arch64zicboz;
|
||||
"arch64zcb": if (P.ZCB_SUPPORTED) tests = arch64zcb;
|
||||
"arch64zfh": if (P.ZFH_SUPPORTED) tests = arch64zfh;
|
||||
"arch64zfh": if (P.ZFH_SUPPORTED)
|
||||
if (P.D_SUPPORTED) tests = {arch64zfh, arch64zfh_d};
|
||||
else tests = arch64zfh;
|
||||
"arch64zfh_fma": if (P.ZFH_SUPPORTED) tests = arch64zfh_fma;
|
||||
"arch64zfh_divsqrt": if (P.ZFH_SUPPORTED) tests = arch64zfh_divsqrt;
|
||||
"arch64zfaf": if (P.ZFA_SUPPORTED) tests = arch64zfaf;
|
||||
@ -183,7 +196,11 @@ module testbench;
|
||||
"arch32i": tests = arch32i;
|
||||
"arch32priv": tests = arch32priv;
|
||||
"arch32c": if (P.C_SUPPORTED)
|
||||
if (P.ZICSR_SUPPORTED) tests = {arch32c, arch32cpriv};
|
||||
if (P.ZICSR_SUPPORTED)
|
||||
if (P.ZCF_SUPPORTED)
|
||||
if (P.ZCD_SUPPORTED) tests = {arch32c, arch32cpriv, arch32zcf, arch32zcd};
|
||||
else tests = {arch32c, arch32cpriv, arch32zcf};
|
||||
else tests = {arch32c, arch32cpriv};
|
||||
else tests = {arch32c};
|
||||
"arch32m": if (P.M_SUPPORTED) tests = arch32m;
|
||||
"arch32a_amo": if (P.ZAAMO_SUPPORTED) tests = arch32a_amo;
|
||||
@ -207,7 +224,9 @@ module testbench;
|
||||
"arch32zbs": if (P.ZBS_SUPPORTED) tests = arch32zbs;
|
||||
"arch32zicboz": if (P.ZICBOZ_SUPPORTED) tests = arch32zicboz;
|
||||
"arch32zcb": if (P.ZCB_SUPPORTED) tests = arch32zcb;
|
||||
"arch32zfh": if (P.ZFH_SUPPORTED) tests = arch32zfh;
|
||||
"arch32zfh": if (P.ZFH_SUPPORTED)
|
||||
if (P.D_SUPPORTED) tests = {arch32zfh, arch32zfh_d};
|
||||
else tests = arch32zfh;
|
||||
"arch32zfh_fma": if (P.ZFH_SUPPORTED) tests = arch32zfh_fma;
|
||||
"arch32zfh_divsqrt": if (P.ZFH_SUPPORTED) tests = arch32zfh_divsqrt;
|
||||
"arch32zfaf": if (P.ZFA_SUPPORTED) tests = arch32zfaf;
|
||||
@ -230,10 +249,10 @@ module testbench;
|
||||
end
|
||||
$finish;
|
||||
end
|
||||
`ifdef MAKEVCD
|
||||
$dumpfile("testbench.vcd");
|
||||
$dumpvars;
|
||||
`endif
|
||||
if (MAKE_VCD) begin
|
||||
$dumpfile("testbench.vcd");
|
||||
$dumpvars;
|
||||
end
|
||||
end // initial begin
|
||||
|
||||
// Model the testbench as an fsm.
|
||||
@ -411,7 +430,11 @@ module testbench;
|
||||
end else if (TEST == "coverage64gc") begin
|
||||
$display("%s ran. Coverage tests don't get checked", tests[test]);
|
||||
end else if (ElfFile != "none") begin
|
||||
$display("Single Elf file tests are not signatured verified.");
|
||||
`ifdef USE_TREK_DV
|
||||
$display("Breker test is done.");
|
||||
`else
|
||||
$display("Single Elf file tests are not signatured verified.");
|
||||
`endif
|
||||
`ifdef QUESTA
|
||||
$stop; // if this is changed to $finish for Questa, wally-batch.do does not go to the next step to run coverage, and wally.do terminates without allowing GUI debug
|
||||
`else
|
||||
@ -518,6 +541,10 @@ module testbench;
|
||||
end else begin
|
||||
$fclose(uncoreMemFile);
|
||||
$readmemh(memfilename, dut.uncoregen.uncore.ram.ram.memory.ram.RAM);
|
||||
`ifdef USE_TREK_DV
|
||||
-> trek_start;
|
||||
$display("starting Trek....");
|
||||
`endif
|
||||
end
|
||||
end
|
||||
if (TEST == "embench") $display("Read memfile %s", memfilename);
|
||||
@ -642,7 +669,7 @@ module testbench;
|
||||
string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName;
|
||||
logic [31:0] InstrW;
|
||||
flopenr #(32) InstrWReg(clk, reset, ~dut.core.ieu.dp.StallW, InstrM, InstrW);
|
||||
instrTrackerTB it(clk, reset, dut.core.ieu.dp.FlushE,
|
||||
instrTrackerTB #(P.XLEN) it(clk, reset, dut.core.ieu.dp.FlushE,
|
||||
dut.core.ifu.InstrRawF[31:0],
|
||||
dut.core.ifu.InstrD, dut.core.ifu.InstrE,
|
||||
InstrM, InstrW,
|
||||
@ -866,12 +893,14 @@ end
|
||||
|
||||
end
|
||||
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[7]) void'(rvvi.net_push("MTimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[7]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[11]) void'(rvvi.net_push("MExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[11]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[9]) void'(rvvi.net_push("SExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[9]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[3]) void'(rvvi.net_push("MSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[3]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[1]) void'(rvvi.net_push("SSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[1]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[5]) void'(rvvi.net_push("STimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[5]));
|
||||
if (P.ZICSR_SUPPORTED) begin
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[7]) void'(rvvi.net_push("MTimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[7]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[11]) void'(rvvi.net_push("MExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[11]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[9]) void'(rvvi.net_push("SExternalInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[9]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[3]) void'(rvvi.net_push("MSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[3]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[1]) void'(rvvi.net_push("SSWInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[1]));
|
||||
always @(dut.core.priv.priv.csr.csri.MIP_REGW[5]) void'(rvvi.net_push("STimerInterrupt", dut.core.priv.priv.csr.csri.MIP_REGW[5]));
|
||||
end
|
||||
|
||||
final begin
|
||||
void'(rvviRefShutdown());
|
||||
|
@ -194,69 +194,78 @@ string arch32pmp[] = '{
|
||||
"rv32i_m/pmp32/src/pmp-TOR-X.S"
|
||||
};
|
||||
|
||||
// Tests commented out pending riscv-arch-test issue #588
|
||||
string arch64pmp[] = '{
|
||||
`RISCVARCHTEST,
|
||||
"rv64i_m/pmp64/pmp64-CFG-reg.S",
|
||||
"rv64i_m/pmp64/pmp64-CSR-access.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-R-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-R.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RW-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RW-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RW.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RWX.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RX-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-RX.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-X-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NA4-X.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-R-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-R.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RW-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RW-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RW.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RWX.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RX-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-RX.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-X-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-NAPOT-X.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-R-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-R.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RW-priority-level-2..S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RW-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RW.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RWX.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RX-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-RX.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-X-priority.S",
|
||||
"rv64i_m/pmp64/pmp64-TOR-X.S"
|
||||
"rv64i_m/pmp64/src/pmp64-CFG-reg.S",
|
||||
"rv64i_m/pmp64/src/pmp64-CSR-access.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-R-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-R.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RW-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RW-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RW.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RWX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RX-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-RX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-X-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NA4-X.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-R-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-R.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RW-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RW-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RW.S",
|
||||
// "rv64i_m/pmp64/src/pmp64-NAPOT-RWX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RX-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-RX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-X-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-NAPOT-X.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-R-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-R-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-R.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RW-priority-level-2..S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RW-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RW.S",
|
||||
// "rv64i_m/pmp64/src/pmp64-TOR-RWX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RX-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RX-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-RX.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-X-priority-level-2.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-X-priority.S",
|
||||
"rv64i_m/pmp64/src/pmp64-TOR-X.S"
|
||||
};
|
||||
|
||||
string arch32vm_sv32[] = '{
|
||||
`RISCVARCHTEST,
|
||||
"rv32i_m/vm_sv32/src/mstatus_tvm_test.S",
|
||||
"rv32i_m/vm_sv32/src/pmp_check_on_pa_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/pmp_check_on_pa_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/pmp_check_on_pte_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/pmp_check_on_pte_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/satp_access_tests.S",
|
||||
"rv32i_m/vm_sv32/src/vm_A_and_D_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_A_and_D_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_invalid_pte_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_invalid_pte_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_misaligned_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_misaligned_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mprv_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mprv_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mprv_U_set_sum_set_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mprv_U_set_sum_unset_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mxr_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_mxr_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_nleaf_pte_level0_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_nleaf_pte_level0_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_pte_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_pte_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_rsw_pte_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_rsw_pte_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_rwx_pte_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_reserved_rwx_pte_U_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_sum_set_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_sum_unset_S_mode.S",
|
||||
"rv32i_m/vm_sv32/src/vm_U_Bit_set_U_mode.S",
|
||||
@ -528,6 +537,14 @@ string arch64cpriv[] = '{
|
||||
"rv64i_m/C/src/cebreak-01.S"
|
||||
};
|
||||
|
||||
string arch64zcd[] = '{
|
||||
// `RISCVARCHTEST,
|
||||
"rv64i_m/D_Zcd/src/c.fld-01.S",
|
||||
"rv64i_m/D_Zcd/src/c.fldsp-01.S",
|
||||
"rv64i_m/D_Zcd/src/c.fsd-01.S",
|
||||
"rv64i_m/D_Zcd/src/c.fsdsp-01.S"
|
||||
};
|
||||
|
||||
string arch64i[] = '{
|
||||
`RISCVARCHTEST,
|
||||
"rv64i_m/I/src/add-01.S",
|
||||
@ -1000,10 +1017,23 @@ string arch64zfh[] = '{
|
||||
"rv64i_m/Zfh/src/fadd_b7-01.S",
|
||||
"rv64i_m/Zfh/src/fadd_b8-01.S",
|
||||
"rv64i_m/Zfh/src/fclass_b1-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b1-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b22-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b23-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b24-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b27-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b28-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.s_b29-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.w_b25-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.w_b26-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.wu_b25-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.wu_b26-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b22-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b23-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b24-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b27-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b28-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.s.h_b29-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.w.h_b1-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.w.h_b22-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.w.h_b23-01.S",
|
||||
@ -1130,7 +1160,23 @@ string arch64zfh[] = '{
|
||||
"rv64i_m/Zfh/src/fnmsub_b8-01.S"
|
||||
};
|
||||
|
||||
|
||||
string arch64zfh_d[] = '{
|
||||
// `RISCVARCHTEST,
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b1-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b22-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b23-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b24-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b27-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b28-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.d.h_b29-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b1-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b22-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b23-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b24-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b27-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b28-01.S",
|
||||
"rv64i_m/Zfh/src/fcvt.h.d_b29-01.S"
|
||||
};
|
||||
|
||||
string arch64d_fma[] = '{
|
||||
`RISCVARCHTEST,
|
||||
@ -2413,10 +2459,23 @@ string arch32zfh[] = '{
|
||||
"rv32i_m/Zfh/src/fadd_b7-01.S",
|
||||
"rv32i_m/Zfh/src/fadd_b8-01.S",
|
||||
"rv32i_m/Zfh/src/fclass_b1-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b1-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b22-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b23-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b24-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b27-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b28-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.s_b29-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.w_b25-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.w_b26-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.wu_b25-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.wu_b26-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b22-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b23-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b24-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b27-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b28-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.s.h_b29-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.w.h_b1-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.w.h_b22-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.w.h_b23-01.S",
|
||||
@ -2525,6 +2584,24 @@ string arch32zfh[] = '{
|
||||
"rv32i_m/Zfh/src/fnmsub_b8-01.S"
|
||||
};
|
||||
|
||||
string arch32zfh_d[] = '{
|
||||
// `RISCVARCHTEST,
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b1-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b22-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b23-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b24-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b27-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b28-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.d.h_b29-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b1-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b22-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b23-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b24-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b27-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b28-01.S",
|
||||
"rv32i_m/Zfh/src/fcvt.h.d_b29-01.S"
|
||||
};
|
||||
|
||||
string arch32zfaf[] = '{
|
||||
`RISCVARCHTEST,
|
||||
"rv32i_m/F_Zfa/src/fround_b1-01.S",
|
||||
@ -3353,6 +3430,21 @@ string arch32cpriv[] = '{
|
||||
"rv32i_m/C/src/cebreak-01.S"
|
||||
};
|
||||
|
||||
string arch32zcf[] = '{
|
||||
// `RISCVARCHTEST,
|
||||
"rv32i_m/F_Zcf/src/c.flw-01.S",
|
||||
"rv32i_m/F_Zcf/src/c.flwsp-01.S",
|
||||
"rv32i_m/F_Zcf/src/c.fsw-01.S",
|
||||
"rv32i_m/F_Zcf/src/c.fswsp-01.S"
|
||||
};
|
||||
|
||||
string arch32zcd[] = '{
|
||||
// `RISCVARCHTEST,
|
||||
"rv32i_m/D_Zcd/src/c.fld-01.S",
|
||||
"rv32i_m/D_Zcd/src/c.fldsp-01.S",
|
||||
"rv32i_m/D_Zcd/src/c.fsd-01.S",
|
||||
"rv32i_m/D_Zcd/src/c.fsdsp-01.S"
|
||||
};
|
||||
|
||||
string arch32i[] = '{
|
||||
`RISCVARCHTEST,
|
||||
|
14
testbench/trek_files/Makefile
Normal file
14
testbench/trek_files/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
SHELL := /bin/bash
|
||||
TREKFILES := $(WALLY)/testbench/trek_files
|
||||
PLATFORM_YAML := $(TREKFILES)/platform.yaml
|
||||
TREKSVIP_YAML := $(BREKER_HOME)/examples/tutorials/svip/treksvip/yaml/treksvip.yaml
|
||||
TREKEXE_FLAGS += --seed 0x # free (0x) or lock (0x1) the seed used for test generation
|
||||
TREKSVIP = source $(TREKFILES)/breker-setup.sh && treksvip -p $(PLATFORM_YAML) -p $(TREKSVIP_YAML) $(TREKEXE_FLAGS)
|
||||
|
||||
uvm_output: uvm_output/trek_uvm.sv
|
||||
|
||||
uvm_output/trek_uvm.sv: $(PLATFORM_YAML) $(TREKSVIP_YAML)
|
||||
$(TREKSVIP) -p $(PLATFORM_YAML) -p $(TREKSVIP_YAML) --uvm_output=uvm_output
|
||||
|
||||
clean:
|
||||
rm -rf uvm_output
|
9
testbench/trek_files/README.md
Normal file
9
testbench/trek_files/README.md
Normal file
@ -0,0 +1,9 @@
|
||||
Jordan Carlin, jcarlin@hmc.edu, December 2024
|
||||
|
||||
# Breker Trek Tests Support Files for CVW
|
||||
|
||||
[Breker's Trek Test Suite](https://brekersystems.com/products/trek-suite/) is a proprietary set of tests that require a license to use (this license is not generally available to noncommercial users).
|
||||
|
||||
This directory contains the support files necessary to run Breker's Trek Tests on CVW. For additional details on the tests see [`$WALLY/tests/breker/README.md`](../../tests/breker/README.md)
|
||||
|
||||
To generate the Breker support files (with a license), run `make` in the `testbench/trek_files` directory (this one). Before running, make sure to set `$BREKER_HOME` in your system's `site-setup.sh` file. This Makefile only needs to be run once.
|
5
testbench/trek_files/breker-setup.sh
Normal file
5
testbench/trek_files/breker-setup.sh
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
export BREKER_ARCH=${BREKER_HOME}/linux64
|
||||
export PATH=${BREKER_HOME}/bin:${BREKER_HOME}/examples/tutorials/apps/coherency/bin:${PATH}
|
||||
export LD_LIBRARY_PATH=".:${BREKER_ARCH}/lib:${BREKER_HOME}/opensrc/gcc/lib:${BREKER_HOME}/opensrc/gcc/lib64":${LD_LIBRARY_PATH}
|
||||
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LIBRARY_PATH
|
27
testbench/trek_files/customer.yaml
Normal file
27
testbench/trek_files/customer.yaml
Normal file
@ -0,0 +1,27 @@
|
||||
trek:
|
||||
svip:
|
||||
global:
|
||||
scenarios:
|
||||
scenario_count:
|
||||
# primary control for length of test
|
||||
value: 5
|
||||
riscv:
|
||||
extensions:
|
||||
# disable hypervisor extension by setting value to 0
|
||||
# if your system does not support this feature
|
||||
h_hypervisor:
|
||||
value: 0
|
||||
|
||||
# uncomment the `weights:` line below if any entries under `weights:` need to be enabled
|
||||
# weights:
|
||||
# disable testing of Sv57: Page-Based 57-bit Virtual-Memory System
|
||||
# if your system does not support this feature
|
||||
# pss_top.rvMmu.rvMmuOp.RvMmuOp::satpModeSv57: 0
|
||||
|
||||
# qemu-riscv64 does not ignore writes to WARL bits in hgatp
|
||||
# Comment out the next line unless your design has this issue
|
||||
# pss_top.rvMmu.rvMmuOp.RvMmuOp::writeHgatpWarl : 0
|
||||
|
||||
|
||||
|
||||
|
263
testbench/trek_files/platform.yaml
Normal file
263
testbench/trek_files/platform.yaml
Normal file
@ -0,0 +1,263 @@
|
||||
trek:
|
||||
platform_config:
|
||||
doc: >-
|
||||
Testbench platform specific configuration.
|
||||
processors:
|
||||
doc: >-
|
||||
Information about available processors.
|
||||
processor_count:
|
||||
value: 1
|
||||
doc: >-
|
||||
How many processors can be used by the generated test case
|
||||
sw_threads_per_processor:
|
||||
value: 2
|
||||
doc: >-
|
||||
How many software threads to put on each processor
|
||||
tlm_generic_ports:
|
||||
doc: >-
|
||||
Information about available tlm_generic_payload ports
|
||||
port_count:
|
||||
value: 0
|
||||
doc: >-
|
||||
How many tlm ports to use for memory operations
|
||||
threads_per_port:
|
||||
value: 4
|
||||
doc: >-
|
||||
How many threads to put on each tlm port
|
||||
debug:
|
||||
value: 1
|
||||
doc: >-
|
||||
Turn on for verbose tlm port messages
|
||||
memories:
|
||||
doc: >-
|
||||
Information about memory regions that can be used by the generated test case.
|
||||
defaults:
|
||||
doc: >-
|
||||
Default values for all memories
|
||||
natural_alignment:
|
||||
value: 1
|
||||
doc: >-
|
||||
Should all memory addresses be naturally aligned (up to 8 byte alignment)
|
||||
init_type:
|
||||
value: frontdoor
|
||||
doc: >-
|
||||
Strategy to use for memory initialization.
|
||||
Options are:
|
||||
- static
|
||||
- backdoor
|
||||
- frontdoor
|
||||
memory:
|
||||
doc: >-
|
||||
Define a memory region.
|
||||
Multiple memory regions may be defined in this section.
|
||||
name:
|
||||
value: ddr0
|
||||
doc: >-
|
||||
Name of the memory region
|
||||
base:
|
||||
value: 0x83000000
|
||||
doc: >-
|
||||
Base address of memory region.
|
||||
Ignored for `static` initialized memory
|
||||
size:
|
||||
value: 0x100000
|
||||
doc: >-
|
||||
Size of memory region in bytes.
|
||||
init_type:
|
||||
value: backdoor #frontdoor
|
||||
doc: >-
|
||||
Strategy to use for memory initialization.
|
||||
Options are:
|
||||
- static
|
||||
- backdoor
|
||||
- frontdoor
|
||||
caches:
|
||||
doc: >-
|
||||
parameters related to cache architecture
|
||||
cache_line_size:
|
||||
value: 64
|
||||
doc: >-
|
||||
Size of a cache line in bytes
|
||||
llc_cache_size:
|
||||
value: 0x200000
|
||||
doc: >-
|
||||
size of last level cache in bytes
|
||||
llc_cache_ways:
|
||||
value: 8
|
||||
doc: >-
|
||||
number of ways in the last level cache
|
||||
mailbox:
|
||||
doc: >-
|
||||
Configure memory mailbox usage
|
||||
type:
|
||||
value: single
|
||||
doc: >-
|
||||
Configure mailbox type.
|
||||
Options are:
|
||||
- single: for use by TrekBox with backdoor access
|
||||
- queue: for use in post-silicon post-process flow
|
||||
single:
|
||||
doc: >-
|
||||
Detail settings when mailbox type is `single`
|
||||
init_type:
|
||||
value: backdoor #static
|
||||
doc: >-
|
||||
Strategy to use for mailbox memory initialization.
|
||||
Options are:
|
||||
- static
|
||||
- backdoor
|
||||
- frontdoor
|
||||
c2t_base:
|
||||
value: 0x82000000
|
||||
doc: >-
|
||||
Fixed base address of C to trekbox mailbox region.
|
||||
Allow 64 bytes per processor.
|
||||
Used for init_type of `backdoor` and `frontdoor` only.
|
||||
t2c_base:
|
||||
value: 0x82001000
|
||||
doc: >-
|
||||
Fixed base address of trekbox to C mailbox region.
|
||||
Allow 64 bytes per processor.
|
||||
Used for init_type of `backdoor` and `frontdoor` only.
|
||||
cacheable:
|
||||
value: 1
|
||||
doc: >-
|
||||
Set this parameter to 1 to do a cache flush after every mailbox
|
||||
write.
|
||||
queue:
|
||||
doc: >-
|
||||
Detail settings when mailbox type is `queue`
|
||||
length:
|
||||
value: 1000
|
||||
doc: >-
|
||||
Max number of messages that can be stored in the queue mailbox.
|
||||
Longer tests may need a larger queue.
|
||||
debug:
|
||||
value: 0
|
||||
doc: >-
|
||||
If this flag is set to 1, messages will be printed directly to the
|
||||
console instead of being queued in memory.
|
||||
stdio:
|
||||
doc: >-
|
||||
Is the <stdio> standard library available for use by the generated test.
|
||||
available:
|
||||
value: 0
|
||||
doc: >-
|
||||
Set this value to 0 of the <stdio> library is not available in
|
||||
your system.
|
||||
use_lock:
|
||||
value: 1
|
||||
doc: >-
|
||||
Calls to <stdio> console print messages will be mutex locked unless
|
||||
this flag is set to 0.
|
||||
header:
|
||||
doc: >-
|
||||
Verbatim code that will be put into the header section of the test.
|
||||
value: |-
|
||||
|
||||
declaration:
|
||||
doc: >-
|
||||
Verbatim code that will be put into the declaration section of the test.
|
||||
value: |-
|
||||
extern void tohost_exit(int status);
|
||||
|
||||
#undef trek_exit
|
||||
#define trek_exit(status) tohost_exit(status);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return trek_main();
|
||||
}
|
||||
|
||||
mmu: # Trek can generate code to program page/translation tables
|
||||
# that you MAY want to use with your SDV generated C files.
|
||||
# Here, you have some control over that process.
|
||||
|
||||
va_bits: 39 # How many bits are used for virtual addresses
|
||||
#
|
||||
# For aarch64, the value here is used to determine the
|
||||
# "initial lookup level" (as detailed in Table D5-13).
|
||||
# This must correlate to TCR_EL3.T0SZ!
|
||||
#
|
||||
# For riscv64, only 39, 48, and 57 are supported
|
||||
# corresponding to "Sv39", "Sv48", and "Sv57".
|
||||
#
|
||||
# default: 39 [from T0SZ=64-39=25(0x19)]
|
||||
|
||||
memory_map: # A *MAP* of all memory regions, excluding the
|
||||
# memory_resources in your platformConfig.h file.
|
||||
#
|
||||
# Each map entry should be a unique name.
|
||||
#
|
||||
# Mandatory submap pairs:
|
||||
# normal: *true*/false (false = "device"/"io" memory)
|
||||
# begin: starting address
|
||||
# end: ending address
|
||||
#
|
||||
# Optional submap pairs:
|
||||
# readable: *true*/false
|
||||
# writeable: *true*/false
|
||||
# executable: true/*false*
|
||||
# cacheable: *true*/false (*false* for device)
|
||||
# share_type (aarch64 only): *inner-shareable*,
|
||||
# outer-shareable, non-shareable
|
||||
#
|
||||
# Note that memory_resources will use all defaults.
|
||||
#
|
||||
# Note that "normal: false" (device-memory) change defaults
|
||||
# to "cacheable = false", and on arch64 it implies
|
||||
# share_type = non-shareable, and alloc_type = no-allocate
|
||||
|
||||
UART0:
|
||||
type: device
|
||||
begin: 0x10000000
|
||||
end: 0x10000fff
|
||||
|
||||
code:
|
||||
type: normal
|
||||
begin: 0x80000000
|
||||
end: 0x807fffff
|
||||
executable: true
|
||||
|
||||
stack:
|
||||
type: normal
|
||||
begin: 0x87000000
|
||||
end: 0x87ffffff
|
||||
|
||||
|
||||
aarch64: # Customizations that are only valid for aarch64.
|
||||
|
||||
TCR_EL3: 0x80923519 # Should Trek to program the TCR_TL3 register? If
|
||||
# so, put the value here. If not, comment out
|
||||
# this option.
|
||||
# NOTE: T0SZ should correlate to va_bits above!
|
||||
# default: -no default-
|
||||
|
||||
allocate_type: read-write-allocate # Default allocate_type.
|
||||
# read-allocate, write-allocate,
|
||||
# *read-write-allocate*, no-allocate
|
||||
|
||||
cache_type: write-back-nontransient # non-cacheable,
|
||||
# write-through-transient,
|
||||
# write-back-transient,
|
||||
# write-through-non-transient,
|
||||
# *write-back-non-transient*
|
||||
|
||||
device_type: nGnRnE # *nGnRnE*, nGnRE, nGRE, GRE
|
||||
|
||||
share_type: inner-shareable # non-shareable
|
||||
# inner-shareable
|
||||
# outer-shareable
|
||||
|
||||
riscv64: # Customizations that are only valid for riscv64.
|
||||
|
||||
Svnapot: false # If standard extension "Svnapot" is implemented, and
|
||||
# when you are using Sv39, you might set this to "true"
|
||||
# to allow PTE bit[63] "N" to be set when appropriate.
|
||||
# default: false
|
||||
|
||||
Svpbmt: true # If standard extension "Svpbmt" is implemented, and
|
||||
# when you are using Sv39, you might set this to "true"
|
||||
# to allow cacheable/device information to flow into
|
||||
# bits[62:61] "PBMT" as appropriate.
|
||||
# default: false
|
91
testbench/trek_files/trek_user_backdoor.sv
Normal file
91
testbench/trek_files/trek_user_backdoor.sv
Normal file
@ -0,0 +1,91 @@
|
||||
/// custom routines defined for the platform
|
||||
|
||||
// Design parameters, used in the code below and custom to this design!
|
||||
//`define RAM_PATH soc_top.soc_instance.i_sram_subsystem.i_shared_ram
|
||||
//sim:/testbench/dut/uncore/uncore/ram/ram/memory/RAM
|
||||
//`define RAM_PATH testbench.dut.uncore.uncore.ram.ram.memory.RAM
|
||||
//`define RAM_PATH testbench.dut.uncore.uncore.ram.ram.memory
|
||||
`define RAM_PATH testbench.dut.uncoregen.uncore.ram.ram.memory.ram
|
||||
//`define RAM_BASE_ADDR 32'h80000000
|
||||
`define RAM_BASE_ADDR testbench.P.UNCORE_RAM_BASE
|
||||
|
||||
// These two routines are specific to a particular design. They are used
|
||||
// to read and write to the "mailbox" locations, to synchronize behaviors
|
||||
// between C code on the processors with activity performed in UVM (and
|
||||
// among activities in UVM).
|
||||
//
|
||||
// Every design will be different. Here we just have a simple Verilog
|
||||
// array that we can read and write.
|
||||
//
|
||||
function automatic void trek_backdoor_read64(
|
||||
input longint unsigned address,
|
||||
output longint unsigned data,
|
||||
input int unsigned debug = 1);
|
||||
|
||||
//bit [15:0] offset = (address-`RAM_BASE_ADDR) >> 2;
|
||||
bit [31:0] offset = ((address-`RAM_BASE_ADDR)/(testbench.P.XLEN/8));
|
||||
if (address[1:0] != 2'b00) begin: misaligned
|
||||
$display("%t trek_backdoor_read64: Misaligned address", $time);
|
||||
$finish();
|
||||
end
|
||||
|
||||
//data[63:32] = `RAM_PATH[offset + 0];
|
||||
//data[31: 0] = `RAM_PATH[offset + 1];
|
||||
data[63:0] = `RAM_PATH.RAM[offset + 0];
|
||||
if (data != 0)
|
||||
$display("%t trek_backdoor_read64: Read 64'h%016h from address 64'h%016h",
|
||||
$time, data, address);
|
||||
endfunction: trek_backdoor_read64
|
||||
|
||||
|
||||
function automatic void trek_backdoor_write64(
|
||||
input longint unsigned address,
|
||||
input longint unsigned data,
|
||||
input int unsigned debug = 1);
|
||||
|
||||
//bit [15:0] offset = (address-`RAM_BASE_ADDR) >> 2;
|
||||
bit [31:0] offset = ((address-`RAM_BASE_ADDR)/(testbench.P.XLEN/8));
|
||||
|
||||
if (address[1:0] != 2'b00) begin: misaligned
|
||||
$display("%t trek_backdoor_write64: Misaligned address", $time);
|
||||
$finish();
|
||||
end
|
||||
//`RAM_PATH[offset + 0] = data[63:32];
|
||||
//`RAM_PATH[offset + 1] = data[31: 0];
|
||||
`RAM_PATH.RAM[offset + 0] = data[63:0];
|
||||
//$display("%t trek_backdoor_write64: Wrote 64'h%016h to address 64'h%016h",
|
||||
//$time, data, address);
|
||||
endfunction: trek_backdoor_write64
|
||||
|
||||
|
||||
// For performance, we want to read mailboxes ONLY when they're written to!
|
||||
// (This is very important on emulators!)
|
||||
//
|
||||
// Here we trigger a signal when a memory write happens to the range of
|
||||
// addresses where the mailboxes are.
|
||||
//
|
||||
// A clock later, we go poll all the mailboxes (using the "backdoor_read"
|
||||
// method above.
|
||||
//
|
||||
// Each design will be different, depending on where you are able to snoop
|
||||
// for writes and how long it takes a write to propagate from that point
|
||||
// to the place where the backdoor read will find it.
|
||||
|
||||
bit trek_c2t_mbox_event;
|
||||
bit trek_is_event_addr;
|
||||
|
||||
//assign trek_is_event_addr =
|
||||
// ((((`RAM_PATH.ad << 2) + `RAM_BASE_ADDR) >= `TREK_C2T_MBOX_BASE) &&
|
||||
// (((`RAM_PATH.ad << 2) + `RAM_BASE_ADDR) < `TREK_C2T_MBOX_LIMIT));
|
||||
//
|
||||
//always_ff @(posedge `RAM_PATH.clk) begin: trigger_reading_of_mailboxes
|
||||
// trek_c2t_mbox_event <= (trek_is_event_addr &&
|
||||
// (`RAM_PATH.n_cs == 1'b0) &&
|
||||
// (`RAM_PATH.n_we == 1'b0));
|
||||
//end
|
||||
|
||||
// Design specifc: one stage delayed so write has a time to settle
|
||||
//always @(posedge trek_c2t_mbox_event) begin: read_all_mailboxes
|
||||
always @(posedge testbench.clk) begin: read_all_mailboxes
|
||||
trek_poll_mbox();
|
||||
end
|
53
tests/breker/Makefile
Normal file
53
tests/breker/Makefile
Normal file
@ -0,0 +1,53 @@
|
||||
SHELL := /bin/bash
|
||||
|
||||
# Breker/Trek paths and variables
|
||||
TESTDIR := $(WALLY)/tests/breker/work
|
||||
TREKFILES := $(WALLY)/testbench/trek_files
|
||||
CONSTRAINTS_DIR := $(WALLY)/tests/breker/constraints
|
||||
PLATFORM_YAML := $(TREKFILES)/platform.yaml
|
||||
CUSTOMER_YAML := $(TREKFILES)/customer.yaml
|
||||
TREKSVIP_YAML := $(BREKER_HOME)/examples/tutorials/svip/treksvip/yaml/treksvip.yaml
|
||||
CONSTRAINT_FILES := $(shell find $(CONSTRAINTS_DIR) -type f)
|
||||
TREKEXE_FLAGS += --seed 0x # free (0x) or lock (0x1) the seed used for test generation
|
||||
TREKSVIP := source $(TREKFILES)/breker-setup.sh && treksvip -p $(PLATFORM_YAML) -p $(TREKSVIP_YAML) $(TREKEXE_FLAGS)
|
||||
|
||||
# Compilation paths and variables
|
||||
START_LIB_DIR := $(WALLY)/examples/C/common
|
||||
START_LIB := $(START_LIB_DIR)/crt.S $(START_LIB_DIR)/syscalls.c
|
||||
MARCH :=-march=rv64gc_zcb_zfa_zba_zbb_zbc_zbs_zfh_zicboz_zicbop_zicbom_zbkb_zbkx_zknd_zkne_zknh_svinval
|
||||
MABI :=-mabi=lp64d
|
||||
LINKER := $(START_LIB_DIR)/test.ld
|
||||
LINK_FLAGS := -nostartfiles
|
||||
CFLAGS := -Wa,-alhs -Wa,-L -mcmodel=medany -Og -DSINGLE_CPU
|
||||
WIDTH := 64
|
||||
|
||||
# Find all constraint files and generate tests for each one
|
||||
TESTS = $(patsubst $(CONSTRAINTS_DIR)/%.yaml,$(TESTDIR)/%,$(CONSTRAINT_FILES))
|
||||
.PHONY: all clean
|
||||
all: $(TESTS)
|
||||
|
||||
# Generate c tests
|
||||
$(TESTDIR)/%: $(CONSTRAINTS_DIR)/%.yaml | $(TESTDIR)
|
||||
$(TREKSVIP) -p $< -p $(CUSTOMER_YAML) -o $@/$* -e pss_top.entry
|
||||
$(MAKE) $@/$*.elf.memfile
|
||||
|
||||
# Compile c code
|
||||
.PRECIOUS: %.elf
|
||||
%.elf: %.c
|
||||
riscv64-unknown-elf-gcc $(MARCH) $(MABI) $(CFLAGS) $(LINK_FLAGS) -T$(LINKER) -I$(START_LIB_DIR) $(START_LIB) -g -o $@ $< > /dev/null
|
||||
|
||||
# Convert elf to hex
|
||||
%.elf.memfile: %.elf
|
||||
riscv64-unknown-elf-objdump -D $< > $<.objdump
|
||||
riscv64-unknown-elf-elf2hex --bit-width $(WIDTH) --input $< --output $@
|
||||
extractFunctionRadix.sh $<.objdump
|
||||
|
||||
# View the model graph TODO: What does this do? Move to another makefile?
|
||||
%.view_graph: $(CONSTRAINTS_DIR)/%.yaml
|
||||
$(TREKSVIP) -p $(CONSTRAINTS_DIR)/$^.yaml -p $(CUSTOMER_YAML) -t pss_top.entry
|
||||
|
||||
$(TESTDIR):
|
||||
mkdir -p $(TESTDIR)
|
||||
|
||||
clean:
|
||||
rm -rf $(TESTS)
|
18
tests/breker/README.md
Normal file
18
tests/breker/README.md
Normal file
@ -0,0 +1,18 @@
|
||||
Jordan Carlin, jcarlin@hmc.edu, December 2024
|
||||
|
||||
# Breker Tests for CVW
|
||||
|
||||
[Breker's Trek Test Suite](https://brekersystems.com/products/trek-suite/) is a proprietary set of tests that require a license to use (this license is not generally available to noncommercial users).
|
||||
|
||||
To generate the Breker tests (with a license), run `make` in both the `tests/breker` and `testbench/trek_files` directories. Alternatively, running `make breker` from the top-level `$WALLY` directory will run both of these. Before running, make sure to set `$BREKER_HOME` in your system's `site-setup.sh` file. The `testbench/trek_files` Makefile only needs to be run once, but the tests that are generated can be different each time so rerunning the `tests/breker` Makefile is worthwhile.
|
||||
|
||||
This will generate a testsuite for each of the constraint yaml files in the `constraints` directory. These generated tests are produced in the `tests/breker/work` directory. To run a single test use `wsim` to run the elf. The `breker` configuration must be used. For example,
|
||||
|
||||
```bash
|
||||
$ wsim breker $WALLY/tests/breker/riscv/riscv.elf
|
||||
```
|
||||
|
||||
To run all of the generated Breker tests use
|
||||
```bash
|
||||
$ regression-wally --breker
|
||||
```
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user