mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' into main
This commit is contained in:
commit
46260377e4
1
.gitmodules
vendored
1
.gitmodules
vendored
@ -23,6 +23,7 @@
|
|||||||
[submodule "addins/riscv-arch-test"]
|
[submodule "addins/riscv-arch-test"]
|
||||||
path = addins/riscv-arch-test
|
path = addins/riscv-arch-test
|
||||||
url = https://github.com/riscv-non-isa/riscv-arch-test
|
url = https://github.com/riscv-non-isa/riscv-arch-test
|
||||||
|
branch = dev
|
||||||
[submodule "addins/branch-predictor-simulator"]
|
[submodule "addins/branch-predictor-simulator"]
|
||||||
path = addins/branch-predictor-simulator
|
path = addins/branch-predictor-simulator
|
||||||
url = https://github.com/ross144/branch-predictor-simulator
|
url = https://github.com/ross144/branch-predictor-simulator
|
||||||
|
4
Makefile
4
Makefile
@ -55,8 +55,8 @@ riscvdv:
|
|||||||
# python3 ${WALLY}/addins/riscv-dv/run.py --test ${test_name} --target rv64gc --output tests/riscvdv --iterations 1 -si questa --iss spike --verbose --cov --seed 0 --steps gcc_compile >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
# python3 ${WALLY}/addins/riscv-dv/run.py --test ${test_name} --target rv64gc --output tests/riscvdv --iterations 1 -si questa --iss spike --verbose --cov --seed 0 --steps gcc_compile >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
||||||
# python3 ${WALLY}/addins/riscv-dv/run.py --test ${test_name} --target rv64gc --output tests/riscvdv --iterations 1 -si questa --iss spike --verbose --cov --seed 0 --steps iss_sim >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
# python3 ${WALLY}/addins/riscv-dv/run.py --test ${test_name} --target rv64gc --output tests/riscvdv --iterations 1 -si questa --iss spike --verbose --cov --seed 0 --steps iss_sim >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
||||||
# run-elf.bash --seed ${SIM}/questa/seed0.txt --verbose --elf ${WALLY}/tests/riscvdv/asm_test/${test_name}_0.o >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
# run-elf.bash --seed ${SIM}/questa/seed0.txt --verbose --elf ${WALLY}/tests/riscvdv/asm_test/${test_name}_0.o >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
||||||
run-elf-cov.bash --seed ${SIM}/questa/seed0.txt --verbose --coverdb ${SIM}/questa/riscv.ucdb --elf ${WALLY}/tests/riscvdv/asm_test/${test_name}_0.o >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
#run-elf-cov.bash --seed ${SIM}/questa/seed0.txt --verbose --coverdb ${SIM}/questa/riscv.ucdb --elf ${WALLY}/tests/riscvdv/asm_test/${test_name}_0.o >> ${SIM}/questa/functcov_logs/${test_name}.log 2>&1
|
||||||
cp ${SIM}/questa/riscv.ucdb ${SIM}/questa/functcov_ucdbs/${test_name}.ucdb
|
#cp ${SIM}/questa/riscv.ucdb ${SIM}/questa/functcov_ucdbs/${test_name}.ucdb
|
||||||
|
|
||||||
riscvdv_functcov:
|
riscvdv_functcov:
|
||||||
mkdir -p ${SIM}/questa/functcov_logs
|
mkdir -p ${SIM}/questa/functcov_logs
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 1498e95cc6163ef1649028c7addf5a514b17e30c
|
Subproject commit 7152865aca51062c87ff2cbb014e199a24bdc874
|
@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
###########################################
|
|
||||||
## imperas-one-time.sh
|
|
||||||
##
|
|
||||||
## Written: Ross Thompson (ross1728@gmail.com) and Lee Moore (moore@imperas.com)
|
|
||||||
## Created: 31 January 2023
|
|
||||||
## Modified: 31 January 2023
|
|
||||||
##
|
|
||||||
## Purpose: One time setup script for running imperas.
|
|
||||||
##
|
|
||||||
## A component of the CORE-V-WALLY configurable RISC-V project.
|
|
||||||
## https://github.com/openhwgroup/cvw
|
|
||||||
##
|
|
||||||
## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
|
|
||||||
##
|
|
||||||
## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
|
||||||
##
|
|
||||||
## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
|
|
||||||
## except in compliance with the License, or, at your option, the Apache License version 2.0. You
|
|
||||||
## may obtain a copy of the License at
|
|
||||||
##
|
|
||||||
## https://solderpad.org/licenses/SHL-2.1/
|
|
||||||
##
|
|
||||||
## Unless required by applicable law or agreed to in writing, any work distributed under the
|
|
||||||
## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
||||||
## either express or implied. See the License for the specific language governing permissions
|
|
||||||
## and limitations under the License.
|
|
||||||
################################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
IMP_HASH=355a055ff7e36bc897e942e41f06e1baf96e34d5
|
|
||||||
|
|
||||||
# clone the Imperas repo
|
|
||||||
cd $WALY
|
|
||||||
if [ ! -d external ]; then
|
|
||||||
mkdir -p external
|
|
||||||
fi
|
|
||||||
pushd external
|
|
||||||
if [ ! -d ImperasDV-HMC ]; then
|
|
||||||
git clone git@github.com:Imperas/ImperasDV-HMC.git
|
|
||||||
fi
|
|
||||||
pushd ImperasDV-HMC
|
|
||||||
git checkout $IMP_HASH
|
|
||||||
popd
|
|
||||||
popd
|
|
||||||
|
|
||||||
# Setup Imperas
|
|
||||||
source ${WALLY}/external/ImperasDV-HMC/Imperas/bin/setup.sh
|
|
||||||
setupImperas ${WALLY}/external/ImperasDV-HMC/Imperas
|
|
||||||
export IMPERAS_PERSONALITY=CPUMAN_DV_ASYNC
|
|
||||||
|
|
||||||
# setup QUESTA (Imperas only command, YMMV)
|
|
||||||
#svsetup -questa
|
|
||||||
|
|
||||||
|
|
@ -12,7 +12,7 @@ NC='\033[0m' # No Color
|
|||||||
fails=0
|
fails=0
|
||||||
|
|
||||||
if [ "$1" == "--nightly" ]; then
|
if [ "$1" == "--nightly" ]; then
|
||||||
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i) # fdqh_rv64gc
|
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i)
|
||||||
derivconfigs=`ls $WALLY/config/deriv`
|
derivconfigs=`ls $WALLY/config/deriv`
|
||||||
for entry in $derivconfigs
|
for entry in $derivconfigs
|
||||||
do
|
do
|
||||||
@ -21,12 +21,15 @@ if [ "$1" == "--nightly" ]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i ) # add fdqh_rv64gc when working
|
configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i fdqh_rv64gc)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for config in ${configs[@]}; do
|
for config in ${configs[@]}; do
|
||||||
# echo "$config linting..."
|
# echo "$config linting..."
|
||||||
if !($verilator --lint-only --quiet --top-module wallywrapper "-I$basepath/config/shared" "-I$basepath/config/$config" "-I$basepath/config/deriv/$config" $basepath/src/cvw.sv $basepath/testbench/wallywrapper.sv $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes ); then
|
if !($verilator --lint-only --quiet --top-module wallywrapper \
|
||||||
|
"-I$basepath/config/shared" "-I$basepath/config/$config" "-I$basepath/config/deriv/$config" \
|
||||||
|
$basepath/src/cvw.sv $basepath/testbench/wallywrapper.sv $basepath/src/*/*.sv $basepath/src/*/*/*.sv \
|
||||||
|
-Wall -Wno-UNUSEDSIGNAL -Wno-UNUSEDPARAM -Wno-VARHIDDEN -Wno-GENUNNAMED -Wno-PINCONNECTEMPTY); then
|
||||||
if [ "$1" == "-nightly" ]; then
|
if [ "$1" == "-nightly" ]; then
|
||||||
echo -e "${RED}$config failed lint${NC}"
|
echo -e "${RED}$config failed lint${NC}"
|
||||||
fails=$((fails+1))
|
fails=$((fails+1))
|
||||||
@ -48,4 +51,5 @@ echo -e "${GREEN}All ${#configs[@]} lints run with no errors or warnings"
|
|||||||
# -I points to the include directory where files such as `include config.vh are found
|
# -I points to the include directory where files such as `include config.vh are found
|
||||||
|
|
||||||
# For more exhaustive (and sometimes spurious) warnings, add --Wall to the Verilator command
|
# For more exhaustive (and sometimes spurious) warnings, add --Wall to the Verilator command
|
||||||
|
# verilator --lint-only -Wall --quiet --top-module wallywrapper -Iconfig/shared -Iconfig/rv64gc src/cvw.sv testbench/wallywrapper.sv src/*/*.sv src/*/*/*.sv -Wno-UNUSEDPARAM -Wno-VARHIDDEN -Wno-GENUNNAMED -Wno-PINCONNECTEMPTY
|
||||||
# Unfortunately, this produces a bunch of UNUSED and UNDRIVEN signal warnings in blocks that are configured to not exist.
|
# Unfortunately, this produces a bunch of UNUSED and UNDRIVEN signal warnings in blocks that are configured to not exist.
|
||||||
|
@ -423,6 +423,7 @@ def main():
|
|||||||
"""Run the tests and count the failures"""
|
"""Run the tests and count the failures"""
|
||||||
global configs, coverage
|
global configs, coverage
|
||||||
os.chdir(regressionDir)
|
os.chdir(regressionDir)
|
||||||
|
os.system('rm -rf questa/wkdir')
|
||||||
for d in ["questa/logs", "questa/wkdir", "verilator/logs", "verilator/wkdir", "vcs/logs", "vcs/wkdir"]:
|
for d in ["questa/logs", "questa/wkdir", "verilator/logs", "verilator/wkdir", "vcs/logs", "vcs/wkdir"]:
|
||||||
try:
|
try:
|
||||||
os.mkdir(d)
|
os.mkdir(d)
|
||||||
|
@ -112,7 +112,6 @@ make install
|
|||||||
# Verilator needs to be built from scratch to get the latest version
|
# Verilator needs to be built from scratch to get the latest version
|
||||||
# apt-get install verilator installs version 4.028 as of 6/8/23
|
# apt-get install verilator installs version 4.028 as of 6/8/23
|
||||||
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g
|
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g
|
||||||
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g
|
|
||||||
cd $RISCV
|
cd $RISCV
|
||||||
git clone https://github.com/verilator/verilator # Only first time
|
git clone https://github.com/verilator/verilator # Only first time
|
||||||
# unsetenv VERILATOR_ROOT # For csh; ignore error if on bash
|
# unsetenv VERILATOR_ROOT # For csh; ignore error if on bash
|
||||||
|
@ -385,10 +385,23 @@ VIRTMEM_SUPPORTED 0
|
|||||||
|
|
||||||
deriv nodcache_rv32gc rv32gc
|
deriv nodcache_rv32gc rv32gc
|
||||||
DCACHE_SUPPORTED 0
|
DCACHE_SUPPORTED 0
|
||||||
|
D_SUPPORTED 0
|
||||||
|
ZALRSC_SUPPORTED 0
|
||||||
|
ZAAMO_SUPPORTED 0
|
||||||
|
ZICBOM_SUPPORTED 0
|
||||||
|
ZICBOZ_SUPPORTED 0
|
||||||
|
VIRTMEM_SUPPORTED 0
|
||||||
|
|
||||||
|
# nocache_rv32gc must also disable several features incompatible with no cache
|
||||||
deriv nocache_rv32gc rv32gc
|
deriv nocache_rv32gc rv32gc
|
||||||
ICACHE_SUPPORTED 0
|
ICACHE_SUPPORTED 0
|
||||||
DCACHE_SUPPORTED 0
|
DCACHE_SUPPORTED 0
|
||||||
|
D_SUPPORTED 0
|
||||||
|
ZALRSC_SUPPORTED 0
|
||||||
|
ZAAMO_SUPPORTED 0
|
||||||
|
ZICBOM_SUPPORTED 0
|
||||||
|
ZICBOZ_SUPPORTED 0
|
||||||
|
VIRTMEM_SUPPORTED 0
|
||||||
|
|
||||||
deriv noicache_rv64gc rv64gc
|
deriv noicache_rv64gc rv64gc
|
||||||
ICACHE_SUPPORTED 0
|
ICACHE_SUPPORTED 0
|
||||||
|
@ -110,20 +110,10 @@ localparam CVTLEN = (ZFA_SUPPORTED & D_SUPPORTED) ? `max(BASECVTLEN, 32'd84) : B
|
|||||||
localparam LLEN = `max($unsigned(FLEN), $unsigned(XLEN));
|
localparam LLEN = `max($unsigned(FLEN), $unsigned(XLEN));
|
||||||
localparam LOGCVTLEN = $unsigned($clog2(CVTLEN+1));
|
localparam LOGCVTLEN = $unsigned($clog2(CVTLEN+1));
|
||||||
|
|
||||||
// size of FMA output
|
// size of FMA output in U(NF+4).(3NF+2) format
|
||||||
localparam FMALEN = 3*NF + 6;
|
localparam FMALEN = 3*NF + 6;
|
||||||
|
|
||||||
// NORMSHIFTSIZE is the bits out of the normalization shifter
|
// NORMSHIFTSIZE is the bits out of the normalization shifter
|
||||||
// RV32F: max(32+23+1, 2(23)+4, 3(23)+6) = 3*23+6 = 75
|
|
||||||
// RV64F: max(64+23+1, 64 + 23 + 2, 3*23+6) = 89
|
|
||||||
// RV64D: max(84+52+1, 64+52+2, 3*52+6) = 162
|
|
||||||
// *** DH 5/10/24 testbench_fp f_ieee_div_2_1_rv64gc cvtint was failing for fcvt.lu.s
|
|
||||||
// with CVTLEN+NF+1. Changing to CVTLEN+NF+1+2 fixes failures
|
|
||||||
// This same failure occurred for any test with IDIV_ON_FPU = 0, FLEN=32, XLEN=64
|
|
||||||
// because NORMSHIFTSZ becomes limited by convert rather than divider
|
|
||||||
// The two extra bits are necessary because shiftcorrection dropped them for fcvt.
|
|
||||||
// May be possible to remove these two bits by modifying shiftcorrection
|
|
||||||
//localparam NORMSHIFTSZ = `max(`max((CVTLEN+NF+1+2), (DIVb + 1 + NF + 1)), (FMALEN + 2));
|
|
||||||
localparam NORMSHIFTSZ = `max(`max((CVTLEN+NF+1), (DIVb + 1 + NF + 1)), (FMALEN + 2));
|
localparam NORMSHIFTSZ = `max(`max((CVTLEN+NF+1), (DIVb + 1 + NF + 1)), (FMALEN + 2));
|
||||||
|
|
||||||
localparam LOGNORMSHIFTSZ = ($clog2(NORMSHIFTSZ)); // log_2(NORMSHIFTSZ)
|
localparam LOGNORMSHIFTSZ = ($clog2(NORMSHIFTSZ)); // log_2(NORMSHIFTSZ)
|
||||||
|
@ -496,8 +496,7 @@ module fpgaTop
|
|||||||
.UARTSin, .UARTSout, .SDCIntr);
|
.UARTSin, .UARTSout, .SDCIntr);
|
||||||
|
|
||||||
|
|
||||||
// // wally
|
// RT and JP: FIXME add sdc interrupt and HSELEXTSDC, remove old sdc after the new sdc ahb version is implemented
|
||||||
// // *** FIXME add sdc interrupt and HSELEXTSDC, remove old sdc
|
|
||||||
// wallypipelinedsocwrapper wallypipelinedsocwrapper
|
// wallypipelinedsocwrapper wallypipelinedsocwrapper
|
||||||
// (.clk(CPUCLK),
|
// (.clk(CPUCLK),
|
||||||
// .reset_ext(bus_struct_reset),
|
// .reset_ext(bus_struct_reset),
|
||||||
|
@ -490,7 +490,7 @@ module fpgaTop
|
|||||||
.peripheral_aresetn(peripheral_aresetn));
|
.peripheral_aresetn(peripheral_aresetn));
|
||||||
|
|
||||||
// wally
|
// wally
|
||||||
// *** FIXME add sdc interrupt and HSELEXTSDC, remove old sdc
|
// RT and JP: FIXME add sdc interrupt and HSELEXTSDC, remove old sdc after the new sdc ahb version is implemented
|
||||||
|
|
||||||
`include "parameter-defs.vh"
|
`include "parameter-defs.vh"
|
||||||
|
|
||||||
@ -1053,7 +1053,6 @@ module fpgaTop
|
|||||||
.sys_rst(resetn), // omg. this is active low?!?!??
|
.sys_rst(resetn), // omg. this is active low?!?!??
|
||||||
.mmcm_locked(mmcm_locked),
|
.mmcm_locked(mmcm_locked),
|
||||||
|
|
||||||
// *** What are these?
|
|
||||||
.app_sr_req(1'b0), // reserved command
|
.app_sr_req(1'b0), // reserved command
|
||||||
.app_ref_req(1'b0), // refresh command
|
.app_ref_req(1'b0), // refresh command
|
||||||
.app_zq_req(1'b0), // recalibrate command
|
.app_zq_req(1'b0), // recalibrate command
|
||||||
|
@ -73,7 +73,6 @@ add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/bpred/bpre
|
|||||||
add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/PCSpillNextF
|
add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/PCSpillNextF
|
||||||
add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/PCSpillF
|
add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/PCSpillF
|
||||||
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} /testbench/dut/core/ifu/bpred/bpred/Predictor/DirPredictor/GHRM
|
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} /testbench/dut/core/ifu/bpred/bpred/Predictor/DirPredictor/GHRM
|
||||||
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} -label PHT /testbench/dut/core/ifu/bpred/bpred/Predictor/DirPredictor/PHT/mem
|
|
||||||
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[5]}
|
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[5]}
|
||||||
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[4]}
|
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[4]}
|
||||||
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[3]}
|
add wave -noupdate -group ifu -group Bpred -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[3]}
|
||||||
@ -91,7 +90,7 @@ add wave -noupdate -group ifu /testbench/dut/core/ifu/IFUStallF
|
|||||||
add wave -noupdate -group ifu -group Spill /testbench/dut/core/ifu/Spill/spill/CurrState
|
add wave -noupdate -group ifu -group Spill /testbench/dut/core/ifu/Spill/spill/CurrState
|
||||||
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/SpillF
|
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/SpillF
|
||||||
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/IFUCacheBusStallF
|
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/IFUCacheBusStallF
|
||||||
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/ITLBMissF
|
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/ITLBMissOrUpdateAF
|
||||||
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/TakeSpillF
|
add wave -noupdate -group ifu -group Spill -expand -group takespill /testbench/dut/core/ifu/Spill/spill/TakeSpillF
|
||||||
add wave -noupdate -group ifu -group bus /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/HSIZE
|
add wave -noupdate -group ifu -group bus /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/HSIZE
|
||||||
add wave -noupdate -group ifu -group bus /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/HBURST
|
add wave -noupdate -group ifu -group bus /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/HBURST
|
||||||
@ -123,50 +122,50 @@ add wave -noupdate -group ifu -group icache -expand -group lru {/testbench/dut/c
|
|||||||
add wave -noupdate -group ifu -group icache -expand -group lru /testbench/dut/core/ifu/bus/icache/icache/vict/cacheLRU/CurrLRU
|
add wave -noupdate -group ifu -group icache -expand -group lru /testbench/dut/core/ifu/bus/icache/icache/vict/cacheLRU/CurrLRU
|
||||||
add wave -noupdate -group ifu -group icache -expand -group lru /testbench/dut/core/ifu/bus/icache/icache/vict/cacheLRU/LRUMemory
|
add wave -noupdate -group ifu -group icache -expand -group lru /testbench/dut/core/ifu/bus/icache/icache/vict/cacheLRU/LRUMemory
|
||||||
add wave -noupdate -group ifu -group icache -group way3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/SelectedWriteWordEn}
|
add wave -noupdate -group ifu -group icache -group way3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/CacheTagMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way3 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/ValidBits}
|
add wave -noupdate -group ifu -group icache -group way3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/ValidBits}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[0]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[0]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[1]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[1]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[2]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[2]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[3]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[3]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way3 -group way3word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way3 -group way3word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[3]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/SelectedWriteWordEn}
|
add wave -noupdate -group ifu -group icache -group way2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/CacheTagMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way2 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/ValidBits}
|
add wave -noupdate -group ifu -group icache -group way2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/ValidBits}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -expand -group way2word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[0]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way2 -expand -group way2word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[0]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -expand -group way2word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way2 -expand -group way2word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[1]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[1]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[2]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[2]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[3]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[3]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way2 -group way2word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way2 -group way2word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[2]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/HitWay}
|
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/HitWay}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/SelectedWriteWordEn}
|
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/CacheTagMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way1 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/ValidBits}
|
add wave -noupdate -group ifu -group icache -group way1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/ValidBits}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[0]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[0]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[1]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[1]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[2]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[2]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[3]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[3]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way1 -group way1word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way1 -group way1word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[1]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/SelectedWriteWordEn}
|
add wave -noupdate -group ifu -group icache -group way0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/CacheTagMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way0 -label tag {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/ValidBits}
|
add wave -noupdate -group ifu -group icache -group way0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/ValidBits}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[0]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[0]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word0 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[1]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[1]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word1 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[2]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[2]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word2 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[3]/wordram/CacheDataMem/dout}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[3]/wordram/CacheDataMem/dout}
|
||||||
add wave -noupdate -group ifu -group icache -group way0 -group way0word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -group ifu -group icache -group way0 -group way0word3 {/testbench/dut/core/ifu/bus/icache/icache/CacheWays[0]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/immu/immu/TLBWrite
|
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/immu/immu/TLBWrite
|
||||||
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/ITLBMissF
|
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/ITLBMissF
|
||||||
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/immu/immu/VAdr
|
add wave -noupdate -group ifu -group itlb /testbench/dut/core/ifu/immu/immu/VAdr
|
||||||
@ -205,7 +204,7 @@ add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/SrcAE
|
|||||||
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/SrcBE
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/SrcBE
|
||||||
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ALUResultE
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ALUResultE
|
||||||
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ResultW
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ResultW
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/FunctionName/FunctionName/FunctionName
|
add wave -noupdate -expand -group {Memory Stage} /testbench/FunctionName/FunctionName
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrValidM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrValidM
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/PCM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/PCM
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrM
|
||||||
@ -240,7 +239,7 @@ add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/z
|
|||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/ByteMaskSpillM
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/ByteMaskSpillM
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/LSUWriteDataM
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/LSUWriteDataM
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/LSUWriteDataSpillM
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/LSUWriteDataSpillM
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/CacheWriteData
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/WriteData
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/ByteMask
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/ByteMask
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/WriteSelLogic/BlankByteMask
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/WriteSelLogic/BlankByteMask
|
||||||
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/WriteSelLogic/DemuxedByteMask
|
add wave -noupdate -expand -group lsu -group alignment /testbench/dut/core/lsu/bus/dcache/dcache/WriteSelLogic/DemuxedByteMask
|
||||||
@ -282,7 +281,6 @@ add wave -noupdate -expand -group lsu -expand -group dcache -group {replacement
|
|||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {replacement policy} -group DETAILS /testbench/dut/core/lsu/bus/dcache/dcache/vict/cacheLRU/WayExpanded
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {replacement policy} -group DETAILS /testbench/dut/core/lsu/bus/dcache/dcache/vict/cacheLRU/WayExpanded
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/LineDirty
|
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/LineDirty
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay
|
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWay
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/NextFlushAdr
|
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush -radix hexadecimal /testbench/dut/core/lsu/bus/dcache/dcache/FlushAdr
|
add wave -noupdate -expand -group lsu -expand -group dcache -group flush -radix hexadecimal /testbench/dut/core/lsu/bus/dcache/dcache/FlushAdr
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/cachefsm/FlushWayFlag
|
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/cachefsm/FlushWayFlag
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWayCntEn
|
add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/core/lsu/bus/dcache/dcache/FlushWayCntEn
|
||||||
@ -297,68 +295,67 @@ add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM w
|
|||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ClearValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ClearValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetDirtyWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/SetDirtyWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/CacheTagMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/DirtyBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/DirtyBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/bwe}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/bwe}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/bwe}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/bwe}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/bwe}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/bwe}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/ce}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/ce}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/bwe}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/bwe}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -expand -group way0 -expand -group Way0Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SelNonHit}
|
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SelectedWriteWordEn}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ClearValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ClearValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetDirtyWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/SetDirtyWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/CacheTagMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ValidBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/ValidBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/DirtyBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/DirtyBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word0 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word0 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[0]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[1]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word2 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word2 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way1 -group Way1Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[1]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SelectedWriteWordEn}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ClearValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ClearValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetDirtyWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/SetDirtyWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/CacheTagMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ValidBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/ValidBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/DirtyBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/DirtyBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[0]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[1]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way2 -group Way2Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[2]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SelectedWriteWordEn}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SelectedWriteWordEn}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ClearValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ClearValidWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetDirtyWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/SetDirtyWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/CacheTagMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/CacheTagMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ValidBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/ValidBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/DirtyBits}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/DirtyBits}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[0]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word1 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[1]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word2 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word2 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word2 -expand {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[2]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/wordram/CacheDataMem/we}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/wordram/CacheDataMem/we}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/wordram/CacheDataMem/RAM}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group way3 -group Way3Word3 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[3]/word[3]/wordram/CacheDataMem/ram/RAM}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM writes} -group valid/dirty /testbench/dut/core/lsu/bus/dcache/dcache/ClearDirty
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/HitWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/HitWay}
|
||||||
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidWay}
|
add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/core/lsu/bus/dcache/dcache/CacheWays[0]/ValidWay}
|
||||||
@ -387,7 +384,7 @@ add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/d
|
|||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Translate
|
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/Translate
|
||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/DisableTranslation
|
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/DisableTranslation
|
||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBMiss
|
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBMiss
|
||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/TLBHit
|
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/TLBHit
|
||||||
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/PhysicalAddress
|
add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/core/lsu/dmmu/dmmu/PhysicalAddress
|
||||||
add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/TLBPageFault
|
add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/TLBPageFault
|
||||||
add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/LoadAccessFaultM
|
add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/core/lsu/dmmu/dmmu/LoadAccessFaultM
|
||||||
@ -417,7 +414,6 @@ add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hp
|
|||||||
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/NextPageType
|
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/NextPageType
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/PageType
|
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/PageType
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/ValidNonLeafPTE
|
add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/core/lsu/hptw/hptw/ValidNonLeafPTE
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/ITLBMissF
|
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/DTLBMissM
|
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/DTLBMissM
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/hptw/hptw/ITLBWriteF
|
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/hptw/hptw/ITLBWriteF
|
||||||
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/hptw/hptw/DTLBWriteM
|
add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/core/lsu/hptw/hptw/DTLBWriteM
|
||||||
|
@ -86,7 +86,7 @@ INCLUDE_DIRS=$(find ${SRC} -type d | xargs -I {} echo -n "{} ")
|
|||||||
INCLUDE_PATH="+incdir+${CFG}/${CONFIG_VARIANT} +incdir+${CFG}/deriv/${CONFIG_VARIANT} +incdir+${CFG}/shared +incdir+../../tests +define+ +incdir+${TB} ${SRC}/cvw.sv +incdir+${SRC}"
|
INCLUDE_PATH="+incdir+${CFG}/${CONFIG_VARIANT} +incdir+${CFG}/deriv/${CONFIG_VARIANT} +incdir+${CFG}/shared +incdir+../../tests +define+ +incdir+${TB} ${SRC}/cvw.sv +incdir+${SRC}"
|
||||||
|
|
||||||
# Prepare RTL files avoiding certain paths
|
# Prepare RTL files avoiding certain paths
|
||||||
RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/clockgater.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x64.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x32.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_512x64.sv") ${TB}/testbench.sv $(find ${TB}/common -name "*.sv" ! -path "${TB}/common/wallyTracer.sv")"
|
RTL_FILES="$INCLUDE_DIRS $(find ${SRC} -name "*.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x64.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_128x64.sv" ! -path "${SRC}/generic/mem/rom1p1r_128x32.sv" ! -path "${SRC}/generic/mem/ram2p1r1wbe_2048x64.sv") ${TB}/testbench.sv $(find ${TB}/common -name "*.sv" ! -path "${TB}/common/wallyTracer.sv")"
|
||||||
|
|
||||||
# Simulation and Coverage Commands
|
# Simulation and Coverage Commands
|
||||||
OUTPUT="sim_out"
|
OUTPUT="sim_out"
|
||||||
|
@ -44,7 +44,7 @@ default: run
|
|||||||
|
|
||||||
run: wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}
|
run: wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}
|
||||||
mkdir -p $(VERILATOR_DIR)/logs
|
mkdir -p $(VERILATOR_DIR)/logs
|
||||||
wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} ${ARGTEST}
|
wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH} ${ARGTEST} $(EXTRA_ARGS)
|
||||||
|
|
||||||
profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF)
|
profile: obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF)
|
||||||
$(VERILATOR_DIR)/obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) ${ARGTEST}
|
$(VERILATOR_DIR)/obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF) ${ARGTEST}
|
||||||
@ -61,7 +61,6 @@ wkdir/$(WALLYCONF)_$(TEST)/V${TESTBENCH}: $(DEPENDENCIES)
|
|||||||
--Mdir wkdir/$(WALLYCONF)_$(TEST) -o V${TESTBENCH} \
|
--Mdir wkdir/$(WALLYCONF)_$(TEST) -o V${TESTBENCH} \
|
||||||
--binary --trace \
|
--binary --trace \
|
||||||
$(OPT) $(PARAMS) $(NONPROF) \
|
$(OPT) $(PARAMS) $(NONPROF) \
|
||||||
$(EXTRA_ARGS) \
|
|
||||||
--top-module ${TESTBENCH} --relative-includes \
|
--top-module ${TESTBENCH} --relative-includes \
|
||||||
$(INCLUDE_PATH) \
|
$(INCLUDE_PATH) \
|
||||||
${WRAPPER} \
|
${WRAPPER} \
|
||||||
@ -74,7 +73,6 @@ obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF): $(DEPENDENCIES)
|
|||||||
--Mdir obj_dir_profiling -o V${TESTBENCH}_$(WALLYCONF) \
|
--Mdir obj_dir_profiling -o V${TESTBENCH}_$(WALLYCONF) \
|
||||||
--binary \
|
--binary \
|
||||||
--prof-cfuncs $(OPT) $(PARAMS) \
|
--prof-cfuncs $(OPT) $(PARAMS) \
|
||||||
$(EXTRA_ARGS) \
|
|
||||||
--top-module ${TESTBENCH} --relative-includes \
|
--top-module ${TESTBENCH} --relative-includes \
|
||||||
$(INCLUDE_PATH) \
|
$(INCLUDE_PATH) \
|
||||||
${WRAPPER} \
|
${WRAPPER} \
|
||||||
|
@ -3,5 +3,9 @@
|
|||||||
#include "Vtestbench__Dpi.h"
|
#include "Vtestbench__Dpi.h"
|
||||||
|
|
||||||
const char *getenvval(const char *pszName) {
|
const char *getenvval(const char *pszName) {
|
||||||
|
const char *pszValue = getenv(pszName);
|
||||||
|
if (pszValue == NULL) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
return ((const char *) getenv(pszName));
|
return ((const char *) getenv(pszName));
|
||||||
}
|
}
|
10
src/cache/cache.sv
vendored
10
src/cache/cache.sv
vendored
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Implements the I$ and D$. Interfaces with requests from IEU and HPTW and ahbcacheinterface
|
// Purpose: Implements the I$ and D$. Interfaces with requests from IEU and HPTW and ahbcacheinterface
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 7 (Figures 7.9, 7.10, and 7.19)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -87,14 +87,13 @@ module cache import cvw::*; #(parameter cvw_t P,
|
|||||||
logic LineDirty, HitLineDirty;
|
logic LineDirty, HitLineDirty;
|
||||||
logic [TAGLEN-1:0] TagWay [NUMWAYS-1:0];
|
logic [TAGLEN-1:0] TagWay [NUMWAYS-1:0];
|
||||||
logic [TAGLEN-1:0] Tag;
|
logic [TAGLEN-1:0] Tag;
|
||||||
logic [SETLEN-1:0] FlushAdr, NextFlushAdr, FlushAdrP1;
|
logic [SETLEN-1:0] FlushAdr;
|
||||||
logic FlushAdrCntEn, FlushCntRst;
|
logic FlushAdrCntEn, FlushCntRst;
|
||||||
logic FlushAdrFlag, FlushWayFlag;
|
logic FlushAdrFlag, FlushWayFlag;
|
||||||
logic [NUMWAYS-1:0] FlushWay, NextFlushWay;
|
logic [NUMWAYS-1:0] FlushWay, NextFlushWay;
|
||||||
logic FlushWayCntEn;
|
logic FlushWayCntEn;
|
||||||
logic SelWriteback;
|
logic SelWriteback;
|
||||||
logic LRUWriteEn;
|
logic LRUWriteEn;
|
||||||
logic ResetOrFlushCntRst;
|
|
||||||
logic [LINELEN-1:0] ReadDataLine, ReadDataLineCache;
|
logic [LINELEN-1:0] ReadDataLine, ReadDataLineCache;
|
||||||
logic SelFetchBuffer;
|
logic SelFetchBuffer;
|
||||||
logic CacheEn;
|
logic CacheEn;
|
||||||
@ -128,7 +127,7 @@ module cache import cvw::*; #(parameter cvw_t P,
|
|||||||
if(NUMWAYS > 1) begin:vict
|
if(NUMWAYS > 1) begin:vict
|
||||||
cacheLRU #(NUMWAYS, SETLEN, OFFSETLEN, NUMSETS) cacheLRU(
|
cacheLRU #(NUMWAYS, SETLEN, OFFSETLEN, NUMSETS) cacheLRU(
|
||||||
.clk, .reset, .FlushStage, .CacheEn, .HitWay, .ValidWay, .VictimWay, .CacheSetTag, .LRUWriteEn,
|
.clk, .reset, .FlushStage, .CacheEn, .HitWay, .ValidWay, .VictimWay, .CacheSetTag, .LRUWriteEn,
|
||||||
.SetValid, .ClearValid, .PAdr(PAdr[SETTOP-1:OFFSETLEN]), .InvalidateCache);
|
.SetValid, .PAdr(PAdr[SETTOP-1:OFFSETLEN]), .InvalidateCache);
|
||||||
end else
|
end else
|
||||||
assign VictimWay = 1'b1; // one hot.
|
assign VictimWay = 1'b1; // one hot.
|
||||||
|
|
||||||
@ -201,6 +200,9 @@ module cache import cvw::*; #(parameter cvw_t P,
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (!READ_ONLY_CACHE) begin:flushlogic // D$ can be flushed
|
if (!READ_ONLY_CACHE) begin:flushlogic // D$ can be flushed
|
||||||
|
logic ResetOrFlushCntRst;
|
||||||
|
logic [SETLEN-1:0] NextFlushAdr, FlushAdrP1;
|
||||||
|
|
||||||
// Flush address (line number)
|
// Flush address (line number)
|
||||||
assign ResetOrFlushCntRst = reset | FlushCntRst;
|
assign ResetOrFlushCntRst = reset | FlushCntRst;
|
||||||
flopenr #(SETLEN) FlushAdrReg(clk, ResetOrFlushCntRst, FlushAdrCntEn, FlushAdrP1, NextFlushAdr);
|
flopenr #(SETLEN) FlushAdrReg(clk, ResetOrFlushCntRst, FlushAdrCntEn, FlushAdrP1, NextFlushAdr);
|
||||||
|
32
src/cache/cacheLRU.sv
vendored
32
src/cache/cacheLRU.sv
vendored
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Implements Pseudo LRU. Tested for Powers of 2.
|
// Purpose: Implements Pseudo LRU. Tested for Powers of 2.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 7 (Figures 7.8 and 7.15 to 7.18)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -40,7 +40,6 @@ module cacheLRU
|
|||||||
input logic [SETLEN-1:0] PAdr, // Physical address
|
input logic [SETLEN-1:0] PAdr, // Physical address
|
||||||
input logic LRUWriteEn, // Update the LRU state
|
input logic LRUWriteEn, // Update the LRU state
|
||||||
input logic SetValid, // Set the dirty bit in the selected way and set
|
input logic SetValid, // Set the dirty bit in the selected way and set
|
||||||
input logic ClearValid, // Clear the dirty bit in the selected way and set
|
|
||||||
input logic InvalidateCache, // Clear all valid bits
|
input logic InvalidateCache, // Clear all valid bits
|
||||||
output logic [NUMWAYS-1:0] VictimWay // LRU selects a victim to evict
|
output logic [NUMWAYS-1:0] VictimWay // LRU selects a victim to evict
|
||||||
);
|
);
|
||||||
@ -48,11 +47,11 @@ module cacheLRU
|
|||||||
localparam LOGNUMWAYS = $clog2(NUMWAYS);
|
localparam LOGNUMWAYS = $clog2(NUMWAYS);
|
||||||
|
|
||||||
logic [NUMWAYS-2:0] LRUMemory [NUMSETS-1:0];
|
logic [NUMWAYS-2:0] LRUMemory [NUMSETS-1:0];
|
||||||
logic [NUMWAYS-2:0] CurrLRU;
|
logic [NUMWAYS-2:0] CurrLRU, NextLRU, ReadLRU, BypassedLRU;
|
||||||
logic [NUMWAYS-2:0] NextLRU;
|
|
||||||
logic [LOGNUMWAYS-1:0] HitWayEncoded, Way;
|
logic [LOGNUMWAYS-1:0] HitWayEncoded, Way;
|
||||||
logic [NUMWAYS-2:0] WayExpanded;
|
logic [NUMWAYS-2:0] WayExpanded;
|
||||||
logic AllValid;
|
logic AllValid;
|
||||||
|
logic ForwardLRU;
|
||||||
|
|
||||||
genvar row;
|
genvar row;
|
||||||
|
|
||||||
@ -131,29 +130,22 @@ module cacheLRU
|
|||||||
assign Intermediate[node] = CurrLRU[node] ? int1[LOGNUMWAYS-1:0] : int0[LOGNUMWAYS-1:0];
|
assign Intermediate[node] = CurrLRU[node] ? int1[LOGNUMWAYS-1:0] : int0[LOGNUMWAYS-1:0];
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
priorityonehot #(NUMWAYS) FirstZeroEncoder(~ValidWay, FirstZero);
|
priorityonehot #(NUMWAYS) FirstZeroEncoder(~ValidWay, FirstZero);
|
||||||
binencoder #(NUMWAYS) FirstZeroWayEncoder(FirstZero, FirstZeroWay);
|
binencoder #(NUMWAYS) FirstZeroWayEncoder(FirstZero, FirstZeroWay);
|
||||||
mux2 #(LOGNUMWAYS) VictimMux(FirstZeroWay, Intermediate[NUMWAYS-2], AllValid, VictimWayEnc);
|
mux2 #(LOGNUMWAYS) VictimMux(FirstZeroWay, Intermediate[NUMWAYS-2], AllValid, VictimWayEnc);
|
||||||
decoder #(LOGNUMWAYS) decoder (VictimWayEnc, VictimWay);
|
decoder #(LOGNUMWAYS) decoder (VictimWayEnc, VictimWay);
|
||||||
|
|
||||||
// LRU storage must be reset for modelsim to run. However the reset value does not actually matter in practice.
|
// LRU memory must be reset for Questa to run. The reset value does not matter but it is best to be deterministc.
|
||||||
// This is a two port memory.
|
always_ff @(posedge clk)
|
||||||
// Every cycle must read from CacheSetTag and each load/store must write the new LRU.
|
|
||||||
|
|
||||||
// note: Verilator lint doesn't like <= for array initialization (https://verilator.org/warn/BLKLOOPINIT?v=5.021)
|
|
||||||
// Move to = to keep Verilator happy and simulator running fast
|
|
||||||
always_ff @(posedge clk) begin
|
|
||||||
if (reset | (InvalidateCache & ~FlushStage))
|
if (reset | (InvalidateCache & ~FlushStage))
|
||||||
for (int set = 0; set < NUMSETS; set++) LRUMemory[set] = '0; // exclusion-tag: initialize
|
for (int set = 0; set < NUMSETS; set++) LRUMemory[set] <= '0; // exclusion-tag: initialize
|
||||||
else if(CacheEn) begin
|
else if (CacheEn & LRUWriteEn) LRUMemory[PAdr] <= NextLRU;
|
||||||
// Because we are using blocking assignments, change to LRUMemory must occur after LRUMemory is used so we get the proper value
|
|
||||||
if(LRUWriteEn & (PAdr == CacheSetTag)) CurrLRU = NextLRU;
|
|
||||||
else CurrLRU = LRUMemory[CacheSetTag];
|
|
||||||
if(LRUWriteEn) LRUMemory[PAdr] = NextLRU;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
// LRU read path with write forwarding
|
||||||
|
assign ReadLRU = LRUMemory[CacheSetTag];
|
||||||
|
assign ForwardLRU = LRUWriteEn & (PAdr == CacheSetTag);
|
||||||
|
mux2 #(NUMWAYS-1) ReadLRUmux(ReadLRU, NextLRU, ForwardLRU, BypassedLRU);
|
||||||
|
flop #(NUMWAYS-1) CurrLRUReg(clk, BypassedLRU, CurrLRU);
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
2
src/cache/cachefsm.sv
vendored
2
src/cache/cachefsm.sv
vendored
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Controller for the cache fsm
|
// Purpose: Controller for the cache fsm
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 7 (Figure 7.14 and Table 7.1)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
3
src/cache/cacheway.sv
vendored
3
src/cache/cacheway.sv
vendored
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Storage and read/write access to data cache data, tag valid, dirty, and replacement.
|
// Purpose: Storage and read/write access to data cache data, tag valid, dirty, and replacement.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 7 (Figure 7.11)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -76,7 +76,6 @@ module cacheway import cvw::*; #(parameter cvw_t P,
|
|||||||
logic ClearValidWay;
|
logic ClearValidWay;
|
||||||
logic SetDirtyWay;
|
logic SetDirtyWay;
|
||||||
logic ClearDirtyWay;
|
logic ClearDirtyWay;
|
||||||
logic SelNonHit;
|
|
||||||
logic SelectedWay;
|
logic SelectedWay;
|
||||||
logic InvalidateCacheDelay;
|
logic InvalidateCacheDelay;
|
||||||
|
|
||||||
|
2
src/cache/subcachelineread.sv
vendored
2
src/cache/subcachelineread.sv
vendored
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Muxes the cache line down to the word size. Also include possible save/restore registers/muxes.
|
// Purpose: Muxes the cache line down to the word size. Also include possible save/restore registers/muxes.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 7
|
// Documentation: RISC-V System on Chip Design
|
||||||
|
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Translates cache bus requests and uncached ieu memory requests into AHB transactions.
|
// Purpose: Translates cache bus requests and uncached ieu memory requests into AHB transactions.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 9 (Figure 9.8)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -79,8 +79,7 @@ module ahbcacheinterface import cvw::*; #(
|
|||||||
logic [P.PA_BITS-1:0] LocalHADDR; // Address after selecting between cached and uncached operation
|
logic [P.PA_BITS-1:0] LocalHADDR; // Address after selecting between cached and uncached operation
|
||||||
logic [AHBWLOGBWPL-1:0] BeatCountDelayed; // Beat within the cache line in the second (Data) cache stage
|
logic [AHBWLOGBWPL-1:0] BeatCountDelayed; // Beat within the cache line in the second (Data) cache stage
|
||||||
logic CaptureEn; // Enable updating the Fetch buffer with valid data from HRDATA
|
logic CaptureEn; // Enable updating the Fetch buffer with valid data from HRDATA
|
||||||
logic [P.AHBW/8-1:0] BusByteMaskM; // Byte enables within a word. For cache request all 1s
|
logic [P.AHBW-1:0] PreHWDATA; // AHB Address phase write data
|
||||||
logic [P.AHBW-1:0] PreHWDATA; // AHB Address phase write data
|
|
||||||
logic [P.PA_BITS-1:0] PAdrZero;
|
logic [P.PA_BITS-1:0] PAdrZero;
|
||||||
|
|
||||||
genvar index;
|
genvar index;
|
||||||
@ -114,11 +113,14 @@ module ahbcacheinterface import cvw::*; #(
|
|||||||
.s(~(CacheableOrFlushCacheM)), .y(PreHWDATA));
|
.s(~(CacheableOrFlushCacheM)), .y(PreHWDATA));
|
||||||
flopen #(P.AHBW) wdreg(HCLK, HREADY, PreHWDATA, HWDATA); // delay HWDATA by 1 cycle per spec
|
flopen #(P.AHBW) wdreg(HCLK, HREADY, PreHWDATA, HWDATA); // delay HWDATA by 1 cycle per spec
|
||||||
|
|
||||||
// *** bummer need a second byte mask for bus as it is AHBW rather than LLEN.
|
if (READ_ONLY_CACHE) begin
|
||||||
// probably can merge by muxing PAdrM's LLEN/8-1 index bit based on HTRANS being != 0.
|
assign HWSTRB = '0;
|
||||||
swbytemask #(P.AHBW) busswbytemask(.Size(HSIZE), .Adr(HADDR[$clog2(P.AHBW/8)-1:0]), .ByteMask(BusByteMaskM), .ByteMaskExtended());
|
end else begin // compute byte mask for AHB transaction based on size and address. AHBW may be different than LLEN
|
||||||
|
logic [P.AHBW/8-1:0] BusByteMaskM; // Byte enables within a word. For cache request all 1s
|
||||||
|
|
||||||
flopen #(P.AHBW/8) HWSTRBReg(HCLK, HREADY, BusByteMaskM[P.AHBW/8-1:0], HWSTRB);
|
swbytemask #(P.AHBW) busswbytemask(.Size(HSIZE), .Adr(HADDR[$clog2(P.AHBW/8)-1:0]), .ByteMask(BusByteMaskM), .ByteMaskExtended());
|
||||||
|
flopen #(P.AHBW/8) HWSTRBReg(HCLK, HREADY, BusByteMaskM[P.AHBW/8-1:0], HWSTRB);
|
||||||
|
end
|
||||||
|
|
||||||
buscachefsm #(BeatCountThreshold, AHBWLOGBWPL, READ_ONLY_CACHE, P.BURST_EN) AHBBuscachefsm(
|
buscachefsm #(BeatCountThreshold, AHBWLOGBWPL, READ_ONLY_CACHE, P.BURST_EN) AHBBuscachefsm(
|
||||||
.HCLK, .HRESETn, .Flush, .BusRW, .BusAtomic, .Stall, .BusCommitted, .BusStall, .CaptureEn, .SelBusBeat,
|
.HCLK, .HRESETn, .Flush, .BusRW, .BusAtomic, .Stall, .BusCommitted, .BusStall, .CaptureEn, .SelBusBeat,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Translates LSU simple memory requests into AHB transactions (NON_SEQ).
|
// Purpose: Translates LSU simple memory requests into AHB transactions (NON_SEQ).
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 6 (Figure 6.21)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Controller for cache to AHB bus interface
|
// Purpose: Controller for cache to AHB bus interface
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 9 (Figure 9.9)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -128,7 +128,6 @@ module buscachefsm #(
|
|||||||
assign CacheAccess = CurrState == CACHE_FETCH | CurrState == CACHE_WRITEBACK;
|
assign CacheAccess = CurrState == CACHE_FETCH | CurrState == CACHE_WRITEBACK;
|
||||||
|
|
||||||
assign BusStall = (CurrState == ADR_PHASE & ((|BusRW) | (|CacheBusRW) | BusCMOZero)) |
|
assign BusStall = (CurrState == ADR_PHASE & ((|BusRW) | (|CacheBusRW) | BusCMOZero)) |
|
||||||
//(CurrState == DATA_PHASE & ~BusRW[0]) | // *** replace the next line with this. Fails uart test but i think it's a test problem not a hardware problem.
|
|
||||||
(CurrState == DATA_PHASE) |
|
(CurrState == DATA_PHASE) |
|
||||||
(CurrState == ATOMIC_PHASE) |
|
(CurrState == ATOMIC_PHASE) |
|
||||||
(CurrState == ATOMIC_READ_DATA_PHASE) |
|
(CurrState == ATOMIC_READ_DATA_PHASE) |
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Simple NON_SEQ (no burst) AHB controller.
|
// Purpose: Simple NON_SEQ (no burst) AHB controller.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 6 (Figure 6.23)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
// Connects core to peripherals and I/O pins on SOC
|
// Connects core to peripherals and I/O pins on SOC
|
||||||
// Bus width presently matches XLEN
|
// Bus width presently matches XLEN
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 6 (Figure 6.25)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
// Connects core to peripherals and I/O pins on SOC
|
// Connects core to peripherals and I/O pins on SOC
|
||||||
// Bus width presently matches XLEN
|
// Bus width presently matches XLEN
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 6 (Figures 6.25 and 6.26)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -110,7 +110,7 @@ module ebu import cvw::*; #(parameter cvw_t P) (
|
|||||||
.HWRITEOut(LSUHWRITEOut), .HSIZEOut(LSUHSIZEOut), .HBURSTOut(LSUHBURSTOut),
|
.HWRITEOut(LSUHWRITEOut), .HSIZEOut(LSUHSIZEOut), .HBURSTOut(LSUHBURSTOut),
|
||||||
.HTRANSOut(LSUHTRANSOut), .HADDROut(LSUHADDROut), .HREADYIn(HREADY));
|
.HTRANSOut(LSUHTRANSOut), .HADDROut(LSUHADDROut), .HREADYIn(HREADY));
|
||||||
|
|
||||||
// output mux //*** switch to structural implementation
|
// output mux
|
||||||
assign HADDR = LSUSelect ? LSUHADDROut : IFUSelect ? IFUHADDROut : '0;
|
assign HADDR = LSUSelect ? LSUHADDROut : IFUSelect ? IFUHADDROut : '0;
|
||||||
assign HSIZE = LSUSelect ? LSUHSIZEOut : IFUSelect ? IFUHSIZEOut: '0;
|
assign HSIZE = LSUSelect ? LSUHSIZEOut : IFUSelect ? IFUHSIZEOut: '0;
|
||||||
assign HBURST = LSUSelect ? LSUHBURSTOut : IFUSelect ? IFUHBURSTOut : '0; // If doing memory accesses, use LSUburst, else use Instruction burst.
|
assign HBURST = LSUSelect ? LSUHBURSTOut : IFUSelect ? IFUHBURSTOut : '0; // If doing memory accesses, use LSUburst, else use Instruction burst.
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
// Purpose: Arbitrates requests from instruction and data streams
|
// Purpose: Arbitrates requests from instruction and data streams
|
||||||
// LSU has priority.
|
// LSU has priority.
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 6 (Figures 6.25 and 6.26)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating-point classify unit
|
// Purpose: Floating-point classify unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating-point comparison unit
|
// Purpose: Floating-point comparison unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: floating-point control unit
|
// Purpose: floating-point control unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -242,7 +242,7 @@ module fctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
// coverage off
|
// coverage off
|
||||||
// Not covered in testing because rv64gc is not RV64Q or RV32D
|
// Not covered in testing because rv64gc is not RV64Q or RV32D
|
||||||
7'b1011001: if (P.ZFA_SUPPORTED & P.XLEN == 32 & P.D_SUPPORTED & Funct3D == 3'b000)
|
7'b1011001: if (P.ZFA_SUPPORTED & P.XLEN == 32 & P.D_SUPPORTED & Funct3D == 3'b000)
|
||||||
ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fmvp.d.x (Zfa) *** untested, controls could be wrong
|
ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fmvp.d.x (Zfa)
|
||||||
7'b1011011: if (P.ZFA_SUPPORTED & P.XLEN == 64 & P.Q_SUPPORTED & Funct3D == 3'b000)
|
7'b1011011: if (P.ZFA_SUPPORTED & P.XLEN == 64 & P.Q_SUPPORTED & Funct3D == 3'b000)
|
||||||
ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fmvp.q.x (Zfa)
|
ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0_0_0; // fmvp.q.x (Zfa)
|
||||||
// coverage on
|
// coverage on
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating point conversions of configurable size
|
// Purpose: Floating point conversions of configurable size
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// Int component of the Wally configurable RISC-V project.
|
// Int component of the Wally configurable RISC-V project.
|
||||||
//
|
//
|
||||||
@ -190,7 +190,7 @@ module fcvt import cvw::*; #(parameter cvw_t P) (
|
|||||||
// shifter
|
// shifter
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// kill the shift if it's negative
|
// kill the shift if it is negative
|
||||||
// select the amount to shift by
|
// select the amount to shift by
|
||||||
// fp -> int:
|
// fp -> int:
|
||||||
// - shift left by CalcExp - essentially shifting until the unbiased exponent = 0
|
// - shift left by CalcExp - essentially shifting until the unbiased exponent = 0
|
||||||
@ -201,10 +201,10 @@ module fcvt import cvw::*; #(parameter cvw_t P) (
|
|||||||
// - shift left by LeadingZeros - to shift till the result is normalized
|
// - shift left by LeadingZeros - to shift till the result is normalized
|
||||||
// - only shift fp -> fp if the intital value is subnormal
|
// - only shift fp -> fp if the intital value is subnormal
|
||||||
// - this is a problem because the input to the lzc was the fraction rather than the mantissa
|
// - this is a problem because the input to the lzc was the fraction rather than the mantissa
|
||||||
// - rather have a few and-gates than an extra bit in the priority encoder??? *** is this true?
|
// - rather have a few and-gates than an extra bit in the priority encoder???
|
||||||
always_comb
|
always_comb
|
||||||
if(ToInt) ShiftAmt = Ce[P.LOGCVTLEN-1:0]&{P.LOGCVTLEN{~Ce[P.NE]}};
|
if(ToInt) ShiftAmt = Ce[P.LOGCVTLEN-1:0]&{P.LOGCVTLEN{~Ce[P.NE]}};
|
||||||
else if (ResSubnormUf) ShiftAmt = (P.LOGCVTLEN)'(P.NF-1)+Ce[P.LOGCVTLEN-1:0];
|
else if (ResSubnormUf) ShiftAmt = (P.LOGCVTLEN)'(P.NF-1)+Ce[P.LOGCVTLEN-1:0];
|
||||||
else ShiftAmt = LeadingZeros;
|
else ShiftAmt = LeadingZeros;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
|
// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -61,15 +61,12 @@ module fdivsqrt import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.DIVb+3:0] D; // Iterator Divisor
|
logic [P.DIVb+3:0] D; // Iterator Divisor
|
||||||
logic [P.DIVb:0] FirstU, FirstUM; // Intermediate result values
|
logic [P.DIVb:0] FirstU, FirstUM; // Intermediate result values
|
||||||
logic [P.DIVb+1:0] FirstC; // Step tracker
|
logic [P.DIVb+1:0] FirstC; // Step tracker
|
||||||
logic Firstun; // Quotient selection
|
|
||||||
logic WZeroE; // Early termination flag
|
logic WZeroE; // Early termination flag
|
||||||
logic [P.DURLEN-1:0] CyclesE; // FSM cycles
|
logic [P.DURLEN-1:0] CyclesE; // FSM cycles
|
||||||
logic SpecialCaseM; // Divide by zero, square root of negative, etc.
|
logic SpecialCaseM; // Divide by zero, square root of negative, etc.
|
||||||
logic DivStartE; // Enable signal for flops during stall
|
|
||||||
|
|
||||||
// Integer div/rem signals
|
// Integer div/rem signals
|
||||||
logic BZeroM; // Denominator is zero
|
logic BZeroM; // Denominator is zero
|
||||||
logic IntDivM; // Integer operation
|
|
||||||
logic [P.DIVBLEN-1:0] IntNormShiftM; // Integer normalizatoin shift amount
|
logic [P.DIVBLEN-1:0] IntNormShiftM; // Integer normalizatoin shift amount
|
||||||
logic ALTBM, AsM, BsM, W64M; // Special handling for postprocessor
|
logic ALTBM, AsM, BsM, W64M; // Special handling for postprocessor
|
||||||
logic [P.XLEN-1:0] AM; // Original Numerator for postprocessor
|
logic [P.XLEN-1:0] AM; // Original Numerator for postprocessor
|
||||||
@ -80,8 +77,7 @@ module fdivsqrt import cvw::*; #(parameter cvw_t P) (
|
|||||||
.FmtE, .Bias(BiasE), .Nf(NfE), .SqrtE, .XZeroE, .Funct3E, .UeM, .X, .D, .CyclesE,
|
.FmtE, .Bias(BiasE), .Nf(NfE), .SqrtE, .XZeroE, .Funct3E, .UeM, .X, .D, .CyclesE,
|
||||||
// Int-specific
|
// Int-specific
|
||||||
.ForwardedSrcAE, .ForwardedSrcBE, .IntDivE, .W64E, .ISpecialCaseE,
|
.ForwardedSrcAE, .ForwardedSrcBE, .IntDivE, .W64E, .ISpecialCaseE,
|
||||||
.BZeroM, .IntNormShiftM, .AM,
|
.BZeroM, .IntNormShiftM, .AM, .W64M, .ALTBM, .AsM, .BsM);
|
||||||
.IntDivM, .W64M, .ALTBM, .AsM, .BsM);
|
|
||||||
|
|
||||||
fdivsqrtfsm #(P) fdivsqrtfsm( // FSM
|
fdivsqrtfsm #(P) fdivsqrtfsm( // FSM
|
||||||
.clk, .reset, .XInfE, .YInfE, .XZeroE, .YZeroE, .XNaNE, .YNaNE,
|
.clk, .reset, .XInfE, .YInfE, .XZeroE, .YZeroE, .XNaNE, .YNaNE,
|
||||||
@ -92,11 +88,11 @@ module fdivsqrt import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
fdivsqrtiter #(P) fdivsqrtiter( // CSA Iterator
|
fdivsqrtiter #(P) fdivsqrtiter( // CSA Iterator
|
||||||
.clk, .IFDivStartE, .FDivBusyE, .SqrtE, .X, .D,
|
.clk, .IFDivStartE, .FDivBusyE, .SqrtE, .X, .D,
|
||||||
.FirstU, .FirstUM, .FirstC, .Firstun, .FirstWS(WS), .FirstWC(WC));
|
.FirstU, .FirstUM, .FirstC, .FirstWS(WS), .FirstWC(WC));
|
||||||
|
|
||||||
fdivsqrtpostproc #(P) fdivsqrtpostproc( // Postprocessor
|
fdivsqrtpostproc #(P) fdivsqrtpostproc( // Postprocessor
|
||||||
.clk, .reset, .StallM, .WS, .WC, .D, .FirstU, .FirstUM, .FirstC,
|
.clk, .reset, .StallM, .WS, .WC, .D, .FirstU, .FirstUM, .FirstC,
|
||||||
.SqrtE, .Firstun, .SqrtM, .SpecialCaseM,
|
.SqrtE, .SqrtM, .SpecialCaseM,
|
||||||
.UmM, .WZeroE, .DivStickyM,
|
.UmM, .WZeroE, .DivStickyM,
|
||||||
// Int-specific
|
// Int-specific
|
||||||
.IntNormShiftM, .ALTBM, .AsM, .BsM, .BZeroM, .W64M, .RemOpM(Funct3M[1]), .AM,
|
.IntNormShiftM, .ALTBM, .AsM, .BsM, .BZeroM, .W64M, .RemOpM(Funct3M[1]), .AM,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Determine number of cycles for divsqrt
|
// Purpose: Determine number of cycles for divsqrt
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -28,9 +28,7 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module fdivsqrtcycles import cvw::*; #(parameter cvw_t P) (
|
module fdivsqrtcycles import cvw::*; #(parameter cvw_t P) (
|
||||||
input logic [P.FMTBITS-1:0] FmtE,
|
|
||||||
input logic [P.LOGFLEN-1:0] Nf, // Number of fractional bits in selected format
|
input logic [P.LOGFLEN-1:0] Nf, // Number of fractional bits in selected format
|
||||||
input logic SqrtE,
|
|
||||||
input logic IntDivE,
|
input logic IntDivE,
|
||||||
input logic [P.DIVBLEN-1:0] IntResultBitsE,
|
input logic [P.DIVBLEN-1:0] IntResultBitsE,
|
||||||
output logic [P.DURLEN-1:0] CyclesE
|
output logic [P.DURLEN-1:0] CyclesE
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Exponent caclulation for divide and square root
|
// Purpose: Exponent caclulation for divide and square root
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Radix 2 F Addend Generator
|
// Purpose: Radix 2 F Addend Generator
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Radix 4 F Addend Generator
|
// Purpose: Radix 4 F Addend Generator
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: divsqrt state machine for multi-cycle operations
|
// Purpose: divsqrt state machine for multi-cycle operations
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: k stages of divsqrt logic, plus registers
|
// Purpose: k stages of divsqrt logic, plus registers
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -35,7 +35,6 @@ module fdivsqrtiter import cvw::*; #(parameter cvw_t P) (
|
|||||||
input logic [P.DIVb+3:0] X, D, // Q4.DIVb
|
input logic [P.DIVb+3:0] X, D, // Q4.DIVb
|
||||||
output logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
output logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
||||||
output logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
output logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
||||||
output logic Firstun,
|
|
||||||
output logic [P.DIVb+3:0] FirstWS, FirstWC // Q4.DIVb
|
output logic [P.DIVb+3:0] FirstWS, FirstWC // Q4.DIVb
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ module fdivsqrtiter import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.DIVb+3:0] WCNext[P.DIVCOPIES-1:0]; // Q4.DIVb
|
logic [P.DIVb+3:0] WCNext[P.DIVCOPIES-1:0]; // Q4.DIVb
|
||||||
logic [P.DIVb+3:0] WS[P.DIVCOPIES:0]; // Q4.DIVb
|
logic [P.DIVb+3:0] WS[P.DIVCOPIES:0]; // Q4.DIVb
|
||||||
logic [P.DIVb+3:0] WC[P.DIVCOPIES:0]; // Q4.DIVb
|
logic [P.DIVb+3:0] WC[P.DIVCOPIES:0]; // Q4.DIVb
|
||||||
logic [P.DIVb:0] U[P.DIVCOPIES:0]; // U1.DIVb // *** probably Q not U. See Table 16.26 notes
|
logic [P.DIVb:0] U[P.DIVCOPIES:0]; // U1.DIVb
|
||||||
logic [P.DIVb:0] UM[P.DIVCOPIES:0]; // U1.DIVb
|
logic [P.DIVb:0] UM[P.DIVCOPIES:0]; // U1.DIVb
|
||||||
logic [P.DIVb:0] UNext[P.DIVCOPIES-1:0]; // U1.DIVb
|
logic [P.DIVb:0] UNext[P.DIVCOPIES-1:0]; // U1.DIVb
|
||||||
logic [P.DIVb:0] UMNext[P.DIVCOPIES-1:0]; // U1.DIVb
|
logic [P.DIVb:0] UMNext[P.DIVCOPIES-1:0]; // U1.DIVb
|
||||||
@ -119,6 +118,5 @@ module fdivsqrtiter import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign FirstU = U[0];
|
assign FirstU = U[0];
|
||||||
assign FirstUM = UM[0];
|
assign FirstUM = UM[0];
|
||||||
assign FirstC = C[0];
|
assign FirstC = C[0];
|
||||||
assign Firstun = un[0];
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Divide/Square root postprocessing
|
// Purpose: Divide/Square root postprocessing
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -35,7 +35,7 @@ module fdivsqrtpostproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
input logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
input logic [P.DIVb:0] FirstU, FirstUM, // U1.DIVb
|
||||||
input logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
input logic [P.DIVb+1:0] FirstC, // Q2.DIVb
|
||||||
input logic SqrtE,
|
input logic SqrtE,
|
||||||
input logic Firstun, SqrtM, SpecialCaseM,
|
input logic SqrtM, SpecialCaseM,
|
||||||
input logic [P.XLEN-1:0] AM, // U/Q(XLEN.0)
|
input logic [P.XLEN-1:0] AM, // U/Q(XLEN.0)
|
||||||
input logic RemOpM, ALTBM, BZeroM, AsM, BsM, W64M,
|
input logic RemOpM, ALTBM, BZeroM, AsM, BsM, W64M,
|
||||||
input logic [P.DIVBLEN-1:0] IntNormShiftM,
|
input logic [P.DIVBLEN-1:0] IntNormShiftM,
|
||||||
@ -71,7 +71,7 @@ module fdivsqrtpostproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
mux2 #(P.DIVb+4) fzeromux(FZeroDivE, FZeroSqrtE, SqrtE, FZeroE);
|
mux2 #(P.DIVb+4) fzeromux(FZeroDivE, FZeroSqrtE, SqrtE, FZeroE);
|
||||||
csa #(P.DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
|
csa #(P.DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
|
||||||
aplusbeq0 #(P.DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
|
aplusbeq0 #(P.DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
|
||||||
assign WZeroE = weq0E|(wfeq0E & Firstun);
|
assign WZeroE = weq0E | wfeq0E;
|
||||||
end else begin
|
end else begin
|
||||||
assign WZeroE = weq0E;
|
assign WZeroE = weq0E;
|
||||||
end
|
end
|
||||||
@ -131,5 +131,6 @@ module fdivsqrtpostproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
W64M, FIntDivResultM);
|
W64M, FIntDivResultM);
|
||||||
end else
|
end else
|
||||||
assign FIntDivResultM = IntDivResultM[P.XLEN-1:0];
|
assign FIntDivResultM = IntDivResultM[P.XLEN-1:0];
|
||||||
end
|
end else
|
||||||
|
assign FIntDivResultM = '0;
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Divide/Square root preprocessing: integer absolute value and W64, normalization shift
|
// Purpose: Divide/Square root preprocessing: integer absolute value and W64, normalization shift
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -47,7 +47,7 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic ISpecialCaseE,
|
output logic ISpecialCaseE,
|
||||||
output logic [P.DURLEN-1:0] CyclesE,
|
output logic [P.DURLEN-1:0] CyclesE,
|
||||||
output logic [P.DIVBLEN-1:0] IntNormShiftM,
|
output logic [P.DIVBLEN-1:0] IntNormShiftM,
|
||||||
output logic ALTBM, IntDivM, W64M,
|
output logic ALTBM, W64M,
|
||||||
output logic AsM, BsM, BZeroM,
|
output logic AsM, BsM, BZeroM,
|
||||||
output logic [P.XLEN-1:0] AM
|
output logic [P.XLEN-1:0] AM
|
||||||
);
|
);
|
||||||
@ -58,7 +58,6 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.DIVb:0] IFX, IFD; // Correctly-sized inputs for iterator, selected from int or fp input
|
logic [P.DIVb:0] IFX, IFD; // Correctly-sized inputs for iterator, selected from int or fp input
|
||||||
logic [P.DIVBLEN-1:0] mE, ell; // Leading zeros of inputs
|
logic [P.DIVBLEN-1:0] mE, ell; // Leading zeros of inputs
|
||||||
logic [P.DIVBLEN-1:0] IntResultBitsE; // bits in integer result
|
logic [P.DIVBLEN-1:0] IntResultBitsE; // bits in integer result
|
||||||
logic NumerZeroE; // Numerator is zero (X or A)
|
|
||||||
logic AZeroE, BZeroE; // A or B is Zero for integer division
|
logic AZeroE, BZeroE; // A or B is Zero for integer division
|
||||||
logic SignedDivE; // signed division
|
logic SignedDivE; // signed division
|
||||||
logic AsE, BsE; // Signs of integer inputs
|
logic AsE, BsE; // Signs of integer inputs
|
||||||
@ -96,11 +95,9 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
// Select integer or floating point inputs
|
// Select integer or floating point inputs
|
||||||
mux2 #(P.DIVb+1) ifxmux({Xm, {(P.DIVb-P.NF){1'b0}}}, {PosA, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFX);
|
mux2 #(P.DIVb+1) ifxmux({Xm, {(P.DIVb-P.NF){1'b0}}}, {PosA, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFX);
|
||||||
mux2 #(P.DIVb+1) ifdmux({Ym, {(P.DIVb-P.NF){1'b0}}}, {PosB, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFD);
|
mux2 #(P.DIVb+1) ifdmux({Ym, {(P.DIVb-P.NF){1'b0}}}, {PosB, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFD);
|
||||||
mux2 #(1) numzmux(XZeroE, AZeroE, IntDivE, NumerZeroE);
|
|
||||||
end else begin // Int not supported
|
end else begin // Int not supported
|
||||||
assign IFX = {Xm, {(P.DIVb-P.NF){1'b0}}};
|
assign IFX = {Xm, {(P.DIVb-P.NF){1'b0}}};
|
||||||
assign IFD = {Ym, {(P.DIVb-P.NF){1'b0}}};
|
assign IFD = {Ym, {(P.DIVb-P.NF){1'b0}}};
|
||||||
assign NumerZeroE = XZeroE;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
@ -147,7 +144,7 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign DivXShifted = DivX;
|
assign DivXShifted = DivX;
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
assign ISpecialCaseE = 1'b0;
|
assign {ISpecialCaseE, IntResultBitsE} = '0;
|
||||||
end
|
end
|
||||||
|
|
||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
@ -174,7 +171,6 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
// 4 2(x)-4 = 4(x/2 - 1)) 2(x/2)-4 = 4(x/4 - 1)
|
// 4 2(x)-4 = 4(x/2 - 1)) 2(x/2)-4 = 4(x/4 - 1)
|
||||||
// Summary: PreSqrtX = r(x/2or4 - 1)
|
// Summary: PreSqrtX = r(x/2or4 - 1)
|
||||||
|
|
||||||
logic [P.DIVb:0] PreSqrtX;
|
|
||||||
assign EvenExp = Xe[0] ^ ell[0]; // effective unbiased exponent after normalization is even
|
assign EvenExp = Xe[0] ^ ell[0]; // effective unbiased exponent after normalization is even
|
||||||
mux2 #(P.DIVb+4) sqrtxmux({4'b0,Xnorm[P.DIVb:1]}, {5'b00, Xnorm[P.DIVb:2]}, EvenExp, SqrtX); // X/2 if exponent odd, X/4 if exponent even
|
mux2 #(P.DIVb+4) sqrtxmux({4'b0,Xnorm[P.DIVb:1]}, {5'b00, Xnorm[P.DIVb:2]}, EvenExp, SqrtX); // X/2 if exponent odd, X/4 if exponent even
|
||||||
|
|
||||||
@ -215,21 +211,20 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
flopen #(P.NE+2) expreg(clk, IFDivStartE, UeE, UeM);
|
flopen #(P.NE+2) expreg(clk, IFDivStartE, UeE, UeM);
|
||||||
|
|
||||||
// Number of FSM cycles (to FSM)
|
// Number of FSM cycles (to FSM)
|
||||||
fdivsqrtcycles #(P) cyclecalc(.FmtE, .Nf, .SqrtE, .IntDivE, .IntResultBitsE, .CyclesE);
|
fdivsqrtcycles #(P) cyclecalc(.Nf, .IntDivE, .IntResultBitsE, .CyclesE);
|
||||||
|
|
||||||
if (P.IDIV_ON_FPU) begin:intpipelineregs
|
if (P.IDIV_ON_FPU) begin:intpipelineregs
|
||||||
logic [P.DIVBLEN-1:0] IntDivNormShiftE, IntRemNormShiftE, IntNormShiftE;
|
logic [P.DIVBLEN-1:0] IntDivNormShiftE, IntRemNormShiftE, IntNormShiftE;
|
||||||
logic RemOpE;
|
logic RemOpE;
|
||||||
|
|
||||||
/* verilator lint_off WIDTH */
|
/* verilator lint_off WIDTH */
|
||||||
assign IntDivNormShiftE = P.DIVb - (CyclesE * P.RK - P.LOGR); // b - rn, used for integer normalization right shift. rn = Cycles * r * k - r ***explain
|
assign IntDivNormShiftE = P.DIVb - (CyclesE * P.RK - P.LOGR); // b - rn, used for integer normalization right shift. n = (Cycles * k - 1)
|
||||||
assign IntRemNormShiftE = mE + (P.DIVb-(P.XLEN-1)); // m + b - (N-1) for remainder normalization shift
|
assign IntRemNormShiftE = mE + (P.DIVb-(P.XLEN-1)); // m + b - (N-1) for remainder normalization shift
|
||||||
/* verilator lint_on WIDTH */
|
/* verilator lint_on WIDTH */
|
||||||
assign RemOpE = Funct3E[1];
|
assign RemOpE = Funct3E[1];
|
||||||
mux2 #(P.DIVBLEN) normshiftmux(IntDivNormShiftE, IntRemNormShiftE, RemOpE, IntNormShiftE);
|
mux2 #(P.DIVBLEN) normshiftmux(IntDivNormShiftE, IntRemNormShiftE, RemOpE, IntNormShiftE);
|
||||||
|
|
||||||
// pipeline registers
|
// pipeline registers
|
||||||
flopen #(1) mdureg(clk, IFDivStartE, IntDivE, IntDivM);
|
|
||||||
flopen #(1) altbreg(clk, IFDivStartE, ALTBE, ALTBM);
|
flopen #(1) altbreg(clk, IFDivStartE, ALTBE, ALTBM);
|
||||||
flopen #(1) bzeroreg(clk, IFDivStartE, BZeroE, BZeroM);
|
flopen #(1) bzeroreg(clk, IFDivStartE, BZeroE, BZeroM);
|
||||||
flopen #(1) asignreg(clk, IFDivStartE, AsE, AsM);
|
flopen #(1) asignreg(clk, IFDivStartE, AsE, AsM);
|
||||||
@ -238,7 +233,9 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
flopen #(P.XLEN) srcareg(clk, IFDivStartE, AE, AM);
|
flopen #(P.XLEN) srcareg(clk, IFDivStartE, AE, AM);
|
||||||
if (P.XLEN==64)
|
if (P.XLEN==64)
|
||||||
flopen #(1) w64reg(clk, IFDivStartE, W64E, W64M);
|
flopen #(1) w64reg(clk, IFDivStartE, W64E, W64M);
|
||||||
end
|
else assign W64M = 0;
|
||||||
|
end else
|
||||||
|
assign {ALTBM, W64M, AsM, BsM, BZeroM, AM, IntNormShiftM} = '0;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: radix-2 divsqrt recurrence stage
|
// Purpose: radix-2 divsqrt recurrence stage
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: radix-4 divsqrt recurrence stage
|
// Purpose: radix-4 divsqrt recurrence stage
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -52,7 +52,7 @@ module fdivsqrtstage4 import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
// Digit Selection logic
|
// Digit Selection logic
|
||||||
assign j0 = ~C[P.DIVb+1]; // first step of R digit selection: C = 00...0
|
assign j0 = ~C[P.DIVb+1]; // first step of R digit selection: C = 00...0
|
||||||
assign j1 = C[P.DIVb] & ~C[P.DIVb-1]; // second step of R digit selection: C = 1100...0; *** could simplify to ~C[P.DIVb-1] because j=0 case takes priority
|
assign j1 = ~C[P.DIVb-1]; // second step of R digit selection: C = 1100...0; simplified from C[P.DIVb] & ~C[P.DIVb-1] because j=0 case takes priority
|
||||||
assign Smsbs = U[P.DIVb:P.DIVb-4]; // U1.4 most significant bits of square root
|
assign Smsbs = U[P.DIVb:P.DIVb-4]; // U1.4 most significant bits of square root
|
||||||
assign Dmsbs = D[P.DIVb-1:P.DIVb-3]; // U0.3 most significant fractional bits of divisor after leading 1
|
assign Dmsbs = D[P.DIVb-1:P.DIVb-3]; // U0.3 most significant fractional bits of divisor after leading 1
|
||||||
assign WCmsbs = WC[P.DIVb+3:P.DIVb-4]; // Q4.4 most significant bits of residual
|
assign WCmsbs = WC[P.DIVb+3:P.DIVb-4]; // Q4.4 most significant bits of residual
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Radix 2 unified on-the-fly converter
|
// Purpose: Radix 2 unified on-the-fly converter
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Radix 4 unified on-the-fly converter
|
// Purpose: Radix 4 unified on-the-fly converter
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Radix 2 Unified Quotient/Square Root Digit Selection
|
// Purpose: Radix 2 Unified Quotient/Square Root Digit Selection
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Table-based Radix 4 Unified Quotient/Square Root Digit Selection
|
// Purpose: Table-based Radix 4 Unified Quotient/Square Root Digit Selection
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Comparator-based Radix 4 Unified Quotient/Square Root Digit Selection
|
// Purpose: Comparator-based Radix 4 Unified Quotient/Square Root Digit Selection
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -47,7 +47,7 @@ module fdivsqrtuslc4cmp (
|
|||||||
// Wmsbs = | |
|
// Wmsbs = | |
|
||||||
|
|
||||||
logic [6:0] mk2, mk1, mk0, mkm1;
|
logic [6:0] mk2, mk1, mk0, mkm1;
|
||||||
logic [6:0] mkj2, mkj1, mkj0, mkjm1;
|
logic [6:0] mkj2, mkj1;
|
||||||
logic [6:0] mks2[7:0], mks1[7:0], mks0[7:0], mksm1[7:0];
|
logic [6:0] mks2[7:0], mks1[7:0], mks0[7:0], mksm1[7:0];
|
||||||
logic sqrtspecial;
|
logic sqrtspecial;
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ module fdivsqrtuslc4cmp (
|
|||||||
// Choose A for current operation
|
// Choose A for current operation
|
||||||
always_comb
|
always_comb
|
||||||
if (SqrtE) begin
|
if (SqrtE) begin
|
||||||
if (Smsbs[4]) A = 3'b111; // for S = 1.0000 *** can we optimize away this case?
|
if (Smsbs[4]) A = 3'b111; // for S = 1.0000
|
||||||
else A = Smsbs[2:0];
|
else A = Smsbs[2:0];
|
||||||
end else A = Dmsbs;
|
end else A = Dmsbs;
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ module fdivsqrtuslc4cmp (
|
|||||||
|
|
||||||
/* Nannarelli12 design to exploit symmetry is slower because of negation and mux for special case of A = 000
|
/* Nannarelli12 design to exploit symmetry is slower because of negation and mux for special case of A = 000
|
||||||
assign mk0 = -mk1;
|
assign mk0 = -mk1;
|
||||||
assign mkm1 = (A == 3'b000) ? -13 : -mk2; // asymmetry in table *** can we hide from critical path
|
assign mkm1 = (A == 3'b000) ? -13 : -mk2; // asymmetry in table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Compare residual W to selection constants to choose digit
|
// Compare residual W to selection constants to choose digit
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Determine forwarding, stalls and flushes for the FPU
|
// Purpose: Determine forwarding, stalls and flushes for the FPU
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating-point float immediate
|
// Purpose: Floating-point float immediate
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 16
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating point multiply-accumulate of configurable size
|
// Purpose: Floating point multiply-accumulate of configurable size
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Figure 13.7, 9)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA significand adder
|
// Purpose: FMA significand adder
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Figure 13.11)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA alginment shift
|
// Purpose: FMA alginment shift
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Table 13.10)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA exponent addition
|
// Purpose: FMA exponent addition
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Table 13.9)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Leading Zero Anticipator
|
// Purpose: Leading Zero Anticipator
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Figure 13.14)
|
// Documentation: RISC-V System on Chip Design
|
||||||
// See also [Schmookler & Nowka, Leading zero anticipation and detection, IEEE Sym. Computer Arithmetic, 2001]
|
// See also [Schmookler & Nowka, Leading zero anticipation and detection, IEEE Sym. Computer Arithmetic, 2001]
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA Significand Multiplier
|
// Purpose: FMA Significand Multiplier
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Table 13.7)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA Sign Logic
|
// Purpose: FMA Sign Logic
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13 (Table 13.8)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Look up bias of exponent and number of fractional bits for the selected format
|
// Purpose: Look up bias of exponent and number of fractional bits for the selected format
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating Point Unit Top-Level Interface
|
// Purpose: Floating Point Unit Top-Level Interface
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -246,7 +246,6 @@ module fpu import cvw::*; #(parameter cvw_t P) (
|
|||||||
{{P.FLEN-P.H_LEN{1'b1}}, 2'b0, {P.H_NE-1{1'b1}}, (P.H_NF)'(0)},
|
{{P.FLEN-P.H_LEN{1'b1}}, 2'b0, {P.H_NE-1{1'b1}}, (P.H_NF)'(0)},
|
||||||
{2'b0, {P.NE-1{1'b1}}, (P.NF)'(0)}, FmtE, BoxedOneE); // NaN boxing zeroes
|
{2'b0, {P.NE-1{1'b1}}, (P.NF)'(0)}, FmtE, BoxedOneE); // NaN boxing zeroes
|
||||||
assign FmaAddSubE = OpCtrlE[2]&OpCtrlE[1]&(PostProcSelE==2'b10);
|
assign FmaAddSubE = OpCtrlE[2]&OpCtrlE[1]&(PostProcSelE==2'b10);
|
||||||
// ***simplified from appearently redundant assign FmaAddSubE = OpCtrlE[2]&OpCtrlE[1]&(FResSelE==2'b01)&(PostProcSelE==2'b10);
|
|
||||||
mux2 #(P.FLEN) fyaddmux (PreYE, BoxedOneE, FmaAddSubE, YE); // Force Y to be 1 for add/subtract
|
mux2 #(P.FLEN) fyaddmux (PreYE, BoxedOneE, FmaAddSubE, YE); // Force Y to be 1 for add/subtract
|
||||||
|
|
||||||
// Select NAN-boxed value of Z = 0.0 in proper format for FMA for multiply X*Y+Z
|
// Select NAN-boxed value of Z = 0.0 in proper format for FMA for multiply X*Y+Z
|
||||||
@ -308,7 +307,7 @@ module fpu import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.FLEN-1:0] FliResE; // Zfa Floating-point load immediate value
|
logic [P.FLEN-1:0] FliResE; // Zfa Floating-point load immediate value
|
||||||
|
|
||||||
// fround
|
// fround
|
||||||
fround #(P) fround(.X(XE), .Xs(XsE), .Xe(XeE), .Xm(XmE),
|
fround #(P) fround(.Xs(XsE), .Xe(XeE), .Xm(XmE),
|
||||||
.XNaN(XNaNE), .XSNaN(XSNaNE), .Fmt(FmtE), .Frm(FrmE), .Nf(NfE),
|
.XNaN(XNaNE), .XSNaN(XSNaNE), .Fmt(FmtE), .Frm(FrmE), .Nf(NfE),
|
||||||
.ZfaFRoundNX(ZfaFRoundNXE),
|
.ZfaFRoundNX(ZfaFRoundNXE),
|
||||||
.FRound(FRoundE), .FRoundNV(FRoundNVE), .FRoundNX(FRoundNXE));
|
.FRound(FRoundE), .FRoundNV(FRoundNVE), .FRoundNX(FRoundNXE));
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: 3R1W 4-port register file for FPU
|
// Purpose: 3R1W 4-port register file for FPU
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Floating-point round to integer for Zfa
|
// Purpose: Floating-point round to integer for Zfa
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 16
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -28,7 +28,6 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module fround import cvw::*; #(parameter cvw_t P) (
|
module fround import cvw::*; #(parameter cvw_t P) (
|
||||||
input logic [P.FLEN-1:0] X, // input before unpacking
|
|
||||||
input logic Xs, // input's sign
|
input logic Xs, // input's sign
|
||||||
input logic [P.NE-1:0] Xe, // input's exponent
|
input logic [P.NE-1:0] Xe, // input's exponent
|
||||||
input logic [P.NF:0] Xm, // input's fraction with leading integer bit (U1.NF)
|
input logic [P.NF:0] Xm, // input's fraction with leading integer bit (U1.NF)
|
||||||
@ -45,7 +44,7 @@ module fround import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
logic [P.NE-1:0] E, Xep1;
|
logic [P.NE-1:0] E, Xep1;
|
||||||
logic [P.NF:0] IMask, Tmasknonneg, Tmaskneg, Tmask, HotE, HotEP1, Trunc, Rnd;
|
logic [P.NF:0] IMask, Tmasknonneg, Tmaskneg, Tmask, HotE, HotEP1, Trunc, Rnd;
|
||||||
logic [P.FLEN-1:0] W, PackedW;
|
logic [P.FLEN-1:0] W;
|
||||||
logic Elt0, Eeqm1, Lnonneg, Lp, Rnonneg, Rp, Tp, RoundUp, Two, EgeNf;
|
logic Elt0, Eeqm1, Lnonneg, Lp, Rnonneg, Rp, Tp, RoundUp, Two, EgeNf;
|
||||||
|
|
||||||
// Unbiased exponent
|
// Unbiased exponent
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FPU Sign Injection instructions
|
// Purpose: FPU Sign Injection instructions
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Pack the output of the FPU
|
// Purpose: Pack the output of the FPU
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Conversion shift calculation
|
// Purpose: Conversion shift calculation
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Division shift calculation
|
// Purpose: Division shift calculation
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Post-Processing flag calculation
|
// Purpose: Post-Processing flag calculation
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: FMA shift calculation
|
// Purpose: FMA shift calculation
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Negate integer result
|
// Purpose: Negate integer result
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: normalization shifter
|
// Purpose: normalization shifter
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Post-Processing: normalization, rounding, sign, flags, special cases
|
// Purpose: Post-Processing: normalization, rounding, sign, flags, special cases
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -134,6 +134,7 @@ module postprocess import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign OutFmt = IntToFp|~CvtOp ? Fmt : (OpCtrl[1:0] == P.FMT);
|
assign OutFmt = IntToFp|~CvtOp ? Fmt : (OpCtrl[1:0] == P.FMT);
|
||||||
else if (P.FPSIZES == 3 | P.FPSIZES == 4)
|
else if (P.FPSIZES == 3 | P.FPSIZES == 4)
|
||||||
assign OutFmt = IntToFp|~CvtOp ? Fmt : OpCtrl[1:0];
|
assign OutFmt = IntToFp|~CvtOp ? Fmt : OpCtrl[1:0];
|
||||||
|
else assign OutFmt = 0; // FPSIZES = 1
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Normalization
|
// Normalization
|
||||||
@ -157,11 +158,11 @@ module postprocess import cvw::*; #(parameter cvw_t P) (
|
|||||||
end
|
end
|
||||||
2'b00: begin // cvt
|
2'b00: begin // cvt
|
||||||
ShiftAmt = {{P.LOGNORMSHIFTSZ-$clog2(P.CVTLEN+1){1'b0}}, CvtShiftAmt};
|
ShiftAmt = {{P.LOGNORMSHIFTSZ-$clog2(P.CVTLEN+1){1'b0}}, CvtShiftAmt};
|
||||||
ShiftIn = {CvtShiftIn, {P.NORMSHIFTSZ-P.CVTLEN-P.NF-1{1'b0}}};
|
ShiftIn = {CvtShiftIn, {P.NORMSHIFTSZ-(P.CVTLEN+P.NF+1){1'b0}}};
|
||||||
end
|
end
|
||||||
2'b01: begin //divsqrt
|
2'b01: begin //divsqrt
|
||||||
ShiftAmt = DivShiftAmt;
|
ShiftAmt = DivShiftAmt;
|
||||||
ShiftIn = {{P.NF{1'b0}}, DivUm, {P.NORMSHIFTSZ-P.DIVb-1-P.NF{1'b0}}};
|
ShiftIn = {{P.NF{1'b0}}, DivUm, {P.NORMSHIFTSZ-(P.DIVb+1+P.NF){1'b0}}};
|
||||||
end
|
end
|
||||||
default: begin
|
default: begin
|
||||||
ShiftAmt = {P.LOGNORMSHIFTSZ{1'bx}};
|
ShiftAmt = {P.LOGNORMSHIFTSZ{1'bx}};
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: calculating the result's sign
|
// Purpose: calculating the result's sign
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Rounder
|
// Purpose: Rounder
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Sign calculation for rounding
|
// Purpose: Sign calculation for rounding
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: shift correction
|
// Purpose: shift correction
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -45,13 +45,12 @@ module shiftcorrection import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic [P.NE+1:0] Ue // corrected exponent for divider
|
output logic [P.NE+1:0] Ue // corrected exponent for divider
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [P.NORMSHIFTSZ-1:0] CorrShifted; // the shifted sum after LZA correction
|
|
||||||
logic ResSubnorm; // is the result Subnormal
|
logic ResSubnorm; // is the result Subnormal
|
||||||
logic LZAPlus1; // add one or two to the sum's exponent due to LZA correction
|
logic LZAPlus1; // add one or two to the sum's exponent due to LZA correction
|
||||||
logic LeftShiftQm; // should the divsqrt result be shifted one to the left
|
logic LeftShiftQm; // should the divsqrt result be shifted one to the left
|
||||||
logic RightShift; // shift right by 1
|
logic RightShift; // shift right by 1
|
||||||
|
|
||||||
// *** 4/16/24 this code is a mess and needs cleaning and explaining
|
// dh 4/16/24 this code is a mess and needs cleaning and explaining
|
||||||
// define bit widths
|
// define bit widths
|
||||||
// seems to shift by 0, 1, or 2. right and left shift is confusing
|
// seems to shift by 0, 1, or 2. right and left shift is confusing
|
||||||
|
|
||||||
@ -61,20 +60,20 @@ module shiftcorrection import cvw::*; #(parameter cvw_t P) (
|
|||||||
// - a one has to propagate all the way through a sum. so we can leave the bottom statement alone
|
// - a one has to propagate all the way through a sum. so we can leave the bottom statement alone
|
||||||
assign LZAPlus1 = Shifted[P.NORMSHIFTSZ-1];
|
assign LZAPlus1 = Shifted[P.NORMSHIFTSZ-1];
|
||||||
|
|
||||||
|
|
||||||
// correct the shifting of the divsqrt caused by producing a result in (0.5, 2) range
|
// correct the shifting of the divsqrt caused by producing a result in (0.5, 2) range
|
||||||
// condition: if the msb is 1 or the exponent was one, but the shifted quotent was < 1 (Subnorm)
|
// condition: if the msb is 1 or the exponent was one, but the shifted quotent was < 1 (Subnorm)
|
||||||
assign LeftShiftQm = (LZAPlus1|(DivUe==1&~LZAPlus1));
|
assign LeftShiftQm = (LZAPlus1|(DivUe==1&~LZAPlus1));
|
||||||
|
|
||||||
|
// Determine the shif for either FMA or divsqrt
|
||||||
assign RightShift = FmaOp ? LZAPlus1 : LeftShiftQm;
|
assign RightShift = FmaOp ? LZAPlus1 : LeftShiftQm;
|
||||||
|
|
||||||
// one bit right shift for FMA or division
|
// possible one bit right shift for FMA or division
|
||||||
mux2 #(P.NORMSHIFTSZ) corrmux({Shifted[P.NORMSHIFTSZ-3:0], 2'b00}, {Shifted[P.NORMSHIFTSZ-2:1], 2'b00}, RightShift, CorrShifted);
|
|
||||||
|
|
||||||
// if the result of the divider was calculated to be subnormal, then the result was correctly normalized, so select the top shifted bits
|
// if the result of the divider was calculated to be subnormal, then the result was correctly normalized, so select the top shifted bits
|
||||||
always_comb
|
always_comb
|
||||||
if (FmaOp | (DivOp & ~DivResSubnorm)) Mf = CorrShifted;
|
if (FmaOp | (DivOp & ~DivResSubnorm)) // one bit shift for FMA or divsqrt
|
||||||
else Mf = Shifted[P.NORMSHIFTSZ-1:0];
|
if (RightShift) Mf = {Shifted[P.NORMSHIFTSZ-2:1], 2'b00};
|
||||||
|
else Mf = {Shifted[P.NORMSHIFTSZ-3:0], 2'b00};
|
||||||
|
else Mf = Shifted[P.NORMSHIFTSZ-1:0]; // convert and subnormal division result
|
||||||
|
|
||||||
// Determine sum's exponent
|
// Determine sum's exponent
|
||||||
// main exponent issues:
|
// main exponent issues:
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: special case selection
|
// Purpose: special case selection
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: unpack X, Y, Z floating-point inputs
|
// Purpose: unpack X, Y, Z floating-point inputs
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -46,23 +46,21 @@ module unpack import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic [P.LOGFLEN-1:0] Nf // Number of fractional bits
|
output logic [P.LOGFLEN-1:0] Nf // Number of fractional bits
|
||||||
);
|
);
|
||||||
|
|
||||||
logic XExpNonZero, YExpNonZero, ZExpNonZero; // is the exponent of XYZ non-zero
|
|
||||||
logic XFracZero, YFracZero, ZFracZero; // is the fraction zero
|
|
||||||
logic YExpMax, ZExpMax; // is the exponent all 1s
|
logic YExpMax, ZExpMax; // is the exponent all 1s
|
||||||
|
|
||||||
unpackinput #(P) unpackinputX (.A(X), .Fmt, .Sgn(Xs), .Exp(Xe), .Man(Xm), .En(XEn), .FPUActive,
|
unpackinput #(P) unpackinputX (.A(X), .Fmt, .Sgn(Xs), .Exp(Xe), .Man(Xm), .En(XEn), .FPUActive,
|
||||||
.NaN(XNaN), .SNaN(XSNaN), .ExpNonZero(XExpNonZero),
|
.NaN(XNaN), .SNaN(XSNaN),
|
||||||
.Zero(XZero), .Inf(XInf), .ExpMax(XExpMax), .FracZero(XFracZero),
|
.Zero(XZero), .Inf(XInf), .ExpMax(XExpMax),
|
||||||
.Subnorm(XSubnorm), .PostBox(XPostBox));
|
.Subnorm(XSubnorm), .PostBox(XPostBox));
|
||||||
|
|
||||||
unpackinput #(P) unpackinputY (.A(Y), .Fmt, .Sgn(Ys), .Exp(Ye), .Man(Ym), .En(YEn), .FPUActive,
|
unpackinput #(P) unpackinputY (.A(Y), .Fmt, .Sgn(Ys), .Exp(Ye), .Man(Ym), .En(YEn), .FPUActive,
|
||||||
.NaN(YNaN), .SNaN(YSNaN), .ExpNonZero(YExpNonZero),
|
.NaN(YNaN), .SNaN(YSNaN),
|
||||||
.Zero(YZero), .Inf(YInf), .ExpMax(YExpMax), .FracZero(YFracZero),
|
.Zero(YZero), .Inf(YInf), .ExpMax(YExpMax),
|
||||||
.Subnorm(), .PostBox());
|
.Subnorm(), .PostBox());
|
||||||
|
|
||||||
unpackinput #(P) unpackinputZ (.A(Z), .Fmt, .Sgn(Zs), .Exp(Ze), .Man(Zm), .En(ZEn), .FPUActive,
|
unpackinput #(P) unpackinputZ (.A(Z), .Fmt, .Sgn(Zs), .Exp(Ze), .Man(Zm), .En(ZEn), .FPUActive,
|
||||||
.NaN(ZNaN), .SNaN(ZSNaN), .ExpNonZero(ZExpNonZero),
|
.NaN(ZNaN), .SNaN(ZSNaN),
|
||||||
.Zero(ZZero), .Inf(ZInf), .ExpMax(ZExpMax), .FracZero(ZFracZero),
|
.Zero(ZZero), .Inf(ZInf), .ExpMax(ZExpMax),
|
||||||
.Subnorm(), .PostBox());
|
.Subnorm(), .PostBox());
|
||||||
|
|
||||||
// look up bias and fractional bits for the given format
|
// look up bias and fractional bits for the given format
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: unpack input: extract sign, exponent, significand, characteristics
|
// Purpose: unpack input: extract sign, exponent, significand, characteristics
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 13
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -39,8 +39,6 @@ module unpackinput import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic SNaN, // is the number a signaling NaN
|
output logic SNaN, // is the number a signaling NaN
|
||||||
output logic Zero, // is the number zero
|
output logic Zero, // is the number zero
|
||||||
output logic Inf, // is the number infinity
|
output logic Inf, // is the number infinity
|
||||||
output logic ExpNonZero, // is the exponent not zero
|
|
||||||
output logic FracZero, // is the fraction zero
|
|
||||||
output logic ExpMax, // does In have the maximum exponent (NaN or Inf)
|
output logic ExpMax, // does In have the maximum exponent (NaN or Inf)
|
||||||
output logic Subnorm, // is the number subnormal
|
output logic Subnorm, // is the number subnormal
|
||||||
output logic [P.FLEN-1:0] PostBox // Number reboxed correctly as a NaN
|
output logic [P.FLEN-1:0] PostBox // Number reboxed correctly as a NaN
|
||||||
@ -48,6 +46,8 @@ module unpackinput import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
logic [P.NF-1:0] Frac; // Fraction of XYZ
|
logic [P.NF-1:0] Frac; // Fraction of XYZ
|
||||||
logic BadNaNBox; // incorrectly NaN Boxed
|
logic BadNaNBox; // incorrectly NaN Boxed
|
||||||
|
logic FracZero; // is the fraction zero
|
||||||
|
logic ExpNonZero; // is the exponent non-zero
|
||||||
logic [P.FLEN-1:0] In;
|
logic [P.FLEN-1:0] In;
|
||||||
|
|
||||||
// Gate input when FPU is not active to save power and simulation
|
// Gate input when FPU is not active to save power and simulation
|
||||||
|
@ -34,7 +34,7 @@ module aplusbeq0 #(parameter WIDTH = 8) (
|
|||||||
logic [WIDTH-1:0] orshift;
|
logic [WIDTH-1:0] orshift;
|
||||||
|
|
||||||
// The sum is zero if the bitwise XOR is equal to the bitwise OR shifted left by 1, for all columns
|
// The sum is zero if the bitwise XOR is equal to the bitwise OR shifted left by 1, for all columns
|
||||||
// *** explain, cite book
|
// See J. A. Prabhu and G. Zyner, "167 MHz radix-8 divide and square root using overlapped radix-2 stages," IEEE Symp. Computer Arithmetic, 1995, pp. 155-162.
|
||||||
|
|
||||||
assign x = a ^ b;
|
assign x = a ^ b;
|
||||||
assign orshift = {a[WIDTH-2:0] | b[WIDTH-2:0], 1'b0};
|
assign orshift = {a[WIDTH-2:0] | b[WIDTH-2:0], 1'b0};
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
///////////////////////////////////////////
|
|
||||||
// clockgater.sv
|
|
||||||
//
|
|
||||||
// Written: Ross Thompson 9 January 2021
|
|
||||||
// Modified:
|
|
||||||
//
|
|
||||||
// Purpose: Clock gater model. Must use standard cell for synthesis.
|
|
||||||
//
|
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
|
||||||
// https://github.com/openhwgroup/cvw
|
|
||||||
//
|
|
||||||
// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
|
||||||
//
|
|
||||||
// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
|
|
||||||
// except in compliance with the License, or, at your option, the Apache License version 2.0. You
|
|
||||||
// may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// https://solderpad.org/licenses/SHL-2.1/
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, any work distributed under the
|
|
||||||
// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
||||||
// either express or implied. See the License for the specific language governing permissions
|
|
||||||
// and limitations under the License.
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
module clockgater #(parameter FPGA) (
|
|
||||||
input logic E,
|
|
||||||
input logic SE,
|
|
||||||
input logic CLK,
|
|
||||||
output logic ECLK
|
|
||||||
);
|
|
||||||
|
|
||||||
if (FPGA) BUFGCE bufgce_i0 (.I(CLK), .CE(E | SE), .O(ECLK));
|
|
||||||
else begin
|
|
||||||
// *** BUG
|
|
||||||
// VERY IMPORTANT.
|
|
||||||
// This part functionally models a clock gater, but does not necessarily meet the timing constrains a real standard cell would.
|
|
||||||
// Do not use this in synthesis!
|
|
||||||
logic enable_q;
|
|
||||||
always_latch begin
|
|
||||||
if(~CLK) begin
|
|
||||||
enable_q <= E | SE;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
assign ECLK = enable_q & CLK;
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
|
@ -29,8 +29,5 @@ module decoder #(parameter BINARY_BITS = 3) (
|
|||||||
output logic [(2**BINARY_BITS)-1:0] onehot
|
output logic [(2**BINARY_BITS)-1:0] onehot
|
||||||
);
|
);
|
||||||
|
|
||||||
// *** Double check whether this synthesizes as expected
|
|
||||||
// -- Ben @ May 4: only warning is that "signed to unsigned assignment occurs"; that said, I haven't checked the netlists
|
|
||||||
assign onehot = 1 << binary;
|
assign onehot = 1 << binary;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -44,11 +44,9 @@ module ram1p1rwbe import cvw::*; #(parameter USE_SRAM=0, DEPTH=64, WIDTH=44, PRE
|
|||||||
output logic [WIDTH-1:0] dout
|
output logic [WIDTH-1:0] dout
|
||||||
);
|
);
|
||||||
|
|
||||||
bit [WIDTH-1:0] RAM[DEPTH-1:0];
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// ***************************************************************************
|
|
||||||
// TRUE SRAM macro
|
// TRUE SRAM macro
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
if ((USE_SRAM == 1) & (WIDTH == 128) & (DEPTH == 64)) begin // Cache data subarray
|
if ((USE_SRAM == 1) & (WIDTH == 128) & (DEPTH == 64)) begin // Cache data subarray
|
||||||
genvar index;
|
genvar index;
|
||||||
// 64 x 128-bit SRAM
|
// 64 x 128-bit SRAM
|
||||||
@ -79,11 +77,11 @@ module ram1p1rwbe import cvw::*; #(parameter USE_SRAM=0, DEPTH=64, WIDTH=44, PRE
|
|||||||
.A(addr), .D(din),
|
.A(addr), .D(din),
|
||||||
.BWEB(~BitWriteMask), .Q(dout));
|
.BWEB(~BitWriteMask), .Q(dout));
|
||||||
|
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// READ first SRAM model
|
// READ first SRAM model
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
end else begin: ram
|
end else begin: ram
|
||||||
integer i;
|
bit [WIDTH-1:0] RAM[DEPTH-1:0];
|
||||||
|
|
||||||
if (PRELOAD_ENABLED) begin
|
if (PRELOAD_ENABLED) begin
|
||||||
initial begin
|
initial begin
|
||||||
@ -103,11 +101,13 @@ module ram1p1rwbe import cvw::*; #(parameter USE_SRAM=0, DEPTH=64, WIDTH=44, PRE
|
|||||||
// Write divided into part for bytes and part for extra msbs
|
// Write divided into part for bytes and part for extra msbs
|
||||||
// Questa sim version 2022.3_2 does not allow multiple drivers for RAM when using always_ff.
|
// Questa sim version 2022.3_2 does not allow multiple drivers for RAM when using always_ff.
|
||||||
// Therefore these always blocks use the older always @(posedge clk)
|
// Therefore these always blocks use the older always @(posedge clk)
|
||||||
if(WIDTH >= 8)
|
if(WIDTH >= 8) begin
|
||||||
|
integer i;
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
if (ce & we)
|
if (ce & we)
|
||||||
for(i = 0; i < WIDTH/8; i++)
|
for(i = 0; i < WIDTH/8; i++)
|
||||||
if(bwe[i]) RAM[addr][i*8 +: 8] <= din[i*8 +: 8];
|
if(bwe[i]) RAM[addr][i*8 +: 8] <= din[i*8 +: 8];
|
||||||
|
end
|
||||||
|
|
||||||
if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
|
if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
|
@ -41,11 +41,9 @@ module ram1p1rwe import cvw::* ; #(parameter USE_SRAM=0, DEPTH=64, WIDTH=44) (
|
|||||||
output logic [WIDTH-1:0] dout
|
output logic [WIDTH-1:0] dout
|
||||||
);
|
);
|
||||||
|
|
||||||
bit [WIDTH-1:0] RAM[DEPTH-1:0];
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// ***************************************************************************
|
|
||||||
// TRUE SRAM macro
|
// TRUE SRAM macro
|
||||||
// ***************************************************************************
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
if ((USE_SRAM == 1) & (WIDTH == 128) & (DEPTH == 64)) begin // Cache data subarray
|
if ((USE_SRAM == 1) & (WIDTH == 128) & (DEPTH == 64)) begin // Cache data subarray
|
||||||
// 64 x 128-bit SRAM
|
// 64 x 128-bit SRAM
|
||||||
ram1p1rwbe_64x128 sram1A (.CLK(clk), .CEB(~ce), .WEB(~we),
|
ram1p1rwbe_64x128 sram1A (.CLK(clk), .CEB(~ce), .WEB(~we),
|
||||||
@ -64,13 +62,14 @@ module ram1p1rwe import cvw::* ; #(parameter USE_SRAM=0, DEPTH=64, WIDTH=44) (
|
|||||||
.A(addr), .D(din),
|
.A(addr), .D(din),
|
||||||
.BWEB('0), .Q(dout));
|
.BWEB('0), .Q(dout));
|
||||||
|
|
||||||
// ***************************************************************************
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// READ first SRAM model
|
// READ first SRAM model
|
||||||
// ***************************************************************************
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
end else begin: ram
|
end else begin: ram
|
||||||
// *** Vivado is not implementing this as block ram for some reason.
|
// Vivado is not implementing this as block ram for some reason.
|
||||||
// The version with byte write enables it correctly infers block ram.
|
// The version with byte write enables it correctly infers block ram.
|
||||||
integer i;
|
|
||||||
|
bit [WIDTH-1:0] RAM[DEPTH-1:0];
|
||||||
|
|
||||||
// Combinational read: register address and read after clock edge
|
// Combinational read: register address and read after clock edge
|
||||||
logic [$clog2(DEPTH)-1:0] addrd;
|
logic [$clog2(DEPTH)-1:0] addrd;
|
||||||
|
@ -44,13 +44,12 @@ module ram2p1r1wbe import cvw::*; #(parameter USE_SRAM=0, DEPTH=1024, WIDTH=68)
|
|||||||
output logic [WIDTH-1:0] rd1
|
output logic [WIDTH-1:0] rd1
|
||||||
);
|
);
|
||||||
|
|
||||||
bit [WIDTH-1:0] mem[DEPTH-1:0];
|
|
||||||
localparam SRAMWIDTH = 32;
|
localparam SRAMWIDTH = 32;
|
||||||
localparam SRAMNUMSETS = SRAMWIDTH/WIDTH;
|
localparam SRAMNUMSETS = SRAMWIDTH/WIDTH;
|
||||||
|
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// TRUE Smem macro
|
// TRUE SRAM macro
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if ((USE_SRAM == 1) & (WIDTH == 68) & (DEPTH == 1024)) begin
|
if ((USE_SRAM == 1) & (WIDTH == 68) & (DEPTH == 1024)) begin
|
||||||
|
|
||||||
@ -105,39 +104,35 @@ module ram2p1r1wbe import cvw::*; #(parameter USE_SRAM=0, DEPTH=1024, WIDTH=68)
|
|||||||
.QA(SRAMReadData),
|
.QA(SRAMReadData),
|
||||||
.QB());
|
.QB());
|
||||||
|
|
||||||
end else begin
|
end else begin:ram
|
||||||
|
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// READ first SRAM model
|
// READ first SRAM model
|
||||||
// ***************************************************************************
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
integer i;
|
|
||||||
/*
|
bit [WIDTH-1:0] RAM[DEPTH-1:0];
|
||||||
initial begin // initialize memory for simulation only; not needed because done in the testbench now
|
|
||||||
integer j;
|
|
||||||
for (j=0; j < DEPTH; j++)
|
|
||||||
mem[j] = '0;
|
|
||||||
end
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Read
|
// Read
|
||||||
logic [$clog2(DEPTH)-1:0] ra1d;
|
logic [$clog2(DEPTH)-1:0] ra1d;
|
||||||
flopen #($clog2(DEPTH)) adrreg(clk, ce1, ra1, ra1d);
|
flopen #($clog2(DEPTH)) adrreg(clk, ce1, ra1, ra1d);
|
||||||
assign rd1 = mem[ra1d];
|
assign rd1 = RAM[ra1d];
|
||||||
|
|
||||||
// Write divided into part for bytes and part for extra msbs
|
// Write divided into part for bytes and part for extra msbs
|
||||||
// coverage off
|
// coverage off
|
||||||
// when byte write enables are tied high, the last IF is always taken
|
// when byte write enables are tied high, the last IF is always taken
|
||||||
if(WIDTH >= 8)
|
if(WIDTH >= 8) begin
|
||||||
|
integer i;
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
if (ce2 & we2)
|
if (ce2 & we2)
|
||||||
for(i = 0; i < WIDTH/8; i++)
|
for(i = 0; i < WIDTH/8; i++)
|
||||||
if(bwe2[i]) mem[wa2][i*8 +: 8] <= wd2[i*8 +: 8];
|
if(bwe2[i]) RAM[wa2][i*8 +: 8] <= wd2[i*8 +: 8];
|
||||||
|
end
|
||||||
// coverage on
|
// coverage on
|
||||||
|
|
||||||
if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
|
if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
if (ce2 & we2 & bwe2[WIDTH/8])
|
if (ce2 & we2 & bwe2[WIDTH/8])
|
||||||
mem[wa2][WIDTH-1:WIDTH-WIDTH%8] <= wd2[WIDTH-1:WIDTH-WIDTH%8];
|
RAM[wa2][WIDTH-1:WIDTH-WIDTH%8] <= wd2[WIDTH-1:WIDTH-WIDTH%8];
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Determine stalls and flushes
|
// Purpose: Determine stalls and flushes
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 4, Figure 13.54
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -26,11 +26,11 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aes64ks1i(
|
module aes64ks1i(
|
||||||
input logic [3:0] round,
|
input logic [3:0] round,
|
||||||
input logic [63:0] rs1,
|
input logic [63:32] rs1,
|
||||||
input logic [31:0] Sbox0Out,
|
input logic [31:0] Sbox0Out,
|
||||||
output logic [31:0] SboxKIn,
|
output logic [31:0] SboxKIn,
|
||||||
output logic [63:0] result
|
output logic [63:0] result
|
||||||
);
|
);
|
||||||
|
|
||||||
logic finalround;
|
logic finalround;
|
||||||
|
@ -26,9 +26,9 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aes64ks2(
|
module aes64ks2(
|
||||||
input logic [63:0] rs2,
|
input logic [63:0] rs2,
|
||||||
input logic [63:0] rs1,
|
input logic [63:32] rs1,
|
||||||
output logic [63:0] result
|
output logic [63:0] result
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [31:0] w0, w1;
|
logic [31:0] w0, w1;
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aesinvshiftrows64(
|
module aesinvshiftrows64(
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input logic [127:0] a,
|
input logic [127:0] a,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
output logic [63:0] y
|
output logic [63:0] y
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module aesshiftrows64(
|
module aesshiftrows64(
|
||||||
|
/* verilator lint_off UNUSEDSIGNAL */
|
||||||
input logic [127:0] a,
|
input logic [127:0] a,
|
||||||
|
/* verilator lint_on UNUSEDSIGNAL */
|
||||||
output logic [63:0] y
|
output logic [63:0] y
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
///////////////////////////////////////////
|
|
||||||
// aesshiftrows64.sv
|
|
||||||
//
|
|
||||||
// Written: ryan.swann@okstate.edu, james.stine@okstate.edu
|
|
||||||
// Created: 20 February 2024
|
|
||||||
//
|
|
||||||
// Purpose: aesshiftrow for taking in first Data line
|
|
||||||
//
|
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
|
||||||
// https://github.com/openhwgroup/cvw
|
|
||||||
//
|
|
||||||
// Copyright (C) 2021-24 Harvey Mudd College & Oklahoma State University
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
|
||||||
//
|
|
||||||
// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
|
|
||||||
// except in compliance with the License, or, at your option, the Apache License version 2.0. You
|
|
||||||
// may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// https://solderpad.org/licenses/SHL-2.1/
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, any work distributed under the
|
|
||||||
// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
||||||
// either express or implied. See the License for the specific language governing permissions
|
|
||||||
// and limitations under the License.
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
module aesshiftrows64(
|
|
||||||
input logic [127:0] a,
|
|
||||||
output logic [63:0] y
|
|
||||||
);
|
|
||||||
|
|
||||||
assign y = {a[31:24], a[119:112], a[79:72], a[39:32],
|
|
||||||
a[127:120], a[87:80], a[47:40], a[7:0]};
|
|
||||||
endmodule
|
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: RISC-V Arithmetic/Logic Unit
|
// Purpose: RISC-V Arithmetic/Logic Unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 4 (Figure 4.4)
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: RISC-V Arithmetic/Logic Unit Bit-Manipulation Extension and K extension
|
// Purpose: RISC-V Arithmetic/Logic Unit Bit-Manipulation Extension and K extension
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -49,7 +49,6 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.XLEN-1:0] ZBBResult; // ZBB Result
|
logic [P.XLEN-1:0] ZBBResult; // ZBB Result
|
||||||
logic [P.XLEN-1:0] ZBCResult; // ZBC Result
|
logic [P.XLEN-1:0] ZBCResult; // ZBC Result
|
||||||
logic [P.XLEN-1:0] ZBKBResult; // ZBKB Result
|
logic [P.XLEN-1:0] ZBKBResult; // ZBKB Result
|
||||||
logic [P.XLEN-1:0] ZBKCResult; // ZBKC Result
|
|
||||||
logic [P.XLEN-1:0] ZBKXResult; // ZBKX Result
|
logic [P.XLEN-1:0] ZBKXResult; // ZBKX Result
|
||||||
logic [P.XLEN-1:0] ZKNHResult; // ZKNH Result
|
logic [P.XLEN-1:0] ZKNHResult; // ZKNH Result
|
||||||
logic [P.XLEN-1:0] ZKNDEResult; // ZKNE or ZKND Result
|
logic [P.XLEN-1:0] ZKNDEResult; // ZKNE or ZKND Result
|
||||||
@ -93,7 +92,7 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
// ZBC and ZBKCUnit
|
// ZBC and ZBKCUnit
|
||||||
if (P.ZBC_SUPPORTED | P.ZBKC_SUPPORTED) begin: zbc
|
if (P.ZBC_SUPPORTED | P.ZBKC_SUPPORTED) begin: zbc
|
||||||
zbc #(P) ZBC(.A(ABMU), .RevA, .B(BBMU), .Funct3, .ZBCResult);
|
zbc #(P) ZBC(.A(ABMU), .RevA, .B(BBMU), .Funct3(Funct3[1:0]), .ZBCResult);
|
||||||
end else assign ZBCResult = '0;
|
end else assign ZBCResult = '0;
|
||||||
|
|
||||||
// ZBB Unit
|
// ZBB Unit
|
||||||
@ -108,7 +107,7 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
|
|||||||
|
|
||||||
// ZBKB Unit
|
// ZBKB Unit
|
||||||
if (P.ZBKB_SUPPORTED) begin: zbkb
|
if (P.ZBKB_SUPPORTED) begin: zbkb
|
||||||
zbkb #(P.XLEN) ZBKB(.A(ABMU), .B(BBMU), .Funct3, .ZBKBSelect(ZBBSelect[2:0]), .ZBKBResult);
|
zbkb #(P.XLEN) ZBKB(.A(ABMU), .B(BBMU[P.XLEN/2-1:0]), .Funct3, .ZBKBSelect(ZBBSelect[2:0]), .ZBKBResult);
|
||||||
end else assign ZBKBResult = '0;
|
end else assign ZBKBResult = '0;
|
||||||
|
|
||||||
// ZBKX Unit
|
// ZBKX Unit
|
||||||
@ -125,7 +124,7 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
|
|||||||
// ZKNH Unit
|
// ZKNH Unit
|
||||||
if (P.ZKNH_SUPPORTED) begin: zknh
|
if (P.ZKNH_SUPPORTED) begin: zknh
|
||||||
if (P.XLEN == 32) zknh32 ZKNH32(.A(ABMU), .B(BBMU), .ZKNHSelect(ZBBSelect), .ZKNHResult(ZKNHResult));
|
if (P.XLEN == 32) zknh32 ZKNH32(.A(ABMU), .B(BBMU), .ZKNHSelect(ZBBSelect), .ZKNHResult(ZKNHResult));
|
||||||
else zknh64 ZKNH64(.A(ABMU), .B(BBMU), .ZKNHSelect(ZBBSelect), .ZKNHResult(ZKNHResult));
|
else zknh64 ZKNH64(.A(ABMU), .ZKNHSelect(ZBBSelect), .ZKNHResult(ZKNHResult));
|
||||||
end else assign ZKNHResult = '0;
|
end else assign ZKNHResult = '0;
|
||||||
|
|
||||||
// Result Select Mux
|
// Result Select Mux
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Bit reverse submodule
|
// Purpose: Bit reverse submodule
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Top level bit manipulation instruction decoder
|
// Purpose: Top level bit manipulation instruction decoder
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -31,11 +31,8 @@
|
|||||||
module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
// Decode stage control signals
|
// Decode stage control signals
|
||||||
input logic StallD, FlushD, // Stall, flush Decode stage
|
|
||||||
input logic [31:0] InstrD, // Instruction in Decode stage
|
input logic [31:0] InstrD, // Instruction in Decode stage
|
||||||
input logic ALUOpD, // Regular ALU Operation
|
input logic ALUOpD, // Regular ALU Operation
|
||||||
output logic [3:0] BSelectD, // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding in Decode stage
|
|
||||||
output logic [3:0] ZBBSelectD, // ZBB mux select signal in Decode stage NOTE: do we need this in decode?
|
|
||||||
output logic BRegWriteD, // Indicates if it is a R type B instruction in Decode Stage
|
output logic BRegWriteD, // Indicates if it is a R type B instruction in Decode Stage
|
||||||
output logic BALUSrcBD, // Indicates if it is an I/IW (non auipc) type B instruction in Decode Stage
|
output logic BALUSrcBD, // Indicates if it is an I/IW (non auipc) type B instruction in Decode Stage
|
||||||
output logic BW64D, // Indiciates if it is a W type B instruction in Decode Stage
|
output logic BW64D, // Indiciates if it is a W type B instruction in Decode Stage
|
||||||
@ -46,7 +43,6 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
output logic [2:0] ALUSelectD, // ALU select
|
output logic [2:0] ALUSelectD, // ALU select
|
||||||
output logic [3:0] BSelectE, // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding
|
output logic [3:0] BSelectE, // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding
|
||||||
output logic [3:0] ZBBSelectE, // ZBB mux select signal
|
output logic [3:0] ZBBSelectE, // ZBB mux select signal
|
||||||
output logic BRegWriteE, // Indicates if it is a R type B instruction in Execute
|
|
||||||
output logic [2:0] BALUControlE, // ALU Control signals for B instructions in Execute Stage
|
output logic [2:0] BALUControlE, // ALU Control signals for B instructions in Execute Stage
|
||||||
output logic BMUActiveE // Bit manipulation instruction being executed
|
output logic BMUActiveE // Bit manipulation instruction being executed
|
||||||
);
|
);
|
||||||
@ -61,6 +57,8 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [2:0] BALUControlD; // ALU Control signals for B instructions
|
logic [2:0] BALUControlD; // ALU Control signals for B instructions
|
||||||
logic [2:0] BALUSelectD; // ALU Mux select signal in Decode Stage for BMU operations
|
logic [2:0] BALUSelectD; // ALU Mux select signal in Decode Stage for BMU operations
|
||||||
logic BALUOpD; // Indicates if it is an ALU B instruction in Decode Stage
|
logic BALUOpD; // Indicates if it is an ALU B instruction in Decode Stage
|
||||||
|
logic [3:0] BSelectD; // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding in Decode stage
|
||||||
|
logic [3:0] ZBBSelectD; // ZBB mux select signal in Decode stage
|
||||||
|
|
||||||
`define BMUCTRLW 20
|
`define BMUCTRLW 20
|
||||||
|
|
||||||
@ -285,5 +283,5 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) (
|
|||||||
assign ALUSelectD = BALUOpD ? BALUSelectD : (ALUOpD ? Funct3D : 3'b000);
|
assign ALUSelectD = BALUOpD ? BALUSelectD : (ALUOpD ? Funct3D : 3'b000);
|
||||||
|
|
||||||
// BMU Execute stage pipieline control register
|
// BMU Execute stage pipieline control register
|
||||||
flopenrc #(13) controlregBMU(clk, reset, FlushE, ~StallE, {BSelectD, ZBBSelectD, BRegWriteD, BALUControlD, ~IllegalBitmanipInstrD}, {BSelectE, ZBBSelectE, BRegWriteE, BALUControlE, BMUActiveE});
|
flopenrc #(12) controlregBMU(clk, reset, FlushE, ~StallE, {BSelectD, ZBBSelectD, BALUControlD, ~IllegalBitmanipInstrD}, {BSelectE, ZBBSelectE, BALUControlE, BMUActiveE});
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: RISCV bitmanip byte-wise operation unit
|
// Purpose: RISCV bitmanip byte-wise operation unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Carry-Less multiplication unit
|
// Purpose: Carry-Less multiplication unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Count Instruction Submodule
|
// Purpose: Count Instruction Submodule
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Sign/Zero Extension Submodule
|
// Purpose: Sign/Zero Extension Submodule
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -29,7 +29,7 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module ext #(parameter WIDTH = 32) (
|
module ext #(parameter WIDTH = 32) (
|
||||||
input logic [WIDTH-1:0] A, // Operands
|
input logic [15:0] A, // Operand to extend
|
||||||
input logic [1:0] ExtSelect, // B[2], B[0] of immediate
|
input logic [1:0] ExtSelect, // B[2], B[0] of immediate
|
||||||
output logic [WIDTH-1:0] ExtResult); // Extend Result
|
output logic [WIDTH-1:0] ExtResult); // Extend Result
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: Population Count
|
// Purpose: Population Count
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: RISC-V ZBB top level unit
|
// Purpose: RISC-V ZBB top level unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -46,7 +46,7 @@ module zbb #(parameter WIDTH=32) (
|
|||||||
mux2 #(1) ltmux(LT, LTU, BUnsigned , lt);
|
mux2 #(1) ltmux(LT, LTU, BUnsigned , lt);
|
||||||
cnt #(WIDTH) cnt(.A, .RevA, .B(B[1:0]), .W64, .CntResult);
|
cnt #(WIDTH) cnt(.A, .RevA, .B(B[1:0]), .W64, .CntResult);
|
||||||
byteop #(WIDTH) bu(.A, .ByteSelect(B[0]), .ByteResult);
|
byteop #(WIDTH) bu(.A, .ByteSelect(B[0]), .ByteResult);
|
||||||
ext #(WIDTH) ext(.A, .ExtSelect({~B[2], {B[2] & B[0]}}), .ExtResult);
|
ext #(WIDTH) ext(.A(A[15:0]), .ExtSelect({~B[2], {B[2] & B[0]}}), .ExtResult);
|
||||||
|
|
||||||
// ZBBSelect[2] differentiates between min(u) vs max(u) instruction
|
// ZBBSelect[2] differentiates between min(u) vs max(u) instruction
|
||||||
mux2 #(WIDTH) minmaxmux(B, A, ZBBSelect[2]^lt, MinMaxResult);
|
mux2 #(WIDTH) minmaxmux(B, A, ZBBSelect[2]^lt, MinMaxResult);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Purpose: RISC-V ZBC top-level unit
|
// Purpose: RISC-V ZBC top-level unit
|
||||||
//
|
//
|
||||||
// Documentation: RISC-V System on Chip Design Chapter 15
|
// Documentation: RISC-V System on Chip Design
|
||||||
//
|
//
|
||||||
// A component of the CORE-V-WALLY configurable RISC-V project.
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
// https://github.com/openhwgroup/cvw
|
// https://github.com/openhwgroup/cvw
|
||||||
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
module zbc import cvw::*; #(parameter cvw_t P) (
|
module zbc import cvw::*; #(parameter cvw_t P) (
|
||||||
input logic [P.XLEN-1:0] A, RevA, B, // Operands
|
input logic [P.XLEN-1:0] A, RevA, B, // Operands
|
||||||
input logic [2:0] Funct3, // Indicates operation to perform
|
input logic [1:0] Funct3, // Indicates operation to perform
|
||||||
output logic [P.XLEN-1:0] ZBCResult); // ZBC result
|
output logic [P.XLEN-1:0] ZBCResult); // ZBC result
|
||||||
|
|
||||||
logic [P.XLEN-1:0] ClmulResult, RevClmulResult;
|
logic [P.XLEN-1:0] ClmulResult, RevClmulResult;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user