Added scripts/tomthumbtestgen
This commit is contained in:
parent
3ebf325c96
commit
f79c8344fe
|
@ -0,0 +1,4 @@
|
||||||
|
testbench
|
||||||
|
testgen.tgz
|
||||||
|
testgen
|
||||||
|
tests
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/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
|
|
@ -0,0 +1,7 @@
|
||||||
|
SECTIONS {
|
||||||
|
.memory : {
|
||||||
|
. = 0;
|
||||||
|
*(.text);
|
||||||
|
*(*);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -0,0 +1,79 @@
|
||||||
|
`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
|
Loading…
Reference in New Issue