qslc_r4a2 generator

This commit is contained in:
David Harris 2022-06-09 17:26:47 +00:00
parent 88285c684c
commit 5612ca7041
7 changed files with 217 additions and 211 deletions

4
.gitignore vendored
View File

@ -107,4 +107,6 @@ pipelined/config/rv64ic_orig
synthDC/Summary.csv
pipelined/srt/exptestgen
pipelined/srt/testgen
pipelined/srt/qst2
pipelined/srt/qslc_r4a2
pipelined/srt/qslc_r4a2.sv
pipelined/srt/testvectors

View File

@ -1,2 +1,2 @@
vsim -do "do wally-pipelined.do rv32gc arch32f"
vsim -do "do wally-pipelined.do rv32gc arch32i"

View File

@ -6,7 +6,7 @@ add wave -noupdate /testbench/reset_ext
add wave -noupdate /testbench/memfilename
add wave -noupdate /testbench/dut/core/SATP_REGW
add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/BPPredWrongE
add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/CSRWritePendingDEM
add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/CSRWriteFencePendingDEM
add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/RetM
add wave -noupdate -group HDU -group hazards -color Pink /testbench/dut/core/hzu/TrapM
add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/LoadStallD
@ -468,7 +468,7 @@ add wave -noupdate -group {debug trace} -expand -group wb /testbench/PCW
add wave -noupdate -group {pc selection} /testbench/dut/core/ifu/PCNext2F
add wave -noupdate -group {pc selection} /testbench/dut/core/ifu/PrivilegedNextPCM
add wave -noupdate -group {pc selection} /testbench/dut/core/ifu/PrivilegedChangePCM
add wave -noupdate -group ifu -color Gold /testbench/dut/core/lsu/bus/busdp/busfsm/BusCurrState
add wave -noupdate -group ifu -color Gold /testbench/dut/core/ifu/bus/busdp/busfsm/BusCurrState
add wave -noupdate -group ifu /testbench/dut/core/ifu/IFUBusRead
add wave -noupdate -group ifu /testbench/dut/core/ifu/IFUBusAdr
add wave -noupdate -group ifu /testbench/dut/core/ifu/IFUBusAck

View File

@ -92,7 +92,7 @@ module uncore (
// generate
// on-chip RAM
if (`RAM_SUPPORTED) begin : ram
ram_orig #(
ram #(
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
.HCLK, .HRESETn,
.HSELRam, .HADDR,

View File

@ -1,16 +1,19 @@
all: sqrttestgen testgen qst2
all: exptestgen testgen qslc_r4a2
sqrttestgen: sqrttestgen.c
gcc sqrttestgen.c -lm -o sqrttestgen
testgen: testgen.c
gcc testgen.c -lm -o testgen
qst2: qst2.c
gcc qst2.c -lm -o qst2
gcc -lm -o testgen testgen.c
./testgen
exptestgen: exptestgen.c
gcc -lm -o exptestgen exptestgen.c
./exptestgen
qslc_r4a2: qslc_r4a2.c
gcc qslc_r4a2.c -lm -o qslc_r4a2
./qslc_r4a2 >> qslc_r4a2.sv
clean:
rm -f testgen exptestgen qslc_r4a2

202
pipelined/srt/qslc_r4a2.c Normal file
View File

@ -0,0 +1,202 @@
/*
Program: qslc_r4a2.c
Description: Prints out Quotient Selection Table (assumes CPA is utilized to reduce memory)
User: James E. Stine
*/
#include <stdio.h>
#include <math.h>
#define DIVISOR_SIZE 3
#define CARRY_SIZE 7
#define SUM_SIZE 7
#define TOT_SIZE 7
void disp_binary(double, int, int);
struct bits {
unsigned int divisor : DIVISOR_SIZE;
int tot : TOT_SIZE;
} pla;
/*
Function: disp_binary
Description: This function displays a Double-Precision number into
four 16 bit integers using the global union variable
dp_number
Argument List: double x The value to be converted
int bits_to_left Number of bits left of radix point
int bits_to_right Number of bits right of radix point
Return value: none
*/
void disp_binary(double x, int bits_to_left, int bits_to_right) {
int i;
double diff;
if (fabs(x) < pow(2.0, ((double) -bits_to_right)) ) {
for (i = -bits_to_left + 1; i <= bits_to_right; i++) {
printf("0");
}
if (i == bits_to_right+1)
printf(" ");
return;
}
if (x < 0.0)
x = pow(2.0, ((double) bits_to_left)) + x;
for (i = -bits_to_left + 1; i <= bits_to_right; i++) {
diff = pow(2.0, ((double) -i) );
if (x < diff)
printf("0");
else {
printf("1");
x -= diff;
}
//if (i == 0)
//printf(" ");
}
}
int main() {
int m;
int n;
int o;
pla.divisor = 0;
pla.tot = 0;
printf(" case({D[5:3],Wmsbs})");
printf(" \n");
for (o=0; o < pow(2.0, DIVISOR_SIZE); o++) {
for (m=0; m < pow(2.0, TOT_SIZE); m++) {
printf(" 10'b");
disp_binary((double) pla.divisor, DIVISOR_SIZE, 0);
printf("_");
disp_binary((double) pla.tot, TOT_SIZE, 0);
printf(": q = 4'b");
/*
4 bits for Radix 4 (a=2)
1000 = +2
0100 = +1
0000 = 0
0010 = -1
0001 = -2
*/
switch (pla.divisor) {
case 0:
if ((pla.tot) >= 12)
printf("1000");
else if ((pla.tot) >= 4)
printf("0100");
else if ((pla.tot) >= -4)
printf("0000");
else if ((pla.tot) >= -13)
printf("0010");
else
printf("0001");
break;
case 1:
if ((pla.tot) >= 14)
printf("1000");
else if ((pla.tot) >= 4)
printf("0100");
else if ((pla.tot) >= -6)
printf("0000");
else if ((pla.tot) >= -15)
printf("0010");
else
printf("0001");
break;
case 2:
if ((pla.tot) >= 15)
printf("1000");
else if ((pla.tot) >= 4)
printf("0100");
else if ((pla.tot) >= -6)
printf("0000");
else if ((pla.tot) >= -16)
printf("0010");
else
printf("0001");
break;
case 3:
if ((pla.tot) >= 16)
printf("1000");
else if ((pla.tot) >= 4)
printf("0100");
else if ((pla.tot) >= -6)
printf("0000");
else if ((pla.tot) >= -18)
printf("0010");
else
printf("0001");
break;
case 4:
if ((pla.tot) >= 18)
printf("1000");
else if ((pla.tot) >= 6)
printf("0100");
else if ((pla.tot) >= -8)
printf("0000");
else if ((pla.tot) >= -20)
printf("0010");
else
printf("0001");
break;
case 5:
if ((pla.tot) >= 20)
printf("1000");
else if ((pla.tot) >= 6)
printf("0100");
else if ((pla.tot) >= -8)
printf("0000");
else if ((pla.tot) >= -20)
printf("0010");
else
printf("0001");
break;
case 6:
if ((pla.tot) >= 20)
printf("1000");
else if ((pla.tot) >= 8)
printf("0100");
else if ((pla.tot) >= -8)
printf("0000");
else if ((pla.tot) >= -22)
printf("0010");
else
printf("0001");
break;
case 7:
if ((pla.tot) >= 24)
printf("1000");
else if ((pla.tot) >= 8)
printf("0100");
else if ((pla.tot) >= -8)
printf("0000");
else if ((pla.tot) >= -24)
printf("0010");
else
printf("0001");
break;
default: printf ("XXX");
}
printf(";\n");
(pla.tot)++;
}
(pla.divisor)++;
}
printf(" endcase\n");
}

View File

@ -1,201 +0,0 @@
/*
Program: qst2.c
Description: Prints out QST (assumes CPA is utilized to reduce memory)
User: James E. Stine
*/
#include <stdio.h>
#include <math.h>
#define DIVISOR_SIZE 3
#define CARRY_SIZE 7
#define SUM_SIZE 7
#define TOT_SIZE 7
void disp_binary(double, int, int);
struct bits {
unsigned int divisor : DIVISOR_SIZE;
int tot : TOT_SIZE;
} pla;
/*
Function: disp_binary
Description: This function displays a Double-Precision number into
four 16 bit integers using the global union variable
dp_number
Argument List: double x The value to be converted
int bits_to_left Number of bits left of radix point
int bits_to_right Number of bits right of radix point
Return value: none
*/
void disp_binary(double x, int bits_to_left, int bits_to_right) {
int i;
double diff;
if (fabs(x) < pow(2.0, ((double) -bits_to_right)) ) {
for (i = -bits_to_left + 1; i <= bits_to_right; i++) {
printf("0");
}
if (i == bits_to_right+1)
printf(" ");
return;
}
if (x < 0.0)
x = pow(2.0, ((double) bits_to_left)) + x;
for (i = -bits_to_left + 1; i <= bits_to_right; i++) {
diff = pow(2.0, ((double) -i) );
if (x < diff)
printf("0");
else {
printf("1");
x -= diff;
}
if (i == 0)
printf(" ");
}
}
int main() {
int m;
int n;
int o;
pla.divisor = 0;
pla.tot = 0;
for (o=0; o < pow(2.0, DIVISOR_SIZE); o++) {
for (m=0; m < pow(2.0, TOT_SIZE); m++) {
disp_binary((double) pla.divisor, DIVISOR_SIZE, 0);
disp_binary((double) pla.tot, TOT_SIZE, 0);
/*
4 bits for Radix 4 (a=2)
1000 = +2
0100 = +1
0000 = 0
0010 = -1
0001 = -2
*/
switch (pla.divisor) {
case 0:
if ((pla.tot) >= 12)
printf(" 1000");
else if ((pla.tot) >= 4)
printf(" 0100");
else if ((pla.tot) >= -4)
printf(" 0000");
else if ((pla.tot) >= -13)
printf(" 0010");
else
printf(" 0001");
break;
case 1:
if ((pla.tot) >= 14)
printf(" 1000");
else if ((pla.tot) >= 4)
printf(" 0100");
else if ((pla.tot) >= -6)
printf(" 0000");
else if ((pla.tot) >= -15)
printf(" 0010");
else
printf(" 0001");
break;
case 2:
if ((pla.tot) >= 15)
printf(" 1000");
else if ((pla.tot) >= 4)
printf(" 0100");
else if ((pla.tot) >= -6)
printf(" 0000");
else if ((pla.tot) >= -16)
printf(" 0010");
else
printf(" 0001");
break;
case 3:
if ((pla.tot) >= 16)
printf(" 1000");
else if ((pla.tot) >= 4)
printf(" 0100");
else if ((pla.tot) >= -6)
printf(" 0000");
else if ((pla.tot) >= -18)
printf(" 0010");
else
printf(" 0001");
break;
case 4:
if ((pla.tot) >= 18)
printf(" 1000");
else if ((pla.tot) >= 6)
printf(" 0100");
else if ((pla.tot) >= -8)
printf(" 0000");
else if ((pla.tot) >= -20)
printf(" 0010");
else
printf(" 0001");
break;
case 5:
if ((pla.tot) >= 20)
printf(" 1000");
else if ((pla.tot) >= 6)
printf(" 0100");
else if ((pla.tot) >= -8)
printf(" 0000");
else if ((pla.tot) >= -20)
printf(" 0010");
else
printf(" 0001");
break;
case 6:
if ((pla.tot) >= 20)
printf(" 1000");
else if ((pla.tot) >= 8)
printf(" 0100");
else if ((pla.tot) >= -8)
printf(" 0000");
else if ((pla.tot) >= -22)
printf(" 0010");
else
printf(" 0001");
break;
case 7:
if ((pla.tot) >= 24)
printf(" 1000");
else if ((pla.tot) >= 8)
printf(" 0100");
else if ((pla.tot) >= -8)
printf(" 0000");
else if ((pla.tot) >= -24)
printf(" 0010");
else
printf(" 0001");
break;
default:
printf (" XXX");
}
printf("\n");
(pla.tot)++;
}
(pla.divisor)++;
}
}