mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge branch 'main' of https://github.com/davidharrishmc/riscv-wally into main
This commit is contained in:
		
						commit
						0715c62de5
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -53,7 +53,7 @@ examples/asm/example/example
 | 
			
		||||
examples/C/sum/sum
 | 
			
		||||
examples/C/fir/fir
 | 
			
		||||
examples/fp/softfloat_demo/softfloat_demo
 | 
			
		||||
examples/fp/softfloat_calc/softfloat_calc
 | 
			
		||||
examples/fp/fpcalc/fpcalc
 | 
			
		||||
pipelined/src/fma/fma16_testgen
 | 
			
		||||
linux/devicetree/debug/*
 | 
			
		||||
!linux/devicetree/debug/dump-dts.sh
 | 
			
		||||
 | 
			
		||||
@ -29,26 +29,97 @@ typedef union dp {
 | 
			
		||||
 | 
			
		||||
int opSize = 0;
 | 
			
		||||
 | 
			
		||||
void long2binstr(long  val, char *str, int bits) {
 | 
			
		||||
  int i;
 | 
			
		||||
  long masked;
 | 
			
		||||
 | 
			
		||||
  if (val == 0) { // just return zero
 | 
			
		||||
    str[0] = '0';
 | 
			
		||||
    str[1] = 0; 
 | 
			
		||||
  } else {
 | 
			
		||||
    for (i=0; i<bits && val != 0; i++) {
 | 
			
		||||
      masked = val & ~(1 << (bits-i-1)); // mask off the bit
 | 
			
		||||
      if (masked != val) str[i] = '1';
 | 
			
		||||
      else str[i] = '0';
 | 
			
		||||
      //printf("  Considering %d masked %d str[%d] %c\n", val, masked, i, str[i]);
 | 
			
		||||
      val = masked;
 | 
			
		||||
      if (!val) str[i+1] = 0; // terminate when out of nonzero digits
 | 
			
		||||
    }
 | 
			
		||||
  } 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printF16(char *msg, float16_t f) {
 | 
			
		||||
  hp convh;
 | 
			
		||||
  sp convf;
 | 
			
		||||
  long exp, fract;
 | 
			
		||||
  char sign;
 | 
			
		||||
  char sci[80], fractstr[80];
 | 
			
		||||
  float32_t temp;
 | 
			
		||||
 | 
			
		||||
  convh.v = f.v; // use union to convert between hexadecimal and floating-point views
 | 
			
		||||
  temp = f16_to_f32(convh.h);
 | 
			
		||||
  convf.ft = temp;
 | 
			
		||||
  printf ("%s: 0x%04x = %g\n", msg, convh.v, convf.f);  // no easy way to print half prec.
 | 
			
		||||
 | 
			
		||||
  fract = f.v & ((1<<10) - 1); long2binstr(fract, fractstr, 10);
 | 
			
		||||
  exp = (f.v >> 10) & ((1<<5) -1);
 | 
			
		||||
  sign = f.v >> 15 ? '-' : '+';
 | 
			
		||||
  //printf("%c %d %d  ", sign, exp, fract);
 | 
			
		||||
  if (exp == 0 && fract == 0) sprintf(sci, "%czero", sign);
 | 
			
		||||
  else if (exp == 0 && fract != 0) sprintf(sci, "Denorm: %c0.%s x 2^-14", sign, fractstr);
 | 
			
		||||
  else if (exp == 31 && fract == 0) sprintf(sci, "%cinf", sign);
 | 
			
		||||
  else if (exp == 31 && fract != 0) sprintf(sci, "NaN Payload: %c%s", sign, fractstr);
 | 
			
		||||
  else sprintf(sci, "%c1.%s x 2^%d", sign, fractstr, exp-15);
 | 
			
		||||
 | 
			
		||||
  printf ("%s: 0x%04x = %g = %s: Biased Exp %d Fract 0x%lx\n", 
 | 
			
		||||
    msg, convh.v, convf.f, sci, exp, fract);  // no easy way to print half prec.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printF32(char *msg, float32_t f) {
 | 
			
		||||
  sp conv;
 | 
			
		||||
  long exp, fract;
 | 
			
		||||
  char sign;
 | 
			
		||||
  char sci[80], fractstr[80];
 | 
			
		||||
 | 
			
		||||
  conv.v = f.v; // use union to convert between hexadecimal and floating-point views
 | 
			
		||||
  printf ("%s: 0x%08x = %g\n", msg, conv.v, conv.f);
 | 
			
		||||
 | 
			
		||||
  fract = f.v & ((1<<23) - 1); long2binstr(fract, fractstr, 23);
 | 
			
		||||
  exp = (f.v >> 23) & ((1<<8) -1);
 | 
			
		||||
  sign = f.v >> 31 ? '-' : '+';
 | 
			
		||||
  //printf("%c %d %d  ", sign, exp, fract);
 | 
			
		||||
  if (exp == 0 && fract == 0) sprintf(sci, "%czero", sign);
 | 
			
		||||
  else if (exp == 0 && fract != 0) sprintf(sci, "Denorm: %c0.%s x 2^-126", sign, fractstr);
 | 
			
		||||
  else if (exp == 255 && fract == 0) sprintf(sci, "%cinf", sign);
 | 
			
		||||
  else if (exp == 255 && fract != 0) sprintf(sci, "NaN Payload: %c%s", sign, fractstr);
 | 
			
		||||
  else sprintf(sci, "%c1.%s x 2^%d", sign, fractstr, exp-127);
 | 
			
		||||
 | 
			
		||||
  //printf ("%s: 0x%08x = %g\n", msg, conv.v, conv.f);
 | 
			
		||||
  printf ("%s: 0x%08x = %g = %s: Biased Exp %d Fract 0x%lx\n", 
 | 
			
		||||
    msg, conv.v, conv.f, sci, exp, fract);  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printF64(char *msg, float64_t f) {
 | 
			
		||||
  dp conv;
 | 
			
		||||
  long exp, fract;
 | 
			
		||||
  long mask;
 | 
			
		||||
  char sign;
 | 
			
		||||
  char sci[80], fractstr[80];
 | 
			
		||||
 | 
			
		||||
  conv.v = f.v; // use union to convert between hexadecimal and floating-point views
 | 
			
		||||
  printf ("%s: 0x%016lx = %lg\n", msg, conv.v, conv.d);
 | 
			
		||||
 | 
			
		||||
  mask = 1; mask = (mask << 52) - 1;
 | 
			
		||||
  fract = f.v & mask; long2binstr(fract, fractstr, 52);
 | 
			
		||||
  exp = (f.v >> 52) & ((1<<11) -1);
 | 
			
		||||
  sign = f.v >> 63 ? '-' : '+';
 | 
			
		||||
  //printf("%c %d %d  ", sign, exp, fract);
 | 
			
		||||
  if (exp == 0 && fract == 0) sprintf(sci, "%czero", sign);
 | 
			
		||||
  else if (exp == 0 && fract != 0) sprintf(sci, "Denorm: %c0.%s x 2^-1022", sign, fractstr);
 | 
			
		||||
  else if (exp == 2047 && fract == 0) sprintf(sci, "%cinf", sign);
 | 
			
		||||
  else if (exp == 2047 && fract != 0) sprintf(sci, "NaN Payload: %c%s", sign, fractstr);
 | 
			
		||||
  else sprintf(sci, "%c1.%s x 2^%d", sign, fractstr, exp-1023);
 | 
			
		||||
 | 
			
		||||
  //printf ("%s: 0x%016lx = %lg\n", msg, conv.v, conv.d);
 | 
			
		||||
  printf ("%s: 0x%016lx = %lg = %s: Biased Exp %d Fract 0x%lx\n", 
 | 
			
		||||
    msg, conv.v, conv.d, sci, exp, fract); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void printFlags(void) {
 | 
			
		||||
@ -37,6 +37,7 @@ module adrdecs (
 | 
			
		||||
  input  logic [1:0]          Size,
 | 
			
		||||
  output logic [8:0]          SelRegions
 | 
			
		||||
);
 | 
			
		||||
  logic [3:0] clintaccesssize;
 | 
			
		||||
 | 
			
		||||
 // Determine which region of physical memory (if any) is being accessed
 | 
			
		||||
 // *** eventually uncomment Access signals
 | 
			
		||||
@ -44,7 +45,8 @@ module adrdecs (
 | 
			
		||||
  adrdec boottimdec(PhysicalAddress, `BOOTROM_BASE, `BOOTROM_RANGE, `BOOTROM_SUPPORTED, /*1'b1*/AccessRX, Size, 4'b1111, SelRegions[6]);
 | 
			
		||||
  adrdec timdec(PhysicalAddress, `RAM_BASE, `RAM_RANGE, `RAM_SUPPORTED, /*1'b1*/AccessRWX, Size, 4'b1111, SelRegions[5]);
 | 
			
		||||
 | 
			
		||||
  adrdec clintdec(PhysicalAddress, `CLINT_BASE, `CLINT_RANGE, `CLINT_SUPPORTED, AccessRW, Size, 4'b1111, SelRegions[4]);
 | 
			
		||||
  assign clintaccesssize = (`XLEN==64) ? 4'b1000 : 4'b0100;
 | 
			
		||||
  adrdec clintdec(PhysicalAddress, `CLINT_BASE, `CLINT_RANGE, `CLINT_SUPPORTED, AccessRW, Size, clintaccesssize, SelRegions[4]);
 | 
			
		||||
  adrdec gpiodec(PhysicalAddress, `GPIO_BASE, `GPIO_RANGE, `GPIO_SUPPORTED, AccessRW, Size, 4'b0100, SelRegions[3]);
 | 
			
		||||
  adrdec uartdec(PhysicalAddress, `UART_BASE, `UART_RANGE, `UART_SUPPORTED, AccessRW, Size, 4'b0001, SelRegions[2]);
 | 
			
		||||
  adrdec plicdec(PhysicalAddress, `PLIC_BASE, `PLIC_RANGE, `PLIC_SUPPORTED, AccessRW, Size, 4'b0100, SelRegions[1]);
 | 
			
		||||
 | 
			
		||||
@ -124,11 +124,11 @@ module hptw
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    assign {Dirty, Accessed} = PTE[7:6];
 | 
			
		||||
    assign WriteAccess = (MemRWM[0] | |AtomicM);
 | 
			
		||||
    assign SetDirty = ~Dirty & & DTLBWalk & WriteAccess;
 | 
			
		||||
    assign WriteAccess = MemRWM[0] | (|AtomicM);
 | 
			
		||||
    assign SetDirty = ~Dirty & DTLBWalk & WriteAccess;
 | 
			
		||||
    assign ReadAccess = MemRWM[1];
 | 
			
		||||
 | 
			
		||||
    assign EffectivePrivilegeMode = (DTLBWalk == 0) ? PrivilegeModeW : (STATUS_MPRV ? STATUS_MPP : PrivilegeModeW); // DTLB uses MPP mode when MPRV is 1
 | 
			
		||||
    assign EffectivePrivilegeMode = DTLBWalk ? (STATUS_MPRV ? STATUS_MPP : PrivilegeModeW) : PrivilegeModeW; // DTLB uses MPP mode when MPRV is 1
 | 
			
		||||
    assign ImproperPrivilege = ((EffectivePrivilegeMode == `U_MODE) & ~PTE_U) |
 | 
			
		||||
                               ((EffectivePrivilegeMode == `S_MODE) & PTE_U & (~STATUS_SUM & DTLBWalk));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -22,11 +22,10 @@ export OUTPUTDIR := runs/$(DESIGN)_$(CONFIG)_$(TECH)nm_$(FREQ)_MHz_$(time)_$(has
 | 
			
		||||
export SAIFPOWER ?= 0
 | 
			
		||||
 | 
			
		||||
CONFIGDIR ?= ~/riscv-wally/pipelined/config
 | 
			
		||||
#CONFIGS	?= $(shell find $(CONFIGDIR) -name "rv*")
 | 
			
		||||
CONFIGS ?= ("rv32e", "rv32ic")
 | 
			
		||||
 | 
			
		||||
CONFIGFILES	?= $(shell find $(CONFIGDIR) -name rv*_*)
 | 
			
		||||
CONFIGFILESTRIM = $(notdir $(CONFIGFILES))
 | 
			
		||||
print:
 | 
			
		||||
	echo "files in $(CONFIGDIR) are $(CONFIGS)."
 | 
			
		||||
	echo $(CONFIGFILESTRIM)
 | 
			
		||||
 | 
			
		||||
default:
 | 
			
		||||
	@echo "Basic synthesis procedure for Wally:"
 | 
			
		||||
@ -38,22 +37,64 @@ test: rv%
 | 
			
		||||
rv%.log: rv%
 | 
			
		||||
	echo $<
 | 
			
		||||
 | 
			
		||||
flavors:
 | 
			
		||||
	rm -rf $(CONFIGDIR)/rv32em
 | 
			
		||||
	cp -r $(CONFIGDIR)/rv32e $(CONFIGDIR)/rv32em
 | 
			
		||||
	sed -i 's/h00000010/h00001010/' $(CONFIGDIR)/rv32em/wally-config.vh
 | 
			
		||||
	# rv32e, 32ic, 32gc 64ic, 64gc
 | 
			
		||||
	# 64gc - FPU
 | 
			
		||||
	# PMP16
 | 
			
		||||
	# PMP0
 | 
			
		||||
	# No virtual memory
 | 
			
		||||
	# Muldiv
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
allsynth: 
 | 
			
		||||
	make flavors
 | 
			
		||||
	make synth DESIGN=wallypipelinedcore CONFIG=rv32e TECH=sky90 FREQ=500 MAXCORES=1
 | 
			
		||||
	make synth DESIGN=wallypipelinedcore CONFIG=rv32em TECH=sky90 FREQ=500 MAXCORES=1
 | 
			
		||||
DIRS = rv32e rv32gc rv64ic rv64gc rv32ic
 | 
			
		||||
# DELDIRS = rv32e rv32gc rv64ic rv64gc rv32ic
 | 
			
		||||
# CONFIGSUBDIRS = _FPUoff _noMulDiv _noVirtMem _PMP0 _PMP16 _orig
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
del:
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;)
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_FPUoff;)
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_PMP16;)
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_PMP0;)
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_noVirtMem;)
 | 
			
		||||
	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_noMulDiv;)
 | 
			
		||||
 | 
			
		||||
configs: $(DIRS)
 | 
			
		||||
$(DIRS): 
 | 
			
		||||
	#turn off FPU 
 | 
			
		||||
	rm -rf $(CONFIGDIR)/$@_FPUoff
 | 
			
		||||
	cp -r $(CONFIGDIR)/$@ $(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
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
synth:
 | 
			
		||||
	@echo "DC Synthesis"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								synthDC/extractSummary.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								synthDC/extractSummary.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
import glob 
 | 
			
		||||
import re
 | 
			
		||||
import csv
 | 
			
		||||
 | 
			
		||||
field_names = [ 'Name', 'Critical Path Length', 'Cell Area']
 | 
			
		||||
data = []
 | 
			
		||||
for name in glob.glob("/home/ssanghai/riscv-wally/synthDC/runs/*/reports/wallypipelinedcore_qor.rep"):   
 | 
			
		||||
    f = open(name, 'r')
 | 
			
		||||
    # trimName = re.search("runs\/(.*?)\/reports", name).group(1)
 | 
			
		||||
    trimName = re.search("wallypipelinedcore_(.*?)_sky9",name).group(1)
 | 
			
		||||
    for line in f:
 | 
			
		||||
        if "Critical Path Length" in line:
 | 
			
		||||
            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}]
 | 
			
		||||
 | 
			
		||||
with open('Summary.csv', 'w') as csvfile:
 | 
			
		||||
    writer = csv.DictWriter(csvfile, fieldnames=field_names)
 | 
			
		||||
    writer.writeheader()
 | 
			
		||||
    writer.writerows(data)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user