Merge branch 'main' of github.com:davidharrishmc/riscv-wally into main

This commit is contained in:
Ross Thompson 2022-02-09 19:14:39 -06:00
commit 459cd3c450
10 changed files with 314 additions and 101 deletions

9
.gitignore vendored
View File

@ -52,7 +52,12 @@ examples/asm/sumtest/sumtest
examples/asm/example/example examples/asm/example/example
examples/C/sum/sum examples/C/sum/sum
examples/C/fir/fir examples/C/fir/fir
synthDC/hdl/*.sv
linux/devicetree/debug/* linux/devicetree/debug/*
!linux/devicetree/debug/dumpdts.sh !linux/devicetree/debug/dump-dts.sh
*.dtb *.dtb
synthDC/WORK
synthDC/alib-52
synthDC/*.log
synthDC/*.svf
synthDC/runs/
synthDC/hdl

View File

@ -3,8 +3,8 @@
/ { / {
#address-cells = <0x02>; #address-cells = <0x02>;
#size-cells = <0x02>; #size-cells = <0x02>;
compatible = "riscv-virtio-trimmed"; compatible = "wally-virt";
model = "riscv-virtio-trimmed,qemu"; model = "wally-virt,qemu";
chosen { chosen {
linux,initrd-end = <0x85c43a00>; linux,initrd-end = <0x85c43a00>;

View File

@ -4,10 +4,12 @@ imageDir=$RISCV/buildroot/output/images
outDir=$RISCV/linux-testvectors outDir=$RISCV/linux-testvectors
recordFile="$outDir/all.qemu" recordFile="$outDir/all.qemu"
traceFile="$outDir/all.txt" traceFile="$outDir/all.txt"
interruptsFile="$outDir/interrupts.txt"
read -p "Warning: running this script will overwrite the contents of: read -p "Warning: running this script will overwrite the contents of:
* $recordFile * $recordFile
* $traceFile * $traceFile
* $interruptsFile
Would you like to proceed? (y/n) " -n 1 -r Would you like to proceed? (y/n) " -n 1 -r
echo echo
if [[ $REPLY =~ ^[Yy]$ ]] if [[ $REPLY =~ ^[Yy]$ ]]
@ -17,27 +19,31 @@ then
sudo chown cad $outDir sudo chown cad $outDir
sudo touch $recordFile sudo touch $recordFile
sudo touch $traceFile sudo touch $traceFile
sudo touch $interruptsFile
sudo chmod a+rw $recordFile sudo chmod a+rw $recordFile
sudo chmod a+rw $traceFile sudo chmod a+rw $traceFile
sudo chmod a+rw $interruptsFile
# Compile Devicetree from Source # Compile Devicetree from Source
dtc -I dts -O dtb ../devicetree/virt-trimmed.dts > ../devicetree/virt-trimmed.dtb dtc -I dts -O dtb ../devicetree/wally-virt.dts > ../devicetree/wally-virt.dtb
# QEMU Simulation # QEMU Simulation
(qemu-system-riscv64 \ (qemu-system-riscv64 \
-M virt -dtb ../devicetree/virt-trimmed.dtb \ -M virt -dtb ../devicetree/wally-virt.dtb \
-nographic -serial /dev/null \ -nographic -serial /dev/null \
-bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \
-singlestep -rtc clock=vm -icount shift=0,align=off,sleep=on,rr=record,rrfile=$recordFile \ -singlestep -rtc clock=vm -icount shift=0,align=off,sleep=on,rr=record,rrfile=$recordFile \
-d nochain,cpu,in_asm \ -d nochain,cpu,in_asm,int \
-gdb tcp::$tcpPort -S \ -gdb tcp::$tcpPort -S \
2>&1 >/dev/null | ./parseQemuToGDB.py | ./parseGDBtoTrace.py | ./remove_dup.awk > $traceFile) \ 2>&1 >/dev/null | ./parseQemuToGDB.py | ./parseGDBtoTrace.py $interruptsFile | ./remove_dup.awk > $traceFile) \
& riscv64-unknown-elf-gdb -quiet -x genTrace.gdb -ex "genTrace $tcpPort \"$imageDir/vmlinux\"" & riscv64-unknown-elf-gdb -quiet -x genTrace.gdb -ex "genTrace $tcpPort \"$imageDir/vmlinux\""
# Cleanup # Cleanup
sudo chown cad $recordFile sudo chown cad $recordFile
sudo chown cad $traceFile sudo chown cad $traceFile
sudo chown cad $interruptsFile
sudo chmod o-w $recordFile sudo chmod o-w $recordFile
sudo chmod o-w $traceFile sudo chmod o-w $traceFile
sudo chmod o-w $interruptsFile
fi fi

View File

@ -130,6 +130,13 @@ def PrintInstr(instr, fp):
fp.write(' CSR {}'.format(CSRStr)) fp.write(' CSR {}'.format(CSRStr))
fp.write('\n') fp.write('\n')
# =========
# Main Code
# =========
# Parse argument for interrupt file
if len(sys.argv) != 2:
sys.exit('Error parseGDBtoTrace.py expects 1 arg:\n <interrupt filename>>')
interruptFname = sys.argv[1]
# reg number # reg number
RegNumber = {'zero': 0, 'ra': 1, 'sp': 2, 'gp': 3, 'tp': 4, 't0': 5, 't1': 6, 't2': 7, 's0': 8, 's1': 9, 'a0': 10, 'a1': 11, 'a2': 12, 'a3': 13, 'a4': 14, 'a5': 15, 'a6': 16, 'a7': 17, 's2': 18, 's3': 19, 's4': 20, 's5': 21, 's6': 22, 's7': 23, 's8': 24, 's9': 25, 's10': 26, 's11': 27, 't3': 28, 't4': 29, 't5': 30, 't6': 31, 'mhartid': 32, 'mstatus': 33, 'mip': 34, 'mie': 35, 'mideleg': 36, 'medeleg': 37, 'mtvec': 38, 'stvec': 39, 'mepc': 40, 'sepc': 41, 'mcause': 42, 'scause': 43, 'mtval': 44, 'stval': 45} RegNumber = {'zero': 0, 'ra': 1, 'sp': 2, 'gp': 3, 'tp': 4, 't0': 5, 't1': 6, 't2': 7, 's0': 8, 's1': 9, 'a0': 10, 'a1': 11, 'a2': 12, 'a3': 13, 'a4': 14, 'a5': 15, 'a6': 16, 'a7': 17, 's2': 18, 's3': 19, 's4': 20, 's5': 21, 's6': 22, 's7': 23, 's8': 24, 's9': 25, 's10': 26, 's11': 27, 't3': 28, 't4': 29, 't5': 30, 't6': 31, 'mhartid': 32, 'mstatus': 33, 'mip': 34, 'mie': 35, 'mideleg': 36, 'medeleg': 37, 'mtvec': 38, 'stvec': 39, 'mepc': 40, 'sepc': 41, 'mcause': 42, 'scause': 43, 'mtval': 44, 'stval': 45}
# initial state # initial state
@ -144,14 +151,24 @@ numInstrs = 0
#instructions = [] #instructions = []
MemAdr = 0 MemAdr = 0
lines = [] lines = []
interrupts=open('interrupts.txt','w') interrupts=open(interruptFname,'w')
interrupts.close() interrupts.close()
for line in fileinput.input('-'): for line in fileinput.input('-'):
if line.startswith('riscv_cpu_do_interrupt'): if line.startswith('riscv_cpu_do_interrupt'):
with open('interrupts.txt','a') as interrupts: with open(interruptFname,'a') as interrupts:
interrupts.write(str(numInstrs)+': '+line.strip('riscv_cpu_do_interrupt')) # Write line
break # Example line: hart:0, async:0, cause:0000000000000002, epc:0x0000000080008548, tval:0x0000000000000000, desc=illegal_instruction
interrupts.write(line)
# Write instruction count
interrupts.write(str(numInstrs)+'\n')
# Convert line to rows of info for easier Verilog parsing
vals=line.strip('riscv_cpu_do_interrupt: ').strip('\n').split(',')
vals=[val.split(':')[-1].strip(' ') for val in vals]
vals=[val.split('=')[-1].strip(' ') for val in vals]
for val in vals:
interrupts.write(val+'\n')
continue
lines.insert(lineNum, line) lines.insert(lineNum, line)
if InstrStartDelim in line: if InstrStartDelim in line:
lineNum = 0 lineNum = 0
@ -204,8 +221,8 @@ for line in fileinput.input('-'):
#instructions.append(MoveInstrToRegWriteLst) #instructions.append(MoveInstrToRegWriteLst)
PrintInstr(MoveInstrToRegWriteLst, sys.stdout) PrintInstr(MoveInstrToRegWriteLst, sys.stdout)
numInstrs +=1 numInstrs +=1
if (numInstrs % 1e4 == 0): if (numInstrs % 1e5 == 0):
sys.stderr.write('Trace parser reached '+str(numInstrs/1.0e6)+' million instrs.\n') sys.stderr.write('GDB trace parser reached '+str(numInstrs/1.0e6)+' million instrs.\n')
sys.stderr.flush() sys.stderr.flush()
lineNum += 1 lineNum += 1

View File

@ -115,7 +115,6 @@ for l in fileinput.input():
if l.startswith('riscv_cpu_do_interrupt'): if l.startswith('riscv_cpu_do_interrupt'):
sys.stderr.write(l) sys.stderr.write(l)
interrupt_line = l.strip('\n') interrupt_line = l.strip('\n')
continue
elif l.startswith('qemu-system-riscv64: QEMU: Terminated via GDBstub'): elif l.startswith('qemu-system-riscv64: QEMU: Terminated via GDBstub'):
break break
elif l.startswith('IN:'): elif l.startswith('IN:'):

View File

@ -3,8 +3,18 @@
set CURRENT_DIR [exec pwd] set CURRENT_DIR [exec pwd]
set search_path [list "./" ] set search_path [list "./" ]
set s8lib ../addins/sky130_osu_sc_t12/12T_ms/lib set tech $::env(TECH)
lappend search_path $s8lib
set timing_lib $::env(RISCV)/cad/lib
lappend search_path $timing_lib
if {$tech == 130} {
set s8lib $timing_lib/sky130_osu_sc_t12/12T_ms/lib
lappend search_path $s8lib
} elseif {$tech == 90} {
set s9lib $timing_lib/sky90/tech_files
lappend search_path $s9lib
}
# Synthetic libraries # Synthetic libraries
set synthetic_library [list dw_foundation.sldb] set synthetic_library [list dw_foundation.sldb]
@ -12,7 +22,12 @@ set synthetic_library [list dw_foundation.sldb]
# Set OKSTATE standard cell libraries # Set OKSTATE standard cell libraries
set target_library [list] set target_library [list]
lappend target_library sky130_osu_sc_12T_ms_TT_1P8_25C.ccs.db #lappend target_library scc9gena_tt_1.2v_25C.db
if {$tech == 130} {
lappend target_library sky130_osu_sc_12T_ms_TT_1P8_25C.ccs.db
} elseif {$tech == 90} {
lappend target_library scc9gena_tt_1.2v_25C.db
}
# Set Link Library # Set Link Library
set link_library "$target_library $synthetic_library" set link_library "$target_library $synthetic_library"

View File

@ -3,7 +3,16 @@
# #
NAME := synth NAME := synth
VARIANT := 18T_ms # defaults
export DESIGN ?= wallypipelinedcore
export FREQ ?= 500
export CONFIG ?= rv32e
export TECH ?= 130
time := $(shell date +%F-%H-%M)
hash := $(shell git rev-parse --short HEAD)
export OUTPUTDIR := runs/$(DESIGN)_$(CONFIG)_$(TECH)nm_$(FREQ)_MHz_$(time)_$(hash)
export SAIFPOWER ?= 0
default: default:
@echo "Basic synthesis procedure for OSU/HMC/UNLV:" @echo "Basic synthesis procedure for OSU/HMC/UNLV:"
@ -11,24 +20,24 @@ default:
@echo @echo
synth: synth:
@sed -i 's/18T_ms/${VARIANT}/g' scripts/synth.tcl
@sed -i 's/18T_ms/${VARIANT}/g' .synopsys_dc.setup
@echo "DC Synthesis" @echo "DC Synthesis"
@mkdir -p reports @mkdir -p hdl/
@mkdir -p mapped @mkdir -p $(OUTPUTDIR)
dc_shell-xg-t -64bit -f scripts/$(NAME).tcl | tee $(NAME).out @mkdir -p $(OUTPUTDIR)/reports
# @cp mapped/*.sdc ../../outputs/ @mkdir -p $(OUTPUTDIR)/mapped
# @cp mapped/*.vh ../../outputs/ @mkdir -p $(OUTPUTDIR)/unmapped
# @sed -i 's/${VARIANT}/18T_ms/g' scripts/synth.tcl ifeq ($(SAIFPOWER), 1)
# @sed -i 's/${VARIANT}/18T_ms/g' .synopsys_dc.setup cp -f ../pipelined/regression/power.saif .
endif
dc_shell-xg-t -64bit -f scripts/$(NAME).tcl | tee $(OUTPUTDIR)/$(NAME).out
clean: clean:
rm -rf alib-52 WORK mapped unmapped reports analyzed $(NAME).out rm -rf alib-52 WORK analyzed $(NAME).out
mkdir mapped unmapped reports
rm -f hdl/* rm -f hdl/*
rm -f default.svf rm -f default.svf
rm -f command.log rm -f command.log
rm -f filenames*.log rm -f filenames*.log
rm -f power.saif

View File

@ -1,34 +1,40 @@
Synthesis for RISC-V Microprocessor System-on-Chip Design
This subdirectory contains synthesis scripts for use with Synopsys This subdirectory contains synthesis scripts for use with Synopsys
Design Compiler (DC). The scripts are separated into two distinct (snps) Design Compiler (DC). Synthesis commands are found in
sections: user and technology setups. The technology setup is found scripts/synth.tcl.
in .synopsys_dc.setup file. Key items within this technology setup
are the location of the PDK and standard cell libraries.
We are using the Skywater Technology 130nm process for the synthesis. Example Usage
The Oklahoma State University standard-cell libraries for this process make synth DESIGN=wallypipelinedcore FREQ=300
are located via the target_library keyword. There are currently three
versions of the standard-cell libraries available (see
http://stineje.github.io) for dowload locations. Currently, the TT 18
track OSU standard-cell library is utilized.
There are other useful elements within the technology setup file, as environment variables
well. These include user information as well as search path
information. Good tool flows usually rely on finding the right files DESIGN
correctly and having a search path set correctly is importantly. Design provides the name of the output log. Default is synth.
FREQ
Frequency in Mhz. Default is 500
CONFIG
The wally configuration file. Default is rv32e.
Examples.
rv32e
rv64gc
rv32gc
TECH
The target standard cell library. Default is 130.
90: skywater 90nm tt 25C.
130: skywater 130nm tt 25C.
SAIFPOWER
Controls if power analysis is driven by switching factor or RTL modelsim simulation.
When enabled requires a saif file named power.saif.
Default is 0.
0: switching factor power analysis
1: RTL simulation driven power analysis.
Libraries in .synopsys_dc.setup file
set s8lib $timing_lib/sky130_osu_sc_t12/12T_ms/lib
The user setup is found in two main areas. The scripts/ and hdl/
directories. The scripts directory contains a basic DC synthesis Tcl
script that is involved when synthesis is run. Please modify this
synth.tcl file to add information about PPA and information about your
design (e.g., top-level name, SV files). The SV is found within the
hdl/ subdirectory. Just put all your synthesis-friendly files in this
directory or allude to the correct location in the synthesis Tcl
script.
After synthesis completes, always check your synthesis log file that
will be called synth.log. Good tool flow starts and ends with
understanding what is happening during a specific part of the flow.
This can only be done through interpreting what the Electronic Design
Automation (EDA) tool is doing. So, always check this file for any
possible warnings or errors after completion. All output of synthesis
is found in the reports/ subdirectory.

View File

@ -1,22 +1,33 @@
# #
# Main Synopsys Flow # Synthesis Synopsys Flow
# james.stine@okstate.edu 26 Jan 2022 # james.stine@okstate.edu 27 Sep 2015
# #
# get outputDir from environment (Makefile)
set outputDir $::env(OUTPUTDIR)
set cfgName $::env(CONFIG)
# Config # Config
set hdl_src "../pipelined/src" set hdl_src "../pipelined/src"
set cfg "${hdl_src}/../config/${cfgName}/wally-config.vh"
set saifpower $::env(SAIFPOWER)
eval file copy -force ${hdl_src}/../config/rv32e/wally-config.vh {hdl/} eval file copy -force ${cfg} {hdl/}
eval file copy -force ${hdl_src}/../config/rv32e/wally-config.vh {reports/} eval file copy -force ${cfg} $outputDir
eval file copy -force [glob ${hdl_src}/../config/shared/*.vh] {hdl/} eval file copy -force [glob ${hdl_src}/../config/shared/*.vh] {hdl/}
eval file copy -force [glob ${hdl_src}/*/*.sv] {hdl/} eval file copy -force [glob ${hdl_src}/*/*.sv] {hdl/}
eval file copy -force [glob ${hdl_src}/*/flop/*.sv] {hdl/} eval file copy -force [glob ${hdl_src}/*/flop/*.sv] {hdl/}
# Enables name mapping
if { $saifpower == 1 } {
saif_map -start
}
# Verilog files # Verilog files
set my_verilog_files [glob hdl/*] set my_verilog_files [glob hdl/*]
# Set toplevel # Set toplevel
set my_toplevel wallypipelinedcore set my_toplevel $::env(DESIGN)
# Set number of significant digits # Set number of significant digits
set report_default_significant_digits 6 set report_default_significant_digits 6
@ -25,7 +36,6 @@ set report_default_significant_digits 6
set verilogout_show_unconnected_pins "true" set verilogout_show_unconnected_pins "true"
set vhdlout_show_unconnected_pins "true" set vhdlout_show_unconnected_pins "true"
#
# Due to parameterized Verilog must use analyze/elaborate and not # Due to parameterized Verilog must use analyze/elaborate and not
# read_verilog/vhdl (change to pull in Verilog and/or VHDL) # read_verilog/vhdl (change to pull in Verilog and/or VHDL)
# #
@ -45,11 +55,20 @@ link
# Reset all constraints # Reset all constraints
reset_design reset_design
# Power Dissipation Analysis
######### OPTIONAL !!!!!!!!!!!!!!!!
if { $saifpower == 1 } {
read_saif -input power.saif -instance_name testbench/dut/core -auto_map_names -verbose
}
# Set reset false path
set_false_path -from [get_ports reset]
# Set Frequency in [MHz] or [ps] # Set Frequency in [MHz] or [ps]
set my_clock_pin clk set my_clock_pin clk
set my_clk_freq_MHz 500 set my_uncertainty 0.0
set my_period [expr 1000 / $my_clk_freq_MHz] set my_clk_freq_MHz $::env(FREQ)
set my_uncertainty [expr .1 * $my_period] set my_period [expr 1000.0 / $my_clk_freq_MHz]
# Create clock object # Create clock object
set find_clock [ find port [list $my_clock_pin] ] set find_clock [ find port [list $my_clock_pin] ]
@ -65,25 +84,33 @@ if { $find_clock != [list] } {
} }
# Partitioning - flatten or hierarchically synthesize # Partitioning - flatten or hierarchically synthesize
#ungroup -flatten -simple_names { dp* } # ungroup -all -flatten -simple_names
#ungroup -flatten -simple_names { c* }
#ungroup -all -flatten -simple_names
# Set input pins except clock # Set input pins except clock
set all_in_ex_clk [remove_from_collection [all_inputs] [get_ports $my_clk]] set all_in_ex_clk [remove_from_collection [all_inputs] [get_ports $my_clk]]
# Specifies delays be propagated through the clock network # Specifies delays be propagated through the clock network
set_propagated_clock [get_clocks $my_clk] # set_propagated_clock [get_clocks $my_clk]
# Setting constraints on input ports # Setting constraints on input ports
set_driving_cell -lib_cell sky130_osu_sc_12T_ms__dff_1 -pin Q $all_in_ex_clk #set_driving_cell -lib_cell scc9gena_dfxbp_1 -pin Q $all_in_ex_clk
if {$tech == "130"} {
set_driving_cell -lib_cell sky130_osu_sc_12T_ms__dff_1 -pin Q $all_in_ex_clk
} elseif {$tech == "90"} {
set_driving_cell -lib_cell scc9gena_dfxbp_1 -pin Q $all_in_ex_clk
}
# Set input/output delay # Set input/output delay
set_input_delay 0.0 -max -clock $my_clk $all_in_ex_clk set_input_delay 0.0 -max -clock $my_clk $all_in_ex_clk
set_output_delay 0.0 -max -clock $my_clk [all_outputs] set_output_delay 0.0 -max -clock $my_clk [all_outputs]
# Setting load constraint on output ports # Setting load constraint on output ports
set_load [expr [load_of sky130_osu_sc_12T_ms_TT_1P8_25C.ccs/sky130_osu_sc_12T_ms__dff_1/D] * 1] [all_outputs] #set_load [expr [load_of scc9gena_tt_1.2v_25C/scc9gena_dfxbp_1/D] * 1] [all_outputs]
if {$tech == "130"} {
set_load [expr [load_of sky130_osu_sc_12T_ms_TT_1P8_25C.ccs/sky130_osu_sc_12T_ms__dff_1/D] * 1] [all_outputs]
} elseif {$tech == "90"} {
set_load [expr [load_of scc9gena_tt_1.2v_25C/scc9gena_dfxbp_1/D] * 1] [all_outputs]
}
# Set the wire load model # Set the wire load model
set_wire_load_mode "top" set_wire_load_mode "top"
@ -95,22 +122,21 @@ set_wire_load_mode "top"
set_max_fanout 6 $all_in_ex_clk set_max_fanout 6 $all_in_ex_clk
# Fix hold time violations # Fix hold time violations
set_fix_hold [all_clocks] #set_fix_hold [all_clocks]
# Deal with constants and buffers to isolate ports # Deal with constants and buffers to isolate ports
set_fix_multiple_port_nets -all -buffer_constants set_fix_multiple_port_nets -all -buffer_constants
# setting up the group paths to find out the required timings # setting up the group paths to find out the required timings
#group_path -name OUTPUTS -to [all_outputs] # group_path -name OUTPUTS -to [all_outputs]
#group_path -name INPUTS -from [all_inputs] # group_path -name INPUTS -from [all_inputs]
#group_path -name COMBO -from [all_inputs] -to [all_outputs] # group_path -name COMBO -from [all_inputs] -to [all_outputs]
# Save Unmapped Design # Save Unmapped Design
set filename [format "%s%s%s" "unmapped/" $my_toplevel ".ddc"] set filename [format "%s%s%s%s" $outputDir "/unmapped/" $my_toplevel ".ddc"]
write_file -format ddc -hierarchy -o $filename write_file -format ddc -hierarchy -o $filename
# Compile statements - either compile or compile_ultra # Compile statements
# compile -scan -incr -map_effort low
compile_ultra -no_seq_output_inversion -no_boundary_optimization compile_ultra -no_seq_output_inversion -no_boundary_optimization
# Eliminate need for assign statements (yuck!) # Eliminate need for assign statements (yuck!)
@ -128,57 +154,187 @@ set write_cst 1 ;# generate report of constraints
set write_hier 1 ;# generate hierarchy report set write_hier 1 ;# generate hierarchy report
# Report Constraint Violators # Report Constraint Violators
set filename [format "%s%s%s" "reports/" $my_toplevel "_constraint_all_violators.rpt"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_constraint_all_violators.rpt"]
redirect $filename {report_constraint -all_violators} redirect $filename {report_constraint -all_violators}
# Check design # Check design
redirect reports/check_design.rpt { check_design } redirect $outputDir/reports/check_design.rpt { check_design }
# Report Final Netlist (Hierarchical) # Report Final Netlist (Hierarchical)
set filename [format "%s%s%s" "mapped/" $my_toplevel ".vh"] set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_toplevel ".vh"]
write_file -f verilog -hierarchy -output $filename write_file -f verilog -hierarchy -output $filename
set filename [format "%s%s%s" "mapped/" $my_toplevel ".sdc"] set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_toplevel ".sdc"]
write_sdc $filename write_sdc $filename
set filename [format "%s%s%s" "mapped/" $my_toplevel ".ddc"] set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_toplevel ".ddc"]
write_file -format ddc -hierarchy -o $filename write_file -format ddc -hierarchy -o $filename
set filename [format "%s%s%s" "mapped/" $my_toplevel ".sdf"] set filename [format "%s%s%s%s" $outputDir "/mapped/" $my_toplevel ".sdf"]
write_sdf $filename write_sdf $filename
# QoR # QoR
set filename [format "%s%s%s" "reports/" $my_toplevel "_qor.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_qor.rep"]
redirect $filename { report_qor } redirect $filename { report_qor }
# Report Timing # Report Timing
set filename [format "%s%s%s" "reports/" $my_toplevel "_reportpath.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_reportpath.rep"]
redirect $filename { report_path_group } redirect $filename { report_path_group }
set filename [format "%s%s%s" "reports/" $my_toplevel "_report_clock.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_report_clock.rep"]
redirect $filename { report_clock } redirect $filename { report_clock }
set filename [format "%s%s%s" "reports/" $my_toplevel "_timing.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_timing.rep"]
redirect $filename { report_timing -capacitance -transition_time -nets -nworst 1 } redirect $filename { report_timing -capacitance -transition_time -nets -nworst 1 }
set filename [format "%s%s%s" "reports/" $my_toplevel "_min_timing.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_per_module_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through ifu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through ieu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through lsu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {lsu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through ebu (ahblite) ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ebu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through mdu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through hzu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {hzu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through priv ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {priv/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fpu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/*} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_mdu_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through entire mdu ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through multiply unit ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.mul/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through redundant multiplier ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.mul/bigmul/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through ProdM (mul output) ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.ProdM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through PP0E (mul partial product) ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.mul/PP0E} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through divide unit ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.div/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through QuotM (div output) ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.QuotM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through RemM (div output) ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.RemM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through div/WNextE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.div/WNextE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through div/XQNextE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.div/XQNextE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through div/DAbsBE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {mdu/genblk1.div/DAbsBE} -nworst 1 }
# set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_fpu_timing.rep"]
# redirect $filename { echo "\n\n\n//////////////// Critical paths through fma ////////////////\n\n\n" }
# redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fma/*} -nworst 1 }
# redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fpdiv ////////////////\n\n\n" }
# redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fdivsqrt/*} -nworst 1 }
# redirect -append $filename { echo "\n\n\n//////////////// Critical paths through faddcvt ////////////////\n\n\n" }
# redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.faddcvt/*} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_ifu_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical path through PCF ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/PCF} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through PCNextF ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/PCNextF} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through FinalInstrRawF ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/FinalInstrRawF} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through InstrD ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/decomp/InstrD} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_stall_flush_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical path through StallD ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/StallD} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through StallE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/StallE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through StallM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/StallM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through StallW ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/StallW} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through FlushD ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/FlushD} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through FlushE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/FlushE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through FlushM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/FlushM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through FlushW ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/FlushW} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_ieu_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/RD1D ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/RD1D} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/RD2D ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/RD2D} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/PreSrcAE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/PreSrcAE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/SrcAE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/SrcAE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/ALUResultE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/ALUResultE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/WriteDataE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/WriteDataE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through dataphath/ResultM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/ResultM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/WriteDataW ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/WriteDataW} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical path through datapath/ReadDataM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ieu/dp/ReadDataM} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_fpu_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fma ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fma/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fpdiv ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fdivsqrt/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through faddcvt ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.faddcvt/*} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through FMAResM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.FMAResM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through FDivResM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.FDivResM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through FResE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.FResE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fma/SumE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fma/SumE} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through fma/ProdExpE ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {fpu/fpu.fma/ProdExpE} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_mmu_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through immu/physicaladdress ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {ifu/immu/PhysicalAddress} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through dmmu/physicaladdress ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {lsu/dmmu/PhysicalAddress} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_priv_timing.rep"]
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through priv/TrapM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {priv/TrapM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through priv/CSRReadValM ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {priv/csr/CSRReadValM} -nworst 1 }
redirect -append $filename { echo "\n\n\n//////////////// Critical paths through priv/CSRReadValW ////////////////\n\n\n" }
redirect -append $filename { report_timing -capacitance -transition_time -nets -through {priv/CSRReadValW} -nworst 1 }
set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_min_timing.rep"]
redirect $filename { report_timing -delay min } redirect $filename { report_timing -delay min }
set filename [format "%s%s%s" "reports/" $my_toplevel "_area.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_area.rep"]
redirect $filename { report_area -hierarchy -nosplit -physical -designware} redirect $filename { report_area -hierarchy -nosplit -physical -designware}
set filename [format "%s%s%s" "reports/" $my_toplevel "_cell.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_cell.rep"]
redirect $filename { report_cell [get_cells -hier *] } redirect $filename { report_cell [get_cells -hier *] }
set filename [format "%s%s%s" "reports/" $my_toplevel "_power.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_power.rep"]
redirect $filename { report_power } redirect $filename { report_power -hierarchy -levels 1 }
set filename [format "%s%s%s" "reports/" $my_toplevel "_constraint.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_constraint.rep"]
redirect $filename { report_constraint } redirect $filename { report_constraint }
set filename [format "%s%s%s" "reports/" $my_toplevel "_hier.rep"] set filename [format "%s%s%s%s" $outputDir "/reports/" $my_toplevel "_hier.rep"]
redirect $filename { report_hierarchy } redirect $filename { report_hierarchy }
# Quit #Quit
quit #quit