mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of github.com:davidharrishmc/riscv-wally into main
This commit is contained in:
commit
459cd3c450
9
.gitignore
vendored
9
.gitignore
vendored
@ -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
|
||||||
|
@ -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>;
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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:'):
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user