blob: 8ceb9c19b6930d1dd2ce8c65fc61ba7b09a4f36e [file] [log] [blame]
#!/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 and then
# runs Yosys.
#
# The following tools are required:
# - sv2v: SystemVerilog-to-Verilog converter from github.com/zachjs/sv2v
# - yosys: synthesis tool from github.com/YosysHQ/yosys
# - Cadence Conformal
#
# Usage:
# ./syn_yosys.sh 2>&1 | tee syn.std
#-------------------------------------------------------------------------
# use fusesoc to generate files and file list
#-------------------------------------------------------------------------
\rm -Rf build syn_out
fusesoc --cores-root .. run --target=syn \
--setup lowrisc:systems:top_earlgrey > /dev/null 2>&1
# copy all files into directory "syn_out"
mkdir syn_out
cp \
build/*/src/*/*.sv* \
build/*/src/*/*/*.sv* \
build/*/src/*/*/*/*.sv* \
syn_out
cd syn_out
# copy file list, remove incdir and pins_if, and flatten pathnames
grep -Ev 'incdir|pins_if' ../build/*/*/*.scr | sed 's!.*/!!' > flist_gold
# generate revised flist by replacing '.sv' by '.v' and removing packages
sed -e 's/.sv/.v/g' flist_gold | grep -v "_pkg.v" > flist_rev
#-------------------------------------------------------------------------
# convert all RTL files to Verilog
#-------------------------------------------------------------------------
printf "\nSV2V VERSION:\n"
sv2v --version
printf "\nSV2V ERRORS:\n"
# drive strengths are not supported by Yosys
sed -i.bak -e "s/VERILATOR/SYNTHESIS/" prim_generic_pad_wrapper.sv
rm *.sv.bak
sv2v -DSYNTHESIS *.sv +RTS -N4 > combined.v
# split files up
modules=`cat combined.v | grep "^module" | sed -e "s/^module //" | sed -e "s/ (//"`
echo "$modules" > modules.txt # for debugging
for module in $modules; do
sed -n "/^module $module /,/^endmodule/p" < combined.v > $module.v
done
rm combined.v
#-------------------------------------------------------------------------
# run LEC (generarted Verilog vs. original SystemVerilog)
#-------------------------------------------------------------------------
printf "\n\nLEC RESULTS:\n"
# all of top_earlgrey's submodules
declare -a modules=(
"rv_dm"
"spi_device"
"usbdev"
"flash_ctrl"
"tlul_adapter_sram"
"prim_rom_adv"
"prim_ram_1p_adv"
"uart"
"gpio"
"aes"
"hmac"
"pinmux"
"alert_handler"
"pwrmgr"
"rstmgr"
"clkmgr"
"rv_timer"
"rv_plic"
"rv_core_ibex"
"xbar_main"
"xbar_peri"
"flash_phy"
)
# TODO: top_earlgrey appears to be too large for verification under the currrent
# setup. Consider adding verification using `hier_compare`.
for module in "${modules[@]}"; do
export LEC_TOP="$module"
# run Conformal LEC
lec -xl -nogui -nobanner \
-dofile ../../hw/formal/lec_sv2v.do \
-logfile lec_${module}.log \
<<< "exit -force" > /dev/null 2>&1
# summarize results
result=`grep "Compare Results" lec_${module}.log 2>&1`
if [ $? -ne 0 ]; then
result="CRASH"
else
result=`echo $result | awk '{ print $4 }'`
fi
printf "%-25s %s\n" $module $result
done
#-------------------------------------------------------------------------
# run yosys
#-------------------------------------------------------------------------
printf "\n\nYosys:\n"
yosys -QTqp "
read_verilog *.v;
hierarchy -check -top top_earlgrey;
synth_xilinx;
write_blif out.blif;
write_edif out.edif;
write_json out.json;
"
# TODOs:
# - add full yosys synthesis for all modules
# - add final LEC check (RTL-versus-netlist)