#!/bin/bash # Copyright lowRISC contributors. # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 # This script converts all SystemVerilog RTL files to Verilog # using sv2v and then runs LEC (Cadence Conformal) to check if # the generated Verilog is logically equivalent to the original # SystemVerilog. A similar script is used in OpenTitan, any updates # or fixes here may need to be reflected in the OpenTitan script as well # https://github.com/lowRISC/opentitan/blob/master/util/syn_yosys.sh # # The following tools are required: # - sv2v: SystemVerilog-to-Verilog converter from github.com/zachjs/sv2v # - Cadence Conformal # # Usage: # ./lec_sv2v.sh |& tee lec.log #------------------------------------------------------------------------- # use fusesoc to generate files and file list #------------------------------------------------------------------------- rm -Rf build lec_out fusesoc --cores-root .. run --tool=icarus --target=lint \ --setup "lowrisc:ibex:ibex_top" > /dev/null 2>&1 # copy all files to lec_out mkdir lec_out cp build/*/src/*/*.sv build/*/src/*/*/*.sv lec_out cd lec_out # copy file list and remove incdir, RVFI define, and sim-file egrep -v 'incdir|RVFI|simulator_ctrl' ../build/*/*/*.scr > flist_gold # remove all hierarchical paths sed -i 's!.*/!!' flist_gold # generate revised flist by replacing '.sv' by '.v' and removing packages sed 's/.sv/.v/' flist_gold | grep -v "_pkg.v" > flist_rev #------------------------------------------------------------------------- # convert all RTL files to Verilog using sv2v #------------------------------------------------------------------------- printf "\nSV2V ERRORS:\n" for file in *.sv; do module=`basename -s .sv $file` sv2v --define=SYNTHESIS *_pkg.sv prim_assert.sv $file > ${module}.v done # remove *pkg.v files (they are empty files and not needed) rm -f *_pkg.v prim_assert.v prim_util_memload.v # overwrite the prim_clock_gating modules with the module from ../rtl cp ../rtl/prim_clock_gating.v . cp ../rtl/prim_clock_gating.v prim_clock_gating.sv #------------------------------------------------------------------------- # run LEC (generated Verilog vs. original SystemVerilog) #------------------------------------------------------------------------- printf "\n\nLEC RESULTS:\n" for file in *.v; do export LEC_TOP=`basename -s .v $file` # run Conformal LEC lec -xl -nogui -nobanner \ -dofile ../lec_sv2v.do \ -logfile lec_${LEC_TOP}.log \ <<< "exit -force" > /dev/null 2>&1 # summarize results check=`grep "Compare Results" lec_${LEC_TOP}.log` if [ $? -ne 0 ]; then result="CRASH" else result=`echo $check | awk '{ print $4 }'` fi printf "%-25s %s\n" $LEC_TOP $result done