From 63af54702c182ca422eb8189d5745add893f613d Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Mon, 24 Oct 2016 16:53:34 +0200 Subject: Improved tomthumbtestgen --- scripts/tomthumbtestgen/.gitignore | 4 -- scripts/tomthumbtestgen/README | 7 --- scripts/tomthumbtestgen/run.sh | 29 ------------- scripts/tomthumbtestgen/sections.lds | 7 --- scripts/tomthumbtestgen/start.S | 57 ------------------------- scripts/tomthumbtestgen/testbench.v | 79 ---------------------------------- scripts/tomthumbtg/.gitignore | 15 +++++++ scripts/tomthumbtg/README | 7 +++ scripts/tomthumbtg/run.sh | 43 +++++++++++++++++++ scripts/tomthumbtg/sections.lds | 7 +++ scripts/tomthumbtg/start.S | 57 +++++++++++++++++++++++++ scripts/tomthumbtg/testbench.v | 83 ++++++++++++++++++++++++++++++++++++ 12 files changed, 212 insertions(+), 183 deletions(-) delete mode 100644 scripts/tomthumbtestgen/.gitignore delete mode 100644 scripts/tomthumbtestgen/README delete mode 100644 scripts/tomthumbtestgen/run.sh delete mode 100644 scripts/tomthumbtestgen/sections.lds delete mode 100644 scripts/tomthumbtestgen/start.S delete mode 100644 scripts/tomthumbtestgen/testbench.v create mode 100644 scripts/tomthumbtg/.gitignore create mode 100644 scripts/tomthumbtg/README create mode 100644 scripts/tomthumbtg/run.sh create mode 100644 scripts/tomthumbtg/sections.lds create mode 100644 scripts/tomthumbtg/start.S create mode 100644 scripts/tomthumbtg/testbench.v (limited to 'scripts') diff --git a/scripts/tomthumbtestgen/.gitignore b/scripts/tomthumbtestgen/.gitignore deleted file mode 100644 index 0f06936..0000000 --- a/scripts/tomthumbtestgen/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -testbench -testgen.tgz -testgen -tests diff --git a/scripts/tomthumbtestgen/README b/scripts/tomthumbtestgen/README deleted file mode 100644 index 4e12ba8..0000000 --- a/scripts/tomthumbtestgen/README +++ /dev/null @@ -1,7 +0,0 @@ - -Testing PicoRV32 using the test case generator from -the Tom Thumb RISC-V CPU project: - -https://github.com/maikmerten/riscv-tomthumb -https://github.com/maikmerten/riscv-tomthumb-testgen - diff --git a/scripts/tomthumbtestgen/run.sh b/scripts/tomthumbtestgen/run.sh deleted file mode 100644 index e9c1fe5..0000000 --- a/scripts/tomthumbtestgen/run.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -set -ex - -if [ ! -f testgen.tgz ]; then - rm -f testgen.tgz.part - wget -O testgen.tgz.part http://maikmerten.de/testgen.tgz - mv testgen.tgz.part testgen.tgz -fi - -rm -rf tests testgen/ -tar xvzf testgen.tgz - -iverilog -o testbench -s testbench testbench.v ../../picorv32.v - -mkdir -p tests -for i in {0..999}; do - fn="tests/test_`printf '%03d' $i`" - - { - cat start.S - java -jar testgen/tomthumb-testgen-1.0-SNAPSHOT.jar - } > $fn.s - - riscv32-unknown-elf-gcc -ffreestanding -nostdlib -Wl,-Bstatic,-T,sections.lds -o $fn.elf $fn.s - riscv32-unknown-elf-objcopy -O binary $fn.elf $fn.bin - python3 ../../firmware/makehex.py $fn.bin 16384 > $fn.hex - vvp -N ./testbench +hex=tests/test_000.hex -done diff --git a/scripts/tomthumbtestgen/sections.lds b/scripts/tomthumbtestgen/sections.lds deleted file mode 100644 index 8962f5c..0000000 --- a/scripts/tomthumbtestgen/sections.lds +++ /dev/null @@ -1,7 +0,0 @@ -SECTIONS { - .memory : { - . = 0; - *(.text); - *(*); - } -} diff --git a/scripts/tomthumbtestgen/start.S b/scripts/tomthumbtestgen/start.S deleted file mode 100644 index 541c8a4..0000000 --- a/scripts/tomthumbtestgen/start.S +++ /dev/null @@ -1,57 +0,0 @@ -.section .text.start -.global testcollection - -/* zero-initialize all registers */ -addi x1, zero, 0 -addi x2, zero, 0 -addi x3, zero, 0 -addi x4, zero, 0 -addi x5, zero, 0 -addi x6, zero, 0 -addi x7, zero, 0 -addi x8, zero, 0 -addi x9, zero, 0 -addi x10, zero, 0 -addi x11, zero, 0 -addi x12, zero, 0 -addi x13, zero, 0 -addi x14, zero, 0 -addi x15, zero, 0 -addi x16, zero, 0 -addi x17, zero, 0 -addi x18, zero, 0 -addi x19, zero, 0 -addi x20, zero, 0 -addi x21, zero, 0 -addi x22, zero, 0 -addi x23, zero, 0 -addi x24, zero, 0 -addi x25, zero, 0 -addi x26, zero, 0 -addi x27, zero, 0 -addi x28, zero, 0 -addi x29, zero, 0 -addi x30, zero, 0 -addi x31, zero, 0 - -/* set stack pointer */ -lui sp, %hi(64*1024) -addi sp, sp, %lo(64*1024) - -/* push zeros on the stack for argc and argv */ -/* (stack is aligned to 16 bytes in riscv calling convention) */ -addi sp,sp,-16 -sw zero,0(sp) -sw zero,4(sp) -sw zero,8(sp) -sw zero,12(sp) - -/* call test */ -call testcollection - -/* write test results */ -lui x1, %hi(0x10000000) -addi x1, x1, %lo(0x10000000) -sw x5, 0(x1) - -ebreak diff --git a/scripts/tomthumbtestgen/testbench.v b/scripts/tomthumbtestgen/testbench.v deleted file mode 100644 index 169700e..0000000 --- a/scripts/tomthumbtestgen/testbench.v +++ /dev/null @@ -1,79 +0,0 @@ -`timescale 1 ns / 1 ps - -module testbench; - reg clk = 1; - reg resetn = 0; - wire trap; - - always #5 clk = ~clk; - - initial begin - repeat (100) @(posedge clk); - resetn <= 1; - end - - wire mem_valid; - wire mem_instr; - reg mem_ready; - wire [31:0] mem_addr; - wire [31:0] mem_wdata; - wire [3:0] mem_wstrb; - reg [31:0] mem_rdata; - - picorv32 #( - ) uut ( - .clk (clk ), - .resetn (resetn ), - .trap (trap ), - .mem_valid (mem_valid ), - .mem_instr (mem_instr ), - .mem_ready (mem_ready ), - .mem_addr (mem_addr ), - .mem_wdata (mem_wdata ), - .mem_wstrb (mem_wstrb ), - .mem_rdata (mem_rdata ) - ); - - reg [31:0] memory [0:16*1024-1]; - reg [1023:0] hex_filename; - - initial begin - if ($value$plusargs("hex=%s", hex_filename)) - $readmemh(hex_filename, memory); - end - - initial begin - // $dumpfile("testbench.vcd"); - // $dumpvars(0, testbench); - end - - always @(posedge clk) begin - if (resetn && trap) begin - repeat (10) @(posedge clk); - $display("TRAP"); - $stop; - end - end - - always @(posedge clk) begin - mem_ready <= 0; - if (mem_valid && !mem_ready) begin - mem_ready <= 1; - if (mem_addr == 32'h 1000_0000) begin - if (mem_wdata != -32'd1) begin - $display("Failed test case: %d", mem_wdata); - $stop; - end else begin - $display("OK."); - $finish; - end - end else begin - mem_rdata <= memory[mem_addr >> 2]; - if (mem_wstrb[0]) memory[mem_addr >> 2][ 7: 0] <= mem_wdata[ 7: 0]; - if (mem_wstrb[1]) memory[mem_addr >> 2][15: 8] <= mem_wdata[15: 8]; - if (mem_wstrb[2]) memory[mem_addr >> 2][23:16] <= mem_wdata[23:16]; - if (mem_wstrb[3]) memory[mem_addr >> 2][31:24] <= mem_wdata[31:24]; - end - end - end -endmodule diff --git a/scripts/tomthumbtg/.gitignore b/scripts/tomthumbtg/.gitignore new file mode 100644 index 0000000..c1e6b04 --- /dev/null +++ b/scripts/tomthumbtg/.gitignore @@ -0,0 +1,15 @@ +testbench_a +testbench_b +testbench_c +testbench_d +testbench_e +testbench_f +testbench_g +testbench_h +testbench_i +testbench_j +testbench_k +testbench_l +testgen.tgz +testgen +tests diff --git a/scripts/tomthumbtg/README b/scripts/tomthumbtg/README new file mode 100644 index 0000000..4e12ba8 --- /dev/null +++ b/scripts/tomthumbtg/README @@ -0,0 +1,7 @@ + +Testing PicoRV32 using the test case generator from +the Tom Thumb RISC-V CPU project: + +https://github.com/maikmerten/riscv-tomthumb +https://github.com/maikmerten/riscv-tomthumb-testgen + diff --git a/scripts/tomthumbtg/run.sh b/scripts/tomthumbtg/run.sh new file mode 100644 index 0000000..dcce6bd --- /dev/null +++ b/scripts/tomthumbtg/run.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -ex + +if [ ! -f testgen.tgz ]; then + rm -f testgen.tgz.part + wget -O testgen.tgz.part http://maikmerten.de/testgen.tgz + mv testgen.tgz.part testgen.tgz +fi + +rm -rf tests testgen/ +tar xvzf testgen.tgz + +iverilog -o testbench_a -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=0 +iverilog -o testbench_b -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=1 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=0 +iverilog -o testbench_c -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=1 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=0 + +iverilog -o testbench_d -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=0 +iverilog -o testbench_e -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=1 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=0 +iverilog -o testbench_f -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=1 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=0 + +iverilog -o testbench_g -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=1 +iverilog -o testbench_h -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=1 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=1 +iverilog -o testbench_i -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=1 -DTWO_CYCLE_COMPARE=0 -DTWO_CYCLE_ALU=1 + +iverilog -o testbench_j -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=1 +iverilog -o testbench_k -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=1 -DBARREL_SHIFTER=0 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=1 +iverilog -o testbench_l -s testbench testbench.v ../../picorv32.v -DTWO_STAGE_SHIFT=0 -DBARREL_SHIFTER=1 -DTWO_CYCLE_COMPARE=1 -DTWO_CYCLE_ALU=1 + +mkdir -p tests +for i in {0..999}; do + fn="tests/test_`printf '%03d' $i`" + + { + cat start.S + java -jar testgen/tomthumb-testgen-1.0-SNAPSHOT.jar + } > $fn.s + + riscv32-unknown-elf-gcc -ffreestanding -nostdlib -Wl,-Bstatic,-T,sections.lds -o $fn.elf $fn.s + riscv32-unknown-elf-objcopy -O binary $fn.elf $fn.bin + python3 ../../firmware/makehex.py $fn.bin 16384 > $fn.hex + for tb in testbench_{a,b,c,d,e,f,g,h,i,j,k,l}; do vvp -N $tb +hex=$fn.hex; done +done diff --git a/scripts/tomthumbtg/sections.lds b/scripts/tomthumbtg/sections.lds new file mode 100644 index 0000000..8962f5c --- /dev/null +++ b/scripts/tomthumbtg/sections.lds @@ -0,0 +1,7 @@ +SECTIONS { + .memory : { + . = 0; + *(.text); + *(*); + } +} diff --git a/scripts/tomthumbtg/start.S b/scripts/tomthumbtg/start.S new file mode 100644 index 0000000..541c8a4 --- /dev/null +++ b/scripts/tomthumbtg/start.S @@ -0,0 +1,57 @@ +.section .text.start +.global testcollection + +/* zero-initialize all registers */ +addi x1, zero, 0 +addi x2, zero, 0 +addi x3, zero, 0 +addi x4, zero, 0 +addi x5, zero, 0 +addi x6, zero, 0 +addi x7, zero, 0 +addi x8, zero, 0 +addi x9, zero, 0 +addi x10, zero, 0 +addi x11, zero, 0 +addi x12, zero, 0 +addi x13, zero, 0 +addi x14, zero, 0 +addi x15, zero, 0 +addi x16, zero, 0 +addi x17, zero, 0 +addi x18, zero, 0 +addi x19, zero, 0 +addi x20, zero, 0 +addi x21, zero, 0 +addi x22, zero, 0 +addi x23, zero, 0 +addi x24, zero, 0 +addi x25, zero, 0 +addi x26, zero, 0 +addi x27, zero, 0 +addi x28, zero, 0 +addi x29, zero, 0 +addi x30, zero, 0 +addi x31, zero, 0 + +/* set stack pointer */ +lui sp, %hi(64*1024) +addi sp, sp, %lo(64*1024) + +/* push zeros on the stack for argc and argv */ +/* (stack is aligned to 16 bytes in riscv calling convention) */ +addi sp,sp,-16 +sw zero,0(sp) +sw zero,4(sp) +sw zero,8(sp) +sw zero,12(sp) + +/* call test */ +call testcollection + +/* write test results */ +lui x1, %hi(0x10000000) +addi x1, x1, %lo(0x10000000) +sw x5, 0(x1) + +ebreak diff --git a/scripts/tomthumbtg/testbench.v b/scripts/tomthumbtg/testbench.v new file mode 100644 index 0000000..c39ebca --- /dev/null +++ b/scripts/tomthumbtg/testbench.v @@ -0,0 +1,83 @@ +`timescale 1 ns / 1 ps + +module testbench; + reg clk = 1; + reg resetn = 0; + wire trap; + + always #5 clk = ~clk; + + initial begin + repeat (100) @(posedge clk); + resetn <= 1; + end + + wire mem_valid; + wire mem_instr; + reg mem_ready; + wire [31:0] mem_addr; + wire [31:0] mem_wdata; + wire [3:0] mem_wstrb; + reg [31:0] mem_rdata; + + picorv32 #( + .TWO_STAGE_SHIFT(`TWO_STAGE_SHIFT), + .BARREL_SHIFTER(`BARREL_SHIFTER), + .TWO_CYCLE_COMPARE(`TWO_CYCLE_COMPARE), + .TWO_CYCLE_ALU(`TWO_CYCLE_ALU) + ) uut ( + .clk (clk ), + .resetn (resetn ), + .trap (trap ), + .mem_valid (mem_valid ), + .mem_instr (mem_instr ), + .mem_ready (mem_ready ), + .mem_addr (mem_addr ), + .mem_wdata (mem_wdata ), + .mem_wstrb (mem_wstrb ), + .mem_rdata (mem_rdata ) + ); + + reg [31:0] memory [0:16*1024-1]; + reg [1023:0] hex_filename; + + initial begin + if ($value$plusargs("hex=%s", hex_filename)) + $readmemh(hex_filename, memory); + end + + initial begin + // $dumpfile("testbench.vcd"); + // $dumpvars(0, testbench); + end + + always @(posedge clk) begin + if (resetn && trap) begin + repeat (10) @(posedge clk); + $display("TRAP"); + $stop; + end + end + + always @(posedge clk) begin + mem_ready <= 0; + if (mem_valid && !mem_ready) begin + mem_ready <= 1; + if (mem_addr == 32'h 1000_0000) begin + if (mem_wdata != -32'd1) begin + $display("Failed test case: %d", mem_wdata); + $stop; + end else begin + $display("OK."); + $finish; + end + end else begin + mem_rdata <= memory[mem_addr >> 2]; + if (mem_wstrb[0]) memory[mem_addr >> 2][ 7: 0] <= mem_wdata[ 7: 0]; + if (mem_wstrb[1]) memory[mem_addr >> 2][15: 8] <= mem_wdata[15: 8]; + if (mem_wstrb[2]) memory[mem_addr >> 2][23:16] <= mem_wdata[23:16]; + if (mem_wstrb[3]) memory[mem_addr >> 2][31:24] <= mem_wdata[31:24]; + end + end + end +endmodule -- cgit