mirror of
https://github.com/openhwgroup/cvw
synced 2025-01-23 13:04:28 +00:00
Merge branch 'busybear' into main
Merging busybear testbench into main, keeping main edits of wally src
This commit is contained in:
commit
c7e2259af0
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
**/work
|
||||
|
||||
#vsim work files to ignore
|
||||
transcript
|
||||
vsim.wlf
|
||||
wally-pipelined/wlft*
|
154
wally-pipelined/src/testbench-busybear.sv
Normal file
154
wally-pipelined/src/testbench-busybear.sv
Normal file
@ -0,0 +1,154 @@
|
||||
`include "wally-macros.sv"
|
||||
|
||||
module testbench_busybear #(parameter XLEN=64, MISA=32'h00000104, ZCSR = 1, ZCOUNTERS = 1)();
|
||||
|
||||
logic clk, reset;
|
||||
logic [XLEN-1:0] WriteDataM, DataAdrM;
|
||||
logic [1:0] MemRWM;
|
||||
logic [31:0] GPIOPinsIn;
|
||||
logic [31:0] GPIOPinsOut, GPIOPinsEn;
|
||||
|
||||
// instantiate device to be tested
|
||||
logic [XLEN-1:0] PCF, ReadDataM;
|
||||
logic [31:0] InstrF;
|
||||
logic [7:0] ByteMaskM;
|
||||
logic InstrAccessFaultF, DataAccessFaultM;
|
||||
logic TimerIntM, SwIntM; // from CLINT
|
||||
logic ExtIntM = 0; // not yet connected
|
||||
|
||||
// for now, seem to need these to be zero until we get a better idea
|
||||
assign InstrAccessFaultF = 0;
|
||||
assign DataAccessFaultM = 0;
|
||||
|
||||
// instantiate processor and memories
|
||||
wallypipelinedhart #(XLEN, MISA, ZCSR, ZCOUNTERS) dut(.ALUResultM(DataAdrM), .*);
|
||||
|
||||
// initialize test
|
||||
initial
|
||||
begin
|
||||
reset <= 1; # 22; reset <= 0;
|
||||
end
|
||||
|
||||
// read pc trace file
|
||||
integer data_file_PC, scan_file_PC;
|
||||
initial begin
|
||||
data_file_PC = $fopen("busybear-testgen/parsedPC.txt", "r");
|
||||
if (data_file_PC == 0) begin
|
||||
$display("file couldn't be opened");
|
||||
$stop;
|
||||
end
|
||||
end
|
||||
|
||||
// read register trace file
|
||||
integer data_file_rf, scan_file_rf;
|
||||
initial begin
|
||||
data_file_rf = $fopen("busybear-testgen/parsedRegs.txt", "r");
|
||||
if (data_file_rf == 0) begin
|
||||
$display("file couldn't be opened");
|
||||
$stop;
|
||||
end
|
||||
end
|
||||
|
||||
// read memreads trace file
|
||||
integer data_file_mem, scan_file_mem;
|
||||
initial begin
|
||||
data_file_mem = $fopen("busybear-testgen/parsedMemRead.txt", "r");
|
||||
if (data_file_mem == 0) begin
|
||||
$display("file couldn't be opened");
|
||||
$stop;
|
||||
end
|
||||
end
|
||||
|
||||
logic [63:0] rfExpected[31:1];
|
||||
logic [63:0] pcExpected;
|
||||
// I apologize for this hack, I don't have a clue how to properly work with packed arrays
|
||||
logic [64*32:64] rf;
|
||||
genvar i;
|
||||
generate
|
||||
for(i=1; i<32; i++) begin
|
||||
assign rf[i*64+63:i*64] = dut.dp.regf.rf[i];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
always @(rf) begin
|
||||
for(int j=1; j<32; j++) begin
|
||||
// read 31 integer registers
|
||||
scan_file_rf = $fscanf(data_file_rf, "%x\n", rfExpected[j]);
|
||||
// check things!
|
||||
if (rf[j*64+63 -: 64] != rfExpected[j]) begin
|
||||
$display("%t ps: rf[%0d] does not equal rf expected: %x, %x", $time, j, rf[j*64+63 -: 64], rfExpected[j]);
|
||||
// $stop;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// this might need to change
|
||||
always @(MemRWM or DataAdrM) begin
|
||||
if (MemRWM != 0) begin
|
||||
scan_file_mem = $fscanf(data_file_mem, "%x\n", ReadDataM);
|
||||
end
|
||||
end
|
||||
|
||||
logic speculative, nextSpec;
|
||||
initial begin
|
||||
speculative = 0;
|
||||
nextSpec = 0;
|
||||
end
|
||||
|
||||
always @(PCF) begin
|
||||
speculative <= nextSpec;
|
||||
if (speculative) begin
|
||||
speculative <= (PCF != pcExpected);
|
||||
end
|
||||
if (~speculative) begin
|
||||
// first read instruction
|
||||
scan_file_PC = $fscanf(data_file_PC, "%x\n", InstrF);
|
||||
// then expected PC value
|
||||
scan_file_PC = $fscanf(data_file_PC, "%x\n", pcExpected);
|
||||
// are we at a branch/jump?
|
||||
case (InstrF[6:0]) //todo: add C versions of these
|
||||
7'b1101111, //JAL
|
||||
7'b1100111, //JALR
|
||||
7'b1100011: //B
|
||||
nextSpec <= 1;
|
||||
default:
|
||||
nextSpec <= 0;
|
||||
endcase
|
||||
|
||||
//check things!
|
||||
if ((~nextSpec) && (PCF !== pcExpected)) begin
|
||||
$display("%t ps: PC does not equal PC expected: %x, %x", $time, PCF, pcExpected);
|
||||
// $stop;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// Track names of instructions
|
||||
string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName;
|
||||
logic [31:0] InstrW;
|
||||
instrNameDecTB dec(InstrF, InstrFName);
|
||||
instrTrackerTB #(XLEN) it(clk, reset, dut.dp.FlushE,
|
||||
dut.dp.InstrDecompD, dut.dp.InstrE,
|
||||
dut.dp.InstrM, InstrW,
|
||||
InstrDName, InstrEName, InstrMName, InstrWName);
|
||||
|
||||
// generate clock to sequence tests
|
||||
always
|
||||
begin
|
||||
clk <= 1; # 5; clk <= 0; # 5;
|
||||
end
|
||||
|
||||
//// check results
|
||||
//always @(negedge clk)
|
||||
// begin
|
||||
// if(MemWrite) begin
|
||||
// if(DataAdr === 84 & WriteData === 71) begin
|
||||
// $display("Simulation succeeded");
|
||||
// $stop;
|
||||
// end else if (DataAdr !== 80) begin
|
||||
// $display("Simulation failed");
|
||||
// $stop;
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
endmodule
|
126
wally-pipelined/wally-busybear.do
Normal file
126
wally-pipelined/wally-busybear.do
Normal file
@ -0,0 +1,126 @@
|
||||
# wally-pipelined.do
|
||||
#
|
||||
# Modification by Oklahoma State University & Harvey Mudd College
|
||||
# Use with testbench_busybear
|
||||
# James Stine, 2008; David Harris 2021
|
||||
# Go Cowboys!!!!!!
|
||||
#
|
||||
# Takes 1:10 to run RV64IC tests using gui
|
||||
|
||||
# Use this wally-pipelined.do file to run this example.
|
||||
# Either bring up ModelSim and type the following at the "ModelSim>" prompt:
|
||||
# do wally-pipelined.do
|
||||
# or, to run from a shell, type the following at the shell prompt:
|
||||
# vsim -do wally-pipelined.do -c
|
||||
# (omit the "-c" to see the GUI while running from the shell)
|
||||
|
||||
onbreak {resume}
|
||||
|
||||
# create library
|
||||
if [file exists work] {
|
||||
vdel -all
|
||||
}
|
||||
vlib work
|
||||
|
||||
# compile source files
|
||||
# suppress spurious warnngs about
|
||||
# "Extra checking for conflicts with always_comb done at vopt time"
|
||||
# because vsim will run vopt
|
||||
vlog src/*.sv -suppress 2583
|
||||
|
||||
# start and run simulation
|
||||
# remove +acc flag for faster sim during regressions if there is no need to access internal signals
|
||||
vopt +acc work.testbench_busybear -o workopt
|
||||
vsim workopt
|
||||
|
||||
view wave
|
||||
|
||||
-- display input and output signals as hexidecimal values
|
||||
# Diplays All Signals recursively
|
||||
add wave /testbench_busybear/clk
|
||||
add wave /testbench_busybear/reset
|
||||
add wave -divider
|
||||
add wave -hex /testbench_busybear/pcExpected
|
||||
add wave -hex /testbench_busybear/dut/dp/PCF
|
||||
add wave -hex /testbench_busybear/dut/dp/InstrF
|
||||
add wave -divider
|
||||
# registers!
|
||||
add wave -hex /testbench_busybear/rfExpected
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[1]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[2]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[3]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[4]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[5]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[6]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[7]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[8]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[9]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[10]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[11]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[12]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[13]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[14]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[15]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[16]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[17]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[18]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[19]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[20]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[21]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[22]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[23]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[24]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[25]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[26]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[27]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[28]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[29]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[30]
|
||||
add wave -hex /testbench_busybear/dut/dp/regf/rf[31]
|
||||
add wave /testbench_busybear/InstrFName
|
||||
add wave -hex /testbench_busybear/dut/dp/PCD
|
||||
#add wave -hex /testbench_busybear/dut/dp/InstrD
|
||||
add wave /testbench_busybear/InstrDName
|
||||
#add wave -divider
|
||||
add wave -hex /testbench_busybear/dut/dp/PCE
|
||||
##add wave -hex /testbench_busybear/dut/dp/InstrE
|
||||
add wave /testbench_busybear/InstrEName
|
||||
#add wave -hex /testbench_busybear/dut/dp/SrcAE
|
||||
#add wave -hex /testbench_busybear/dut/dp/SrcBE
|
||||
#add wave -hex /testbench_busybear/dut/dp/ALUResultE
|
||||
#add wave /testbench_busybear/dut/dp/PCSrcE
|
||||
#add wave -divider
|
||||
add wave -hex /testbench_busybear/dut/dp/PCM
|
||||
##add wave -hex /testbench_busybear/dut/dp/InstrM
|
||||
add wave /testbench_busybear/InstrMName
|
||||
#add wave /testbench_busybear/dut/dmem/dtim/memwrite
|
||||
#add wave -hex /testbench_busybear/dut/dmem/AdrM
|
||||
#add wave -hex /testbench_busybear/dut/dmem/WriteDataM
|
||||
#add wave -divider
|
||||
add wave -hex /testbench_busybear/dut/dp/PCW
|
||||
##add wave -hex /testbench_busybear/dut/dp/InstrW
|
||||
add wave /testbench_busybear/InstrWName
|
||||
#add wave /testbench_busybear/dut/dp/RegWriteW
|
||||
#add wave -hex /testbench_busybear/dut/dp/ResultW
|
||||
#add wave -hex /testbench_busybear/dut/dp/RdW
|
||||
#add wave -divider
|
||||
##add ww
|
||||
#add wave -hex -r /testbench_busybear/*
|
||||
#
|
||||
#-- Set Wave Output Items
|
||||
#TreeUpdate [SetDefaultTree]
|
||||
#WaveRestoreZoom {0 ps} {100 ps}
|
||||
#configure wave -namecolwidth 250
|
||||
#configure wave -valuecolwidth 120
|
||||
#configure wave -justifyvalue left
|
||||
#configure wave -signalnamewidth 0
|
||||
#configure wave -snapdistance 10
|
||||
#configure wave -datasetprefix 0
|
||||
#configure wave -rowmargin 4
|
||||
#configure wave -childrowmargin 2
|
||||
#set DefaultRadix hexadecimal
|
||||
#
|
||||
#-- Run the Simulation
|
||||
run 300
|
||||
#run -all
|
||||
##quit
|
Loading…
Reference in New Issue
Block a user