mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-02 09:45:18 +00:00
fixed setup.sh merge conflict
This commit is contained in:
commit
582b943380
@ -1,53 +0,0 @@
|
||||
From f9882bd274bde82d8c38a9c31692b6ee33d8cd9a Mon Sep 17 00:00:00 2001
|
||||
From: root <root@tera.eng.hmc.edu>
|
||||
Date: Mon, 28 Feb 2022 22:48:29 +0000
|
||||
Subject: [PATCH] bens hack to turn on logging mid-execution using GDB
|
||||
|
||||
---
|
||||
gdbstub.c | 23 +++++++++++++++++++++++
|
||||
1 file changed, 23 insertions(+)
|
||||
|
||||
diff --git a/gdbstub.c b/gdbstub.c
|
||||
index 141d7bc4ec..98ecce1b67 100644
|
||||
--- a/gdbstub.c
|
||||
+++ b/gdbstub.c
|
||||
@@ -2317,6 +2317,23 @@ static void handle_set_qemu_phy_mem_mode(GArray *params, void *user_ctx)
|
||||
}
|
||||
put_packet("OK");
|
||||
}
|
||||
+
|
||||
+static void handle_set_qemu_logging(GArray *params, void *user_ctx)
|
||||
+{
|
||||
+ if (!params->len) {
|
||||
+ put_packet("E22");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ int log_mask;
|
||||
+ if (!get_param(params, 0)->val_ul) {
|
||||
+ log_mask = 0;
|
||||
+ } else {
|
||||
+ log_mask = CPU_LOG_TB_IN_ASM | CPU_LOG_INT | CPU_LOG_TB_CPU | CPU_LOG_TB_NOCHAIN;
|
||||
+ }
|
||||
+ qemu_set_log(log_mask);
|
||||
+ put_packet("OK");
|
||||
+}
|
||||
#endif
|
||||
|
||||
static const GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
|
||||
@@ -2430,6 +2447,12 @@ static const GdbCmdParseEntry gdb_gen_set_table[] = {
|
||||
.cmd_startswith = 1,
|
||||
.schema = "l0"
|
||||
},
|
||||
+ {
|
||||
+ .handler = handle_set_qemu_logging,
|
||||
+ .cmd = "qemu.Logging:",
|
||||
+ .cmd_startswith = 1,
|
||||
+ .schema = "l0"
|
||||
+ },
|
||||
#endif
|
||||
};
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,17 +1,13 @@
|
||||
SHELL = /bin/sh
|
||||
|
||||
CFLAG = -Wall -g
|
||||
CC = clang
|
||||
CC = gcc
|
||||
|
||||
all: fixBinMem silencePipe
|
||||
all: fixBinMem
|
||||
|
||||
fixBinMem: fixBinMem.c
|
||||
${CC} ${CFLAGS} fixBinMem.c -o fixBinMem
|
||||
chmod +x fixBinMem
|
||||
|
||||
silencePipe: silencePipe.c
|
||||
${CC} ${CFLAGS} silencePipe.c -o silencePipe
|
||||
chmod +x silencePipe
|
||||
clean:
|
||||
-rm -f fixBinMem
|
||||
-rm -f silencePipe
|
||||
|
@ -1,5 +1,5 @@
|
||||
for index in {450..500}
|
||||
do
|
||||
instrs=$(($index*1000000))
|
||||
echo "y" | nice -n 5 ./genCheckpoint.sh $instrs 0
|
||||
echo "y" | nice -n 5 ./genCheckpoint.sh $instrs
|
||||
done
|
||||
|
@ -1,78 +0,0 @@
|
||||
#! /usr/bin/python3
|
||||
import sys
|
||||
|
||||
if len(sys.argv) != 9:
|
||||
sys.exit("""Error createGenCheckpointScript.py expects 7 args:
|
||||
<TCP port number>
|
||||
<path to vmlinux>
|
||||
<checkpoint instruction count>
|
||||
<path to GDB checkpoint state dump>
|
||||
<path to GDB ram dump>
|
||||
<checkpoint pc address>
|
||||
<number of times pc has already been hit before checkpoint>
|
||||
<whether to generate a trace after hitting checkpoint>""")
|
||||
|
||||
tcpPort=sys.argv[1]
|
||||
vmlinux=sys.argv[2]
|
||||
instrCount=sys.argv[3]
|
||||
statePath=sys.argv[4]
|
||||
ramPath=sys.argv[5]
|
||||
checkPC=sys.argv[6]
|
||||
checkPCoccurences=sys.argv[7]
|
||||
genTrace=sys.argv[8]
|
||||
|
||||
GDBscript = f"""
|
||||
# GDB config
|
||||
set pagination off
|
||||
set logging overwrite on
|
||||
set logging redirect on
|
||||
set confirm off
|
||||
|
||||
# Connect to QEMU session
|
||||
target extended-remote :{tcpPort}
|
||||
|
||||
# QEMU Config
|
||||
maintenance packet Qqemu.PhyMemMode:1
|
||||
|
||||
# Symbol file
|
||||
file {vmlinux}
|
||||
|
||||
# Step over reset vector into actual code
|
||||
stepi 100
|
||||
# Proceed to checkpoint
|
||||
print "GDB proceeding to checkpoint at {instrCount} instrs, pc {checkPC}\\n"
|
||||
b *0x{checkPC}
|
||||
ignore 1 {checkPCoccurences}
|
||||
c
|
||||
print "Reached checkpoint at {instrCount} instrs\\n"
|
||||
|
||||
# Log all registers to a file
|
||||
printf "GDB storing state to {statePath}\\n"
|
||||
set logging file {statePath}
|
||||
set logging on
|
||||
info all-registers
|
||||
set logging off
|
||||
|
||||
# Log main memory to a file
|
||||
print "GDB storing RAM to {ramPath}\\n"
|
||||
dump binary memory {ramPath} 0x80000000 0xffffffff
|
||||
"""
|
||||
if (genTrace=="1"):
|
||||
GDBscript+=\
|
||||
"""
|
||||
# Generate Trace Until End
|
||||
maintenance packet Qqemu.Logging:1
|
||||
# Do this by setting an impossible breakpoint
|
||||
b *0x1000
|
||||
del 1
|
||||
c
|
||||
"""
|
||||
else:
|
||||
GDBscript+=\
|
||||
"""
|
||||
kill
|
||||
q
|
||||
"""
|
||||
GDBscriptFile = open("genCheckpoint.gdb",'w')
|
||||
GDBscriptFile.write(GDBscript)
|
||||
GDBscriptFile.close()
|
21
linux/testvector-generation/debug.sh
Executable file
21
linux/testvector-generation/debug.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
imageDir=$RISCV/buildroot/output/images
|
||||
tvDir=$RISCV/linux-testvectors
|
||||
tcpPort=1239
|
||||
|
||||
# QEMU Simulation
|
||||
(qemu-system-riscv64 \
|
||||
-M virt -dtb $imageDir/wally-virt.dtb \
|
||||
-nographic \
|
||||
-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 \
|
||||
> ./qemu-serial \
|
||||
-gdb tcp::$tcpPort -S) \
|
||||
& riscv64-unknown-elf-gdb -quiet \
|
||||
-ex "set pagination off" \
|
||||
-ex "set logging overwrite on" \
|
||||
-ex "set logging redirect on" \
|
||||
-ex "set confirm off" \
|
||||
-ex "target extended-remote :$tcpPort" \
|
||||
-ex "maintenance packet Qqemu.PhyMemMode:1" \
|
||||
-ex "file $imageDir/vmlinux"
|
@ -6,12 +6,11 @@ recordFile="$tvDir/all.qemu"
|
||||
traceFile="$tvDir/all.txt"
|
||||
|
||||
# Parse Commandline Arg
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "genCheckpoint requires 2 arguments: <num instrs> <whether to genTrace>" >&2
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "genCheckpoint requires 1 argument: <num instrs>" >&2
|
||||
exit 1
|
||||
fi
|
||||
instrs=$1
|
||||
genTrace=$2
|
||||
if ! [ "$instrs" -eq "$instrs" ] 2> /dev/null
|
||||
then
|
||||
echo "Error expected integer number of instructions, got $instrs" >&2
|
||||
@ -20,39 +19,35 @@ fi
|
||||
|
||||
checkPtDir="$tvDir/checkpoint$instrs"
|
||||
outTraceFile="$checkPtDir/all.txt"
|
||||
interruptsFile="$checkPtDir/interrupts.txt"
|
||||
rawStateFile="$checkPtDir/stateGDB.txt"
|
||||
rawUartStateFile="$checkPtDir/uartStateGDB.txt"
|
||||
uartStateFile="$checkPtDir/checkpoint-UART"
|
||||
rawPlicStateFile="$checkPtDir/plicStateGDB.txt"
|
||||
plicStateFile="$checkPtDir/checkpoint-PLIC"
|
||||
rawRamFile="$checkPtDir/ramGDB.bin"
|
||||
ramFile="$checkPtDir/ram.bin"
|
||||
|
||||
if [ $genTrace -eq "1" ]; then
|
||||
read -p "This scripts is going to create a checkpoint at $instrs instrs.
|
||||
AND it's going to start generating a trace at that checkpoint.
|
||||
Is that what you wanted? (y/n) " -n 1 -r
|
||||
else
|
||||
read -p "This scripts is going to create a checkpoint at $instrs instrs.
|
||||
Is that what you wanted? (y/n) " -n 1 -r
|
||||
fi
|
||||
read -p "This scripts is going to create a checkpoint at $instrs instrs.
|
||||
Is that what you wanted? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
then
|
||||
echo "Creating checkpoint at $instrs instructions!"
|
||||
if [ ! -d "$tvDir" ]; then
|
||||
echo "Error: linux testvector directory $tvDir not found!">&2
|
||||
echo "Please create it. For example:">&2
|
||||
echo " sudo mkdir -p $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
test -w $tvDir
|
||||
if [ ! $? -eq 0 ]; then
|
||||
echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2
|
||||
echo "Please chmod it. For example:">&2
|
||||
echo " sudo chmod -R a+rw $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create Output Directory
|
||||
echo "Elevating permissions to create $checkPtDir and stuff inside it"
|
||||
sudo mkdir -p $checkPtDir
|
||||
sudo chown -R cad:users $checkPtDir
|
||||
sudo chmod -R a+rw $checkPtDir
|
||||
sudo touch $outTraceFile
|
||||
sudo chmod a+rw $outTraceFile
|
||||
sudo touch $interruptsFile
|
||||
sudo chmod a+rw $interruptsFile
|
||||
sudo touch $rawStateFile
|
||||
sudo chmod a+rw $rawStateFile
|
||||
sudo touch $rawRamFile
|
||||
sudo chmod a+rw $rawRamFile
|
||||
sudo touch $ramFile
|
||||
sudo chmod a+rw $ramFile
|
||||
mkdir -p $checkPtDir
|
||||
|
||||
# Identify instruction in trace
|
||||
instr=$(sed "${instrs}q;d" "$traceFile")
|
||||
@ -63,7 +58,60 @@ then
|
||||
echo "It occurs ${occurences} times before the ${instrs}th instr."
|
||||
|
||||
# Create GDB script because GDB is terrible at handling arguments / variables
|
||||
./createGenCheckpointScript.py $tcpPort $imageDir/vmlinux $instrs $rawStateFile $rawRamFile $pc $occurences $genTrace
|
||||
cat > genCheckpoint.gdb <<- end_of_script
|
||||
set pagination off
|
||||
set logging overwrite on
|
||||
set logging redirect on
|
||||
set confirm off
|
||||
target extended-remote :$tcpPort
|
||||
maintenance packet Qqemu.PhyMemMode:1
|
||||
file $imageDir/vmlinux
|
||||
# Step over reset vector into actual code
|
||||
stepi 100
|
||||
shell echo \"GDB proceeding to checkpoint at $instrs instrs, pc $pc\"
|
||||
b *0x$pc
|
||||
ignore 1 $occurences
|
||||
c
|
||||
shell echo \"Reached checkpoint at $instrs instrs\"
|
||||
shell echo \"GDB storing CPU state to $rawStateFile\"
|
||||
set logging file $rawStateFile
|
||||
set logging on
|
||||
info all-registers
|
||||
set logging off
|
||||
shell echo \"GDB storing UART state to $rawUartStateFile\"
|
||||
# Save value of LCR
|
||||
set \$LCR=*0x10000003 & 0xff
|
||||
set logging file $rawUartStateFile
|
||||
set logging on
|
||||
# Change LCR to set DLAB=0 to be able to read RBR and IER
|
||||
set {char}0x10000003 &= ~0x80
|
||||
x/1xb 0x10000000
|
||||
x/1xb 0x10000001
|
||||
x/1xb 0x10000002
|
||||
# But log original value of LCR
|
||||
printf "0x10000003:\t0x%02x\n", \$LCR
|
||||
x/1xb 0x10000004
|
||||
x/1xb 0x10000005
|
||||
x/1xb 0x10000006
|
||||
x/1xb 0x10000007
|
||||
set logging off
|
||||
shell echo \"GDB storing PLIC state to $rawPlicStateFile\"
|
||||
shell echo \"Note: this dumping assumes a maximum of 63 PLIC sources\"
|
||||
set logging file $rawPlicStateFile
|
||||
set logging on
|
||||
# Priority Levels for sources 1 thru 63
|
||||
x/63xw 0x0C000004
|
||||
# Interrupt Enables
|
||||
x/2xw 0x0C020000
|
||||
# Global Priority Threshold
|
||||
x/1xw 0x0C200000
|
||||
set logging off
|
||||
shell echo \"GDB storing RAM to $rawRamFile\"
|
||||
dump binary memory $rawRamFile 0x80000000 0xffffffff
|
||||
kill
|
||||
q
|
||||
end_of_script
|
||||
|
||||
# GDB+QEMU
|
||||
echo "Starting QEMU in replay mode with attached GDB script at $(date +%H:%M:%S)"
|
||||
(qemu-system-riscv64 \
|
||||
@ -72,24 +120,25 @@ then
|
||||
-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=replay,rrfile=$recordFile \
|
||||
-gdb tcp::$tcpPort -S \
|
||||
2>&1 1>./qemu-serial | ./parseQEMUtoGDB/parseQEMUtoGDB_run.py | ./parseGDBtoTrace/parseGDBtoTrace_run.py $interruptsFile | ./remove_dup.awk > $outTraceFile) \
|
||||
& riscv64-unknown-elf-gdb --quiet -ex "source genCheckpoint.gdb"
|
||||
1>./qemu-serial) \
|
||||
& riscv64-unknown-elf-gdb --quiet -x genCheckpoint.gdb
|
||||
|
||||
echo "Completed GDB script at $(date +%H:%M:%S)"
|
||||
|
||||
# Post-Process GDB outputs
|
||||
./parseState.py "$checkPtDir"
|
||||
./parseUartState.py "$checkPtDir"
|
||||
./parsePlicState.py "$checkPtDir"
|
||||
echo "Changing Endianness at $(date +%H:%M:%S)"
|
||||
make fixBinMem
|
||||
./fixBinMem "$rawRamFile" "$ramFile"
|
||||
if [ $genTrace -ne "1" ]; then
|
||||
echo "Copying over a truncated trace"
|
||||
tail -n+$instrs $traceFile > $outTraceFile
|
||||
fi
|
||||
read -p "Checkpoint completed at $(date +%H:%M:%S)" -n 1 -r
|
||||
|
||||
# Cleanup
|
||||
echo "Elevating permissions to restrict write access to $checkPtDir"
|
||||
sudo chown -R cad:users $checkPtDir
|
||||
sudo chmod -R go-w $checkPtDir
|
||||
echo "Checkpoint completed at $(date +%H:%M:%S)"
|
||||
echo "You may want to restrict write access to $tvDir now and give cad ownership of it."
|
||||
echo "Run the following:"
|
||||
echo " sudo chown -R cad:cad $tvDir"
|
||||
echo " sudo chmod -R go-w $tvDir"
|
||||
fi
|
||||
|
||||
|
@ -22,13 +22,15 @@ if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
then
|
||||
if [ ! -d "$tvDir" ]; then
|
||||
echo "Error: linux testvector directory $tvDir not found!">&2
|
||||
echo "Please create it.">&2
|
||||
echo "Please create it. For example:">&2
|
||||
echo " sudo mkdir -p $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
test -w $RISCV/linux-testvectors
|
||||
test -w $tvDir
|
||||
if [ ! $? -eq 0 ]; then
|
||||
echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2
|
||||
echo "Please chmod it.">&2
|
||||
echo "Please chmod it. For example:">&2
|
||||
echo " sudo chmod -R a+rw $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@ -62,5 +64,8 @@ then
|
||||
./fixBinMem "$rawUntrimmedBootmemFile" "$untrimmedBootmemFile"
|
||||
|
||||
echo "genInitMem.sh completed!"
|
||||
echo "You may consider restricting write access to $tvDir now."
|
||||
echo "You may want to restrict write access to $tvDir now and give cad ownership of it."
|
||||
echo "Run the following:"
|
||||
echo " sudo chown -R cad:cad $tvDir"
|
||||
echo " sudo chmod -R go-w $tvDir"
|
||||
fi
|
||||
|
@ -8,26 +8,30 @@ Would you like to proceed? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
then
|
||||
# Create Output Directory
|
||||
echo "Elevating permissions to create $recordFile"
|
||||
sudo mkdir -p $tvDir
|
||||
sudo chown cad $tvDir
|
||||
sudo touch $recordFile
|
||||
sudo chmod a+rw $recordFile
|
||||
if [ ! -d "$tvDir" ]; then
|
||||
echo "Error: linux testvector directory $tvDir not found!">&2
|
||||
echo "Please create it. For example:">&2
|
||||
echo " sudo mkdir -p $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
test -w $tvDir
|
||||
if [ ! $? -eq 0 ]; then
|
||||
echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2
|
||||
echo "Please chmod it. For example:">&2
|
||||
echo " sudo chmod -R a+rw $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Compile Devicetree from Source
|
||||
dtc -I dts -O dtb ../devicetree/wally-virt.dts > ../devicetree/wally-virt.dtb
|
||||
|
||||
# QEMU Simulation
|
||||
echo "Launching QEMU!"
|
||||
echo "Launching QEMU in record mode!"
|
||||
qemu-system-riscv64 \
|
||||
-M virt -dtb ../devicetree/wally-virt.dtb \
|
||||
-M virt -dtb $imageDir/wally-virt.dtb \
|
||||
-nographic \
|
||||
-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
|
||||
|
||||
# Cleanup
|
||||
echo "Elevating permissions to restrict write access to $recordFile"
|
||||
sudo chown cad $recordFile
|
||||
sudo chmod o-w $recordFile
|
||||
echo "genRecording.sh completed!"
|
||||
echo "You may want to restrict write access to $tvDir now and give cad ownership of it."
|
||||
echo "Run the following:"
|
||||
echo " sudo chown -R cad:cad $tvDir"
|
||||
echo " sudo chmod -R go-w $tvDir"
|
||||
fi
|
||||
|
@ -13,32 +13,36 @@ Would you like to proceed? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
then
|
||||
# Create Output Directory
|
||||
echo "Elevating permissions to create $traceFile, $interruptsFile"
|
||||
sudo mkdir -p $tvDir
|
||||
sudo chown cad $tvDir
|
||||
sudo touch $traceFile
|
||||
sudo touch $interruptsFile
|
||||
sudo chmod a+rw $traceFile
|
||||
sudo chmod a+rw $interruptsFile
|
||||
if [ ! -d "$tvDir" ]; then
|
||||
echo "Error: linux testvector directory $tvDir not found!">&2
|
||||
echo "Please create it. For example:">&2
|
||||
echo " sudo mkdir -p $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
test -w $tvDir
|
||||
if [ ! $? -eq 0 ]; then
|
||||
echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2
|
||||
echo "Please chmod it. For example:">&2
|
||||
echo " sudo chmod -R a+rw $tvDir">&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Compile Devicetree from Source
|
||||
dtc -I dts -O dtb ../devicetree/wally-virt.dts > ../devicetree/wally-virt.dtb
|
||||
touch $traceFile
|
||||
touch $interruptsFile
|
||||
|
||||
# QEMU Simulation
|
||||
echo "Launching QEMU in replay mode!"
|
||||
(qemu-system-riscv64 \
|
||||
-M virt -dtb ../devicetree/wally-virt.dtb \
|
||||
-M virt -dtb $imageDir/wally-virt.dtb \
|
||||
-nographic \
|
||||
-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=replay,rrfile=$recordFile \
|
||||
-d nochain,cpu,in_asm,int \
|
||||
2>&1 >/dev/null | ./parseQEMUtoGDB.py | ./parseGDBtoTrace.py $interruptsFile | ./remove_dup.awk > $traceFile)
|
||||
2>&1 >./qemu-serial | ./parseQEMUtoGDB.py | ./parseGDBtoTrace.py $interruptsFile | ./remove_dup.awk > $traceFile)
|
||||
|
||||
# Cleanup
|
||||
echo "Elevating permissions to restrict write access to $traceFile, $interruptsFile"
|
||||
sudo chown cad $traceFile
|
||||
sudo chown cad $interruptsFile
|
||||
sudo chmod o-w $traceFile
|
||||
sudo chmod o-w $interruptsFile
|
||||
echo "genTrace.sh completed!"
|
||||
echo "You may want to restrict write access to $tvDir now and give cad ownership of it."
|
||||
echo "Run the following:"
|
||||
echo " sudo chown -R cad:cad $tvDir"
|
||||
echo " sudo chmod -R go-w $tvDir"
|
||||
fi
|
||||
|
95
linux/testvector-generation/parsePlicState.py
Executable file
95
linux/testvector-generation/parsePlicState.py
Executable file
@ -0,0 +1,95 @@
|
||||
#! /usr/bin/python3
|
||||
import sys, os
|
||||
|
||||
################
|
||||
# Helper Funcs #
|
||||
################
|
||||
|
||||
def tokenize(string):
|
||||
tokens = []
|
||||
token = ''
|
||||
whitespace = 0
|
||||
prevWhitespace = 0
|
||||
for char in string:
|
||||
prevWhitespace = whitespace
|
||||
whitespace = char in ' \t\n'
|
||||
if (whitespace):
|
||||
if ((not prevWhitespace) and (token != '')):
|
||||
tokens.append(token)
|
||||
token = ''
|
||||
else:
|
||||
token = token + char
|
||||
return tokens
|
||||
|
||||
def stripZeroes(num):
|
||||
num = num.strip('0')
|
||||
if num=='':
|
||||
return '0'
|
||||
else:
|
||||
return num
|
||||
|
||||
#############
|
||||
# Main Code #
|
||||
#############
|
||||
print("Begin parsing PLIC state.")
|
||||
|
||||
# Parse Args
|
||||
if len(sys.argv) != 2:
|
||||
sys.exit('Error parsePlicState.py expects 1 arg: <path_to_checkpoint_dir>')
|
||||
outDir = sys.argv[1]+'/'
|
||||
rawPlicStateFile = outDir+'plicStateGDB.txt'
|
||||
if not os.path.exists(rawPlicStateFile):
|
||||
sys.exit('Error input file '+rawPlicStateFile+'not found')
|
||||
|
||||
with open(rawPlicStateFile, 'r') as rawPlicStateFile:
|
||||
plicIntPriorityArray=[]
|
||||
# 0x0C000004 thru 0x0C000010
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000014 thru 0x0C000020
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000024 thru 0x0C000030
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000034 thru 0x0C000040
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000044 thru 0x0C000050
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000054 thru 0x0C000060
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000064 thru 0x0C000070
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000074 thru 0x0C000080
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000084 thru 0x0C000090
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C000094 thru 0x0C0000a0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000a4 thru 0x0C0000b0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000b4 thru 0x0C0000c0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000c4 thru 0x0C0000d0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000d4 thru 0x0C0000e0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000e4 thru 0x0C0000f0
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
# 0x0C0000f4 thru 0x0C0000fc
|
||||
plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:]
|
||||
|
||||
# 0x0C020000 thru 0x0C020004
|
||||
plicIntEnable = tokenize(rawPlicStateFile.readline())[1:]
|
||||
|
||||
# 0x0C200000
|
||||
plicIntPriorityThreshold = tokenize(rawPlicStateFile.readline())[1:]
|
||||
|
||||
with open(outDir+'checkpoint-PLIC_INT_PRIORITY', 'w') as outFile:
|
||||
for word in plicIntPriorityArray:
|
||||
outFile.write(stripZeroes(word[2:])+'\n')
|
||||
with open(outDir+'checkpoint-PLIC_INT_ENABLE', 'w') as outFile:
|
||||
for word in plicIntEnable:
|
||||
outFile.write(stripZeroes(word[2:]))
|
||||
with open(outDir+'checkpoint-PLIC_THRESHOLD', 'w') as outFile:
|
||||
for word in plicIntPriorityThreshold:
|
||||
outFile.write(stripZeroes(word[2:])+'\n')
|
||||
|
||||
print("Finished parsing PLIC state!")
|
@ -24,7 +24,7 @@ def tokenize(string):
|
||||
#############
|
||||
# Main Code #
|
||||
#############
|
||||
print("Begin parsing state.")
|
||||
print("Begin parsing CPU state.")
|
||||
|
||||
# Parse Args
|
||||
if len(sys.argv) != 2:
|
||||
@ -96,4 +96,4 @@ with open(stateGDBpath, 'r') as stateGDB:
|
||||
outFile.write(hex(byte)[2:]+'\n')
|
||||
outFile.close()
|
||||
|
||||
print("Finished parsing state!")
|
||||
print("Finished parsing CPU state!")
|
||||
|
50
linux/testvector-generation/parseUartState.py
Executable file
50
linux/testvector-generation/parseUartState.py
Executable file
@ -0,0 +1,50 @@
|
||||
#! /usr/bin/python3
|
||||
import sys, os
|
||||
|
||||
################
|
||||
# Helper Funcs #
|
||||
################
|
||||
|
||||
def tokenize(string):
|
||||
tokens = []
|
||||
token = ''
|
||||
whitespace = 0
|
||||
prevWhitespace = 0
|
||||
for char in string:
|
||||
prevWhitespace = whitespace
|
||||
whitespace = char in ' \t\n'
|
||||
if (whitespace):
|
||||
if ((not prevWhitespace) and (token != '')):
|
||||
tokens.append(token)
|
||||
token = ''
|
||||
else:
|
||||
token = token + char
|
||||
return tokens
|
||||
|
||||
#############
|
||||
# Main Code #
|
||||
#############
|
||||
print("Begin parsing UART state.")
|
||||
|
||||
# Parse Args
|
||||
if len(sys.argv) != 2:
|
||||
sys.exit('Error parseUartState.py expects 1 arg: <path_to_checkpoint_dir>')
|
||||
outDir = sys.argv[1]+'/'
|
||||
rawUartStateFile = outDir+'uartStateGDB.txt'
|
||||
if not os.path.exists(rawUartStateFile):
|
||||
sys.exit('Error input file '+rawUartStateFile+'not found')
|
||||
|
||||
with open(rawUartStateFile, 'r') as rawUartStateFile:
|
||||
uartBytes = []
|
||||
for i in range(0,8):
|
||||
uartBytes += tokenize(rawUartStateFile.readline())[1:]
|
||||
with open(outDir+'checkpoint-UART_IER', 'w') as outFile:
|
||||
outFile.write(uartBytes[1][2:])
|
||||
with open(outDir+'checkpoint-UART_LCR', 'w') as outFile:
|
||||
outFile.write(uartBytes[3][2:])
|
||||
with open(outDir+'checkpoint-UART_MCR', 'w') as outFile:
|
||||
outFile.write(uartBytes[4][2:])
|
||||
with open(outDir+'checkpoint-UART_SCR', 'w') as outFile:
|
||||
outFile.write(uartBytes[7][2:])
|
||||
|
||||
print("Finished parsing UART state!")
|
@ -1,21 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
while (1) {
|
||||
FILE* controlFile = fopen("silencePipe.control", "r");
|
||||
char silenceChar = getc(controlFile);
|
||||
fclose(controlFile);
|
||||
ssize_t lineSize = getline(&line, &len, stdin);
|
||||
if (silenceChar!='1') {
|
||||
printf("%s",line);
|
||||
} else {
|
||||
fprintf(stderr,"%s",line);
|
||||
}
|
||||
}
|
||||
free(line);
|
||||
return 0;
|
||||
}
|
@ -214,6 +214,15 @@ module testbench;
|
||||
`define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE
|
||||
`define PRIV dut.core.priv.priv.privmodereg.q
|
||||
`define INSTRET dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]
|
||||
`define UART dut.uncore.uart.uart.u
|
||||
`define UART_IER `UART.IER
|
||||
`define UART_LCR `UART.LCR
|
||||
`define UART_MCR `UART.MCR
|
||||
`define UART_SCR `UART.SCR
|
||||
`define PLIC dut.uncore.plic.plic
|
||||
`define PLIC_INT_PRIORITY `PLIC.intPriority
|
||||
`define PLIC_INT_ENABLE `PLIC.intEn
|
||||
`define PLIC_THRESHOLD `PLIC.intThreshold
|
||||
// Common Macros
|
||||
`define checkCSR(CSR) \
|
||||
begin \
|
||||
@ -301,6 +310,23 @@ module testbench;
|
||||
`INIT_CHECKPOINT_VAL(SATP, [`XLEN-1:0]);
|
||||
`INIT_CHECKPOINT_VAL(PRIV, [1:0]);
|
||||
`MAKE_CHECKPOINT_INIT_SIGNAL(MSTATUS, [`XLEN-1:0],0,0);
|
||||
// Many UART registers are difficult to initialize because under the hood
|
||||
// they are not simple registers. Instead some are generated by interesting
|
||||
// combinational blocks such that they depend upon a variety of different
|
||||
// underlying flops. See for example how RBR might be the actual RXBR
|
||||
// register, but it could also just as well be 0 or the tail of the fifo
|
||||
// array.
|
||||
//`INIT_CHECKPOINT_VAL(UART_RBR, [7:0]);
|
||||
`INIT_CHECKPOINT_VAL(UART_IER, [7:0]);
|
||||
//`INIT_CHECKPOINT_VAL(UART_IIR, [7:0]);
|
||||
`INIT_CHECKPOINT_VAL(UART_LCR, [7:0]);
|
||||
`INIT_CHECKPOINT_VAL(UART_MCR, [4:0]);
|
||||
//`INIT_CHECKPOINT_VAL(UART_LSR, [7:0]);
|
||||
//`INIT_CHECKPOINT_VAL(UART_MSR, [7:0]);
|
||||
`INIT_CHECKPOINT_VAL(UART_SCR, [7:0]);
|
||||
`INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_INT_PRIORITY, [2:0],`PLIC_NUM_SRC,1);
|
||||
`INIT_CHECKPOINT_VAL(PLIC_INT_ENABLE, [`PLIC_NUM_SRC:1]);
|
||||
`INIT_CHECKPOINT_VAL(PLIC_THRESHOLD, [2:0]);
|
||||
|
||||
integer memFile;
|
||||
integer readResult;
|
||||
@ -314,8 +340,8 @@ module testbench;
|
||||
$sformat(checkpointDir,"%s/linux-testvectors/checkpoint%0d/",RISCV_DIR,CHECKPOINT);
|
||||
$readmemb(`TWO_BIT_PRELOAD, dut.core.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem);
|
||||
$readmemb(`BTB_PRELOAD, dut.core.ifu.bpred.bpred.TargetPredictor.memory.mem);
|
||||
ProgramAddrMapFile = {linuxImageDir,"vmlinux.objdump.addr"};
|
||||
ProgramLabelMapFile = {linuxImageDir,"vmlinux.objdump.lab"};
|
||||
ProgramAddrMapFile = {linuxImageDir,"disassembly/vmlinux.objdump.addr"};
|
||||
ProgramLabelMapFile = {linuxImageDir,"disassembly/vmlinux.objdump.lab"};
|
||||
// initialize bootrom
|
||||
memFile = $fopen({testvectorDir,"bootmem.bin"}, "rb");
|
||||
readResult = $fread(dut.uncore.bootrom.bootrom.RAM,memFile);
|
||||
|
7
setup.sh
7
setup.sh
@ -7,7 +7,7 @@
|
||||
echo "Executing Wally setup.sh"
|
||||
|
||||
# Path to Wally repository
|
||||
WALLY=$(dirname ${BASH_SOURCE})
|
||||
WALLY=$(dirname ${BASH_SOURCE[0]:-$0})
|
||||
export WALLY=$(cd "$WALLY" && pwd)
|
||||
echo \$WALLY set to ${WALLY}
|
||||
|
||||
@ -15,7 +15,7 @@ echo \$WALLY set to ${WALLY}
|
||||
export RISCV=/opt/riscv # change this if you installed the tools in a different location
|
||||
|
||||
# Tools
|
||||
# GCCZ
|
||||
# GCC
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RISCV/riscv-gnu-toolchain/lib:$RISCV/riscv-gnu-toolchain/riscv64-unknown-elf/lib
|
||||
export PATH=$PATH:$RISCV/riscv-gnu-toolchain/bin:$RISCV/riscv-gnu-toolchain/riscv64-unknown-elf/bin # GCC tools
|
||||
# Spike
|
||||
@ -26,7 +26,8 @@ export PATH=$WALLY/bin:$PATH
|
||||
# Verilator
|
||||
export PATH=/usr/local/bin/verilator:$PATH # Change this for your path to Verilator
|
||||
# ModelSim/Questa (vsim)
|
||||
export PATH=/cad/mentor/questa_sim-2021.2_1/questasim/bin:$PATH # Change this for your path to Modelsim
|
||||
export PATH=/cad/mentor/questa_sim-2021.2_1/questasim/bin:$PATH # Change this for your path to Modelsim, or delete
|
||||
export PATH=/cad/mentor/questa_sim-2022.1_1/questasim/bin:$PATH # Change this for your path to Modelsim
|
||||
export MGLS_LICENSE_FILE=1717@solidworks.eng.hmc.edu # Change this to your Siemens license server
|
||||
export PATH=/cad/synopsys/SYN/bin:$PATH # Change this for your path to Design Compiler
|
||||
export SNPSLMD_LICENSE_FILE=27020@134.173.38.214
|
||||
|
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Makefile for synthesis
|
||||
#
|
||||
# Shreya Sanghai (ssanghai@hmc.edu) 2/28/2022
|
||||
NAME := synth
|
||||
|
||||
# defaults
|
||||
@ -26,6 +26,7 @@ CONFIGFILES ?= $(shell find $(CONFIGDIR) -name rv*_*)
|
||||
CONFIGFILESTRIM = $(notdir $(CONFIGFILES))
|
||||
print:
|
||||
echo $(CONFIGFILESTRIM)
|
||||
echo $(DIRS)
|
||||
|
||||
default:
|
||||
@echo "Basic synthesis procedure for Wally:"
|
||||
@ -38,10 +39,16 @@ rv%.log: rv%
|
||||
echo $<
|
||||
|
||||
|
||||
DIRS = rv32e rv32gc rv64ic rv64gc rv32ic
|
||||
DIRS = rv32e #rv32gc rv64ic rv64gc rv32ic
|
||||
# DELDIRS = rv32e rv32gc rv64ic rv64gc rv32ic
|
||||
# CONFIGSUBDIRS = _FPUoff _noMulDiv _noVirtMem _PMP0 _PMP16 _orig
|
||||
|
||||
copy:
|
||||
@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;)
|
||||
@$(foreach dir, $(DIRS), cp -r $(CONFIGDIR)/$(dir) $(CONFIGDIR)/$(dir)_orig;)
|
||||
@$(foreach dir, $(DIRS), sed -i 's/WAYSIZEINBYTES.*/WAYSIZEINBYTES 512/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;)
|
||||
@$(foreach dir, $(DIRS), sed -i 's/NUMWAYS.*/NUMWAYS 1/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;)
|
||||
@$(foreach dir, $(DIRS), sed -i "s/RAM_RANGE.*/RAM_RANGE 34\'h01FF/g" $(CONFIGDIR)/$(dir)_orig/wally-config.vh ;)
|
||||
|
||||
del:
|
||||
@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;)
|
||||
@ -55,46 +62,36 @@ configs: $(DIRS)
|
||||
$(DIRS):
|
||||
#turn off FPU
|
||||
rm -rf $(CONFIGDIR)/$@_FPUoff
|
||||
cp -r $(CONFIGDIR)/$@ $(CONFIGDIR)/$@_FPUoff
|
||||
cp -r $(CONFIGDIR)/$@_orig $(CONFIGDIR)/$@_FPUoff
|
||||
sed -i 's/1 *<< *3/0 << 3/' $(CONFIGDIR)/$@_FPUoff/wally-config.vh
|
||||
sed -i 's/1 *<< *5/0 << 5/' $(CONFIGDIR)/$@_FPUoff/wally-config.vh
|
||||
|
||||
# PMP 16
|
||||
rm -rf $(CONFIGDIR)/$@_PMP16
|
||||
cp -r $(CONFIGDIR)/$@_FPUoff $(CONFIGDIR)/$@_PMP16
|
||||
# sed -i 's/1 *<< *3/0 << 3/' $(CONFIGDIR)/$@_PMP16/wally-config.vh
|
||||
# sed -i 's/1 *<< *5/0 << 5/' $(CONFIGDIR)/$@_PMP16/wally-config.vh
|
||||
sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 16/' $(CONFIGDIR)/$@_PMP16/wally-config.vh
|
||||
|
||||
# PMP 0
|
||||
rm -rf $(CONFIGDIR)/$@_PMP0
|
||||
cp -r $(CONFIGDIR)/$@_FPUoff $(CONFIGDIR)/$@_PMP0
|
||||
# sed -i 's/1 *<< *3/0 << 3/' $(CONFIGDIR)/$@_PMP0/wally-config.vh
|
||||
# sed -i 's/1 *<< *5/0 << 5/' $(CONFIGDIR)/$@_PMP0/wally-config.vh
|
||||
sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 0/' $(CONFIGDIR)/$@_PMP0/wally-config.vh
|
||||
|
||||
# No Virtual Memory
|
||||
rm -rf $(CONFIGDIR)/$@_noVirtMem
|
||||
# cp -r $(CONFIGDIR)/$@ $(CONFIGDIR)/$@_noVirtMem
|
||||
# sed -i 's/1 *<< *3/0 <_PMP0< 3/' $(CONFIGDIR)/$@_noVirtMem/wally-config.vh
|
||||
# sed -i 's/1 *<< *5/0 << 5/' $(CONFIGDIR)/$@_noVirtMem/wally-config.vh
|
||||
# sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 0/' $(CONFIGDIR)/$@_noVirtMem/wally-config.vh
|
||||
cp -r $(CONFIGDIR)/$@_PMP0 $(CONFIGDIR)/$@_noVirtMem
|
||||
sed -i 's/VIRTMEM_SUPPORTED 1/VIRTMEM_SUPPORTED 0/' $(CONFIGDIR)/$@_noVirtMem/wally-config.vh
|
||||
|
||||
#no muldiv
|
||||
rm -rf $(CONFIGDIR)/$@_noMulDiv
|
||||
cp -r $(CONFIGDIR)/$@_noVirtMem $(CONFIGDIR)/$@_noMulDiv
|
||||
# sed -i 's/1 *<< *3/0 << 3/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh
|
||||
# sed -i 's/1 *<< *5/0 << 5/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh
|
||||
# sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 0/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh
|
||||
# sed -i 's/VIRTMEM_SUPPORTED 1/VIRTMEM_SUPPORTED 0/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh
|
||||
sed -i 's/1 *<< *12/0 << 12/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh
|
||||
|
||||
|
||||
allsynth: $(CONFIGFILESTRIM)
|
||||
|
||||
$(CONFIGFILESTRIM):
|
||||
make synth DESIGN=wallypipelinedcore CONFIG=$@ TECH=sky90 FREQ=500 MAXCORES=1 --jobs
|
||||
make synth DESIGN=wallypipelinedcore CONFIG=$@ TECH=sky90 FREQ=500 MAXCORES=1
|
||||
|
||||
|
||||
synth:
|
||||
@echo "DC Synthesis"
|
||||
|
8
synthDC/extractSummary.py
Normal file → Executable file
8
synthDC/extractSummary.py
Normal file → Executable file
@ -1,8 +1,10 @@
|
||||
#!/usr/bin/python3
|
||||
# Shreya Sanghai (ssanghai@hmc.edu) 2/28/2022
|
||||
import glob
|
||||
import re
|
||||
import csv
|
||||
|
||||
field_names = [ 'Name', 'Critical Path Length', 'Cell Area']
|
||||
field_names = [ 'Name', 'Critical Path Length', 'Cell Area', 'Synth Time']
|
||||
data = []
|
||||
for name in glob.glob("/home/ssanghai/riscv-wally/synthDC/runs/*/reports/wallypipelinedcore_qor.rep"):
|
||||
f = open(name, 'r')
|
||||
@ -13,7 +15,9 @@ for name in glob.glob("/home/ssanghai/riscv-wally/synthDC/runs/*/reports/wallypi
|
||||
pathLen = re.search("Length: *(.*?)\\n", line).group(1)
|
||||
if "Cell Area" in line:
|
||||
area = re.search("Area: *(.*?)\\n", line).group(1)
|
||||
data += [{'Name' : trimName, 'Critical Path Length': pathLen, 'Cell Area' : area}]
|
||||
if "Overall Compile Time" in line:
|
||||
time = re.search("Time: *(.*?)\\n", line).group(1)
|
||||
data += [{'Name' : trimName, 'Critical Path Length': pathLen, 'Cell Area' : area, 'Synth Time' :time}]
|
||||
|
||||
with open('Summary.csv', 'w') as csvfile:
|
||||
writer = csv.DictWriter(csvfile, fieldnames=field_names)
|
||||
|
Loading…
Reference in New Issue
Block a user