From 6cba6a92ba7bd67041d5bf827d35c29d25d641cd Mon Sep 17 00:00:00 2001 From: mmasserfrye Date: Thu, 12 May 2022 07:22:06 +0000 Subject: [PATCH] filled in ppa.sv, madzscript.py now synthesizes in parallel in puts results in csv --- addins/embench-iot | 2 +- addins/riscv-arch-test | 2 +- addins/riscv-dv | 2 +- addins/riscv-tests | 2 +- examples/C/fir/fir.S | 35 ++ examples/C/lab1matrix/Makefile | 33 ++ examples/C/lab1matrix/matMult | Bin 0 -> 43352 bytes examples/C/lab1matrix/matMult.c | 87 +++++ examples/C/sum_mixed/sum_mixed | Bin 0 -> 39928 bytes pipelined/src/fma/wave.do | 62 ++++ pipelined/src/ppa/ppa.sv | 87 ++--- pipelined/testbench/testbench.sv.bak | 473 +++++++++++++++++++++++++++ synthDC/madzscript.py | 67 ++-- synthDC/ppa | 2 +- synthDC/ppaData.csv | 37 +++ 15 files changed, 823 insertions(+), 68 deletions(-) create mode 100644 examples/C/fir/fir.S create mode 100644 examples/C/lab1matrix/Makefile create mode 100755 examples/C/lab1matrix/matMult create mode 100644 examples/C/lab1matrix/matMult.c create mode 100755 examples/C/sum_mixed/sum_mixed create mode 100644 pipelined/src/fma/wave.do create mode 100644 pipelined/testbench/testbench.sv.bak create mode 100644 synthDC/ppaData.csv diff --git a/addins/embench-iot b/addins/embench-iot index 2d2aaa7b..261a65e0 160000 --- a/addins/embench-iot +++ b/addins/embench-iot @@ -1 +1 @@ -Subproject commit 2d2aaa7b85c60219c591555b647dfa1785ffe1b3 +Subproject commit 261a65e0a2d3e8d62d81b1d8fe7e309a096bc6a9 diff --git a/addins/riscv-arch-test b/addins/riscv-arch-test index effd553a..307c77b2 160000 --- a/addins/riscv-arch-test +++ b/addins/riscv-arch-test @@ -1 +1 @@ -Subproject commit effd553a6a91ed9b0ba251796a8a44505a45174f +Subproject commit 307c77b26e070ae85ffea665ad9b642b40e33c86 diff --git a/addins/riscv-dv b/addins/riscv-dv index cb4295f9..a7e27bc0 160000 --- a/addins/riscv-dv +++ b/addins/riscv-dv @@ -1 +1 @@ -Subproject commit cb4295f9ce5da2881d7746015a6105adb8f09071 +Subproject commit a7e27bc046405f0dbcde091be99f5a5d564e2172 diff --git a/addins/riscv-tests b/addins/riscv-tests index 3e2bf06b..cf04274f 160000 --- a/addins/riscv-tests +++ b/addins/riscv-tests @@ -1 +1 @@ -Subproject commit 3e2bf06b071a77ae62c09bf07c5229d1f9397d94 +Subproject commit cf04274f50621fd9ef9147793cca6dd1657985c7 diff --git a/examples/C/fir/fir.S b/examples/C/fir/fir.S new file mode 100644 index 00000000..a96339ba --- /dev/null +++ b/examples/C/fir/fir.S @@ -0,0 +1,35 @@ +// fir.s +// mmasserfrye@hmc.edu 30 January 2022 +// FIR filter + +// a0 = N, a1 = M, a2 = &X, a3 = &c, a4 = &Y + +.global fir + +fir: + li t0, 0 # n = 0 = t0 + slli t6, a0, 3 # N*8 + slli t5, a1, 3 # M*8 + addi t4, t5, -8 # (M-1)*8 +for1: + bge t0, t6, end # exit outer for if n >= N + fmv.d.x f3, zero # sum = 0 = f3 + li t2, 0 # i = 0 = t2 + add t1, t4, t0 # [(M-1) + n]*8 +for2: + bge t2, t5, for1end # exit inner for if i >= M + sub t3, t1, t2 # [(M-1) + n - i]*8 + add t3, t3, a2 # t3 = offset + &X + fld f0, 0(t3) # X[n-i+(M-1)] + add t3, t2, a3 # t3 = offset + &c + fld f1, 0(t3) # c[i] + fmadd.d f3, f0, f1, f3 # sum += c[i]*X[n-i+(M-1)] + addi t2, t2, 8 # i++ + j for2 +for1end: + add t3, t0, a4 # t3 = offset + &Y + fsd f3, 0(t3) # Y[n] = sum + addi t0, t0, 8 # n++ + j for1 +end: + ret \ No newline at end of file diff --git a/examples/C/lab1matrix/Makefile b/examples/C/lab1matrix/Makefile new file mode 100644 index 00000000..18c011f4 --- /dev/null +++ b/examples/C/lab1matrix/Makefile @@ -0,0 +1,33 @@ +TARGET = matMult + +$(TARGET).objdump: $(TARGET) + riscv64-unknown-elf-objdump -S -D $(TARGET) > $(TARGET).objdump + spike $(TARGET) + +$(TARGET): $(TARGET).c Makefile + riscv64-unknown-elf-gcc -o $(TARGET) -g -O\ + -march=rv64gc -mabi=lp64d -mcmodel=medany \ + -nostdlib -static -lm -fno-tree-loop-distribute-patterns \ + -T../common/test.ld -I../common \ + $(TARGET).c ../common/crt.S ../common/syscalls.c +# Compiler flags: +# -o $(TARGET) defines the name of the output file +# -g generates debugging symbols for gdb +# -O turns on basic optimization; -O3 turns on heavy optimization; omit for no optimization +# -march=rv64gc -mabi=lp64d =mcmodel=medany generates code for RV64GC with doubles and long/ptrs = 64 bits +# -static forces static linking (no dynamic shared libraries on bare metal) +# -lm links the math library if necessary (when #include math.h) +# -nostdlib avoids inserting standard startup files and default libraries +# because we are using crt.s on bare metal +# -fno-tree-loop-distribute-patterns turns replacing loops with memcpy/memset in the std library +# -T specifies the linker file +# -I specifies the include path (e.g. for util.h) +# The last line defines the C files to compile. +# crt.S is needed as our startup file to initialize the processor +# syscalls.c implements printf through the HTIF for Spike +# other flags from riscv-tests makefiles that don't seem to be important +# -ffast-math -DPREALLOCATE=1 -std=gnu99 \ +# -fno-common -fno-builtin-printf -nostartfiles -lgcc \ + +clean: + rm -f $(TARGET) $(TARGET).objdump diff --git a/examples/C/lab1matrix/matMult b/examples/C/lab1matrix/matMult new file mode 100755 index 0000000000000000000000000000000000000000..e3d3b25dd44f3d863bf10fb093a7f51972edf99a GIT binary patch literal 43352 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 literal 0 HcmV?d00001 diff --git a/examples/C/lab1matrix/matMult.c b/examples/C/lab1matrix/matMult.c new file mode 100644 index 00000000..b794819f --- /dev/null +++ b/examples/C/lab1matrix/matMult.c @@ -0,0 +1,87 @@ +// matMult.c +// mmasserfrye@hmc.edu 30 January 2022 + +#include // supports printf +#include // supports fabs +#include "util.h" // supports verify + +// puts the indicated row of length n from matrix mat into array arr +void getRow(int n, int row, double *mat, double *arr){ + int ind; + for (int i=0; iNf=BfF%#}Z5+Fn_ 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/32); + localparam integer MemEndAddr = (`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32); + + initial + begin + test = 1; + totalerrors = 0; + testadr = 0; + // fill memory with defined values to reduce Xs in simulation + // Quick note the memory will need to be initialized. The C library does not + // guarantee the initialized reads. For example a strcmp can read 6 byte + // strings, but uses a load double to read them in. If the last 2 bytes are + // not initialized the compare results in an 'x' which propagates through + // the design. + if (TEST == "coremark") + for (i=MemStartAddr; i= 128 | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled"); + assert (`DCACHE_LINELENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_LINELENINBITS must be smaller than way size"); + assert (`ICACHE_WAYSIZEINBYTES <= 4096 | (`IMEM != `MEM_CACHE) | `VIRTMEM_SUPPORTED == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)"); + assert (`ICACHE_LINELENINBITS >= 32 | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled"); + assert (`ICACHE_LINELENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_LINELENINBITS must be smaller than way size"); + assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be a power of 2"); + assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES | (`DMEM != `MEM_CACHE)) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); + assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be a power of 2"); + assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES | (`IMEM != `MEM_CACHE)) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); + assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES | `VIRTMEM_SUPPORTED==0) else $error("ITLB_ENTRIES must be a power of 2"); + assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES | `VIRTMEM_SUPPORTED==0) else $error("DTLB_ENTRIES must be a power of 2"); + assert (`RAM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if RAM_RANGE is less than 56'h07FFFFFF"); + assert (`ZICSR_SUPPORTED == 1 | (`PMP_ENTRIES == 0 & `VIRTMEM_SUPPORTED == 0)) else $error("PMP_ENTRIES and VIRTMEM_SUPPORTED must be zero if ZICSR not supported."); + assert (`ZICSR_SUPPORTED == 1 | (`S_SUPPORTED == 0 & `U_SUPPORTED == 0)) else $error("S and U modes not supported if ZISR not supported"); + assert (`U_SUPPORTED | (`S_SUPPORTED == 0)) else $error ("S mode only supported if U also is supported"); +// assert (`MEM_DCACHE == 0 | `MEM_DTIM == 0) else $error("Can't simultaneously have a data cache and TIM"); + assert (`DMEM == `MEM_CACHE | `VIRTMEM_SUPPORTED ==0) else $error("Virtual memory needs dcache"); + assert (`IMEM == `MEM_CACHE | `VIRTMEM_SUPPORTED ==0) else $error("Virtual memory needs icache"); + end +endmodule + + +/* verilator lint_on STMTDLY */ +/* verilator lint_on WIDTH */ + +module DCacheFlushFSM + (input logic clk, + input logic reset, + input logic start, + output logic done); + + genvar adr; + + logic [`XLEN-1:0] ShadowRAM[`RAM_BASE>>(1+`XLEN/32):(`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32)]; + + if(`DMEM == `MEM_CACHE) begin + localparam integer numlines = testbench.dut.core.lsu.bus.dcache.dcache.NUMLINES; + localparam integer numways = testbench.dut.core.lsu.bus.dcache.dcache.NUMWAYS; + localparam integer linebytelen = testbench.dut.core.lsu.bus.dcache.dcache.LINEBYTELEN; + localparam integer numwords = testbench.dut.core.lsu.bus.dcache.dcache.LINELEN/`XLEN; + localparam integer lognumlines = $clog2(numlines); + localparam integer loglinebytelen = $clog2(linebytelen); + localparam integer lognumways = $clog2(numways); + localparam integer tagstart = lognumlines + loglinebytelen; + + + + genvar index, way, cacheWord; + logic [`XLEN-1:0] CacheData [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic [`XLEN-1:0] CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic CacheValid [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic CacheDirty [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0]; + for(index = 0; index < numlines; index++) begin + for(way = 0; way < numways; way++) begin + for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin + copyShadow #(.tagstart(tagstart), + .loglinebytelen(loglinebytelen)) + copyShadow(.clk, + .start, + .tag(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].CacheTagMem.StoredData[index]), + .valid(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].ValidBits[index]), + .dirty(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].DirtyBits[index]), + .data(testbench.dut.core.lsu.bus.dcache.dcache.CacheWays[way].word[cacheWord].CacheDataMem.StoredData[index]), + .index(index), + .cacheWord(cacheWord), + .CacheData(CacheData[way][index][cacheWord]), + .CacheAdr(CacheAdr[way][index][cacheWord]), + .CacheTag(CacheTag[way][index][cacheWord]), + .CacheValid(CacheValid[way][index][cacheWord]), + .CacheDirty(CacheDirty[way][index][cacheWord])); + end + end + end + + integer i, j, k; + + always @(posedge clk) begin + if (start) begin #1 + #1 + for(i = 0; i < numlines; i++) begin + for(j = 0; j < numways; j++) begin + for(k = 0; k < numwords; k++) begin + if (CacheValid[j][i][k] & CacheDirty[j][i][k]) begin + ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k]; + end + end + end + end + end + end + + + end + flop #(1) doneReg(.clk, .d(start), .q(done)); +endmodule + +module copyShadow + #(parameter tagstart, loglinebytelen) + (input logic clk, + input logic start, + input logic [`PA_BITS-1:tagstart] tag, + input logic valid, dirty, + input logic [`XLEN-1:0] data, + input logic [32-1:0] index, + input logic [32-1:0] cacheWord, + output logic [`XLEN-1:0] CacheData, + output logic [`PA_BITS-1:0] CacheAdr, + output logic [`XLEN-1:0] CacheTag, + output logic CacheValid, + output logic CacheDirty); + + + always_ff @(posedge clk) begin + if(start) begin + CacheTag = tag; + CacheValid = valid; + CacheDirty = dirty; + CacheData = data; + CacheAdr = (tag << tagstart) + (index << loglinebytelen) + (cacheWord << $clog2(`XLEN/8)); + end + end + +endmodule + diff --git a/synthDC/madzscript.py b/synthDC/madzscript.py index 83295df1..ba8c97b1 100755 --- a/synthDC/madzscript.py +++ b/synthDC/madzscript.py @@ -1,36 +1,59 @@ #!/usr/bin/python3 # from msilib.schema import File import subprocess +from multiprocessing import Pool +import csv +import re +def run_command(module, width, freq): + command = "make synth DESIGN=ppa_{}_{} TECH=sky90 DRIVE=INV FREQ={} MAXOPT=1".format(module, width, freq) + subprocess.Popen(command, shell=True) -bashCommand = "find . | grep ppa_timing.rep" -output = subprocess.check_output(['bash','-c', bashCommand]) -files = output.decode("utf-8").split('\n') -print(files) +widths = ['16', '32', '64'] +modules = ['mult'] +freqs = ['10', '4000', '5000', '6000'] -widths = [] -areas = [] -delays = [] +LoT = [] +for module in modules: + for width in widths: + for freq in freqs: + LoT += [[module, width, freq]] -for file in files: - widths += [pullNum('ports', file)/3] - areas += [pullNum('Total cell area', file)] - delays += [pullNum('delay', file)] +pool = Pool() +pool.starmap(run_command, LoT) +bashCommand = "grep 'Critical Path Length' runs/ppa_*/reports/*qor*" +outputCPL = subprocess.check_output(['bash','-c', bashCommand]) +linesCPL = outputCPL.decode("utf-8").split('\n')[:-1] -def pullNum(keyText, file): - return +bashCommand = "grep 'Design Area' runs/ppa_*/reports/*qor*" +outputDA = subprocess.check_output(['bash','-c', bashCommand]) +linesDA = outputDA.decode("utf-8").split('\n')[:-1] -# File_object = open("greppedareas","r") -# content = File_object.readlines() -# File_object.close() +cpl = re.compile('\d{1}\.\d{6}') +f = re.compile('_\d*_MHz') +wm = re.compile('ppa_\w*_\d*_qor') +da = re.compile('\d*\.\d{6}') -# LoT = [] -# for line in content: -# l = line.split(':') -# LoT += [float(l[2])] +allSynths = [] -# avg = sum(LoT)/len(LoT) +for i in range(len(linesCPL)): + line = linesCPL[i] + oneSynth = [] + mwm = wm.findall(line)[0][4:-4].split('_') + oneSynth += [mwm[0]] + oneSynth += [mwm[1]] + oneSynth += [f.findall(line)[0][1:-4]] + oneSynth += cpl.findall(line) + oneSynth += da.findall(linesDA[i]) + allSynths += [oneSynth] -# print(avg) \ No newline at end of file +file = open("ppaData.csv", "w") +writer = csv.writer(file) +writer.writerow(['Module', 'Width', 'Target Freq', 'Delay', 'Area']) + +for one in allSynths: + writer.writerow(one) + +file.close() \ No newline at end of file diff --git a/synthDC/ppa b/synthDC/ppa index 5929ca95..dcf3d15d 100755 --- a/synthDC/ppa +++ b/synthDC/ppa @@ -3,7 +3,7 @@ # Run PPA experiments on different modules rm -rf runs/ppa* make synth DESIGN=ppa_add_16 TECH=sky90 DRIVE=INV FREQ=10 MAXOPT=1 & -make synth DESIGN=ppa_add_32 TECH=sky90 DRIVE=INV FREQ=1 MAXOPT=10 & +make synth DESIGN=ppa_add_32 TECH=sky90 DRIVE=INV FREQ=1 MAXOPT=1 & make synth DESIGN=ppa_add_64 TECH=sky90 DRIVE=INV FREQ=10 MAXOPT=1 & make synth DESIGN=ppa_add_16 TECH=sky90 DRIVE=INV FREQ=4000 MAXOPT=1 & make synth DESIGN=ppa_add_32 TECH=sky90 DRIVE=INV FREQ=4000 MAXOPT=1 & diff --git a/synthDC/ppaData.csv b/synthDC/ppaData.csv new file mode 100644 index 00000000..7cea16f7 --- /dev/null +++ b/synthDC/ppaData.csv @@ -0,0 +1,37 @@ +Module,Width,Target Freq,Delay,Area +add,16,10,2.032906,221.479998 +add,16,4000,0.249839,551.740010 +add,16,5000,0.228259,924.140017 +add,16,6000,0.225754,1120.140018 +add,32,10,4.160501,456.679995 +add,32,4000,0.280842,1730.680031 +add,32,5000,0.250500,1933.540033 +add,32,6000,0.271774,1746.360030 +add,64,10,8.474034,927.079988 +add,64,4000,0.323267,3758.300065 +add,64,5000,0.334061,3798.480071 +add,64,6000,0.328457,3749.480066 +comparator,16,10,0.576329,252.840005 +comparator,16,4000,0.249312,280.280005 +comparator,16,5000,0.199026,313.600006 +comparator,16,6000,0.166568,422.380007 +comparator,32,10,0.765874,495.880010 +comparator,32,4000,0.249950,608.580012 +comparator,32,5000,0.205372,919.240014 +comparator,32,6000,0.201200,1248.520016 +comparator,64,10,0.561562,1008.420020 +comparator,64,4000,0.249905,1437.660027 +comparator,64,5000,0.219296,2738.120023 +comparator,64,6000,0.221138,2341.220025 +mult,16,10,4.730546,3869.040009 +mult,16,4000,0.821111,9132.620147 +mult,16,5000,0.820059,9583.420143 +mult,16,6000,0.831308,8594.600132 +mult,32,10,7.575772,12412.680067 +mult,32,4000,1.091389,31262.980534 +mult,32,5000,1.092153,31497.200524 +mult,32,6000,1.084816,33519.920555 +mult,64,10,4.793300,46798.920227 +mult,64,4000,1.411752,93087.261425 +mult,64,5000,1.404875,94040.801492 +mult,64,6000,1.415466,89931.661403