#!/bin/bash # check for warnings in Verilog code # The verilator lint tool is faster and better than Questa so it is best to run this first. # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 export PATH=$PATH:/usr/local/bin/ verilator=`which verilator` basepath=$(dirname $0)/.. RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # No Color fails=0 if [ "$1" == "--nightly" ]; then configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i) derivconfigs=`ls $WALLY/config/deriv` for entry in $derivconfigs do if [[ $entry != *"syn_sram"* ]]; then # ignore syn_sram* configs that contain undefined module configs[${#configs[@]}]=$entry fi done else configs=(rv32e rv64gc rv32gc rv32imc rv32i rv64i fdqh_rv64gc) fi for config in ${configs[@]}; do # 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 \ -Wall -Wno-UNUSEDSIGNAL -Wno-VARHIDDEN -Wno-GENUNNAMED -Wno-PINCONNECTEMPTY); then if [ "$1" == "-nightly" ]; then echo -e "${RED}$config failed lint${NC}" fails=$((fails+1)) else echo -e "${RED}$config fails with lint errors or warnings" exit 1 fi else echo -e "${GREEN}$config passed lint${NC}" fi done if [ $fails -gt 0 ]; then echo -e "${RED}Linting failed for $fails of ${#configs[@]} configurations" exit 1 fi echo -e "${GREEN}All ${#configs[@]} lints run with no errors or warnings" # --lint-only just runs lint rather than trying to compile and simulate # -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 # 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.