mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of github.com:davidharrishmc/riscv-wally into main
This commit is contained in:
commit
24aa410984
File diff suppressed because one or more lines are too long
@ -70,21 +70,21 @@ module fpgaTop
|
||||
wire peripheral_aresetn;
|
||||
wire mb_reset;
|
||||
|
||||
wire [`AHBW-1:0] HRDATAEXT;
|
||||
wire HREADYEXT;
|
||||
wire HRESPEXT;
|
||||
wire HSELEXT;
|
||||
wire HCLKOpen;
|
||||
wire HRESETnOpen;
|
||||
wire [31:0] HADDR;
|
||||
wire [`AHBW-1:0] HWDATA;
|
||||
wire HWRITE;
|
||||
wire [2:0] HSIZE;
|
||||
wire [2:0] HBURST;
|
||||
(* mark_debug = "true" *) wire [`AHBW-1:0] HRDATAEXT;
|
||||
(* mark_debug = "true" *) wire HREADYEXT;
|
||||
(* mark_debug = "true" *) wire HRESPEXT;
|
||||
(* mark_debug = "true" *) wire HSELEXT;
|
||||
(* mark_debug = "true" *) wire [31:0] HADDR;
|
||||
(* mark_debug = "true" *) wire [`AHBW-1:0] HWDATA;
|
||||
(* mark_debug = "true" *) wire HWRITE;
|
||||
(* mark_debug = "true" *) wire [2:0] HSIZE;
|
||||
(* mark_debug = "true" *) wire [2:0] HBURST;
|
||||
(* mark_debug = "true" *) wire [1:0] HTRANS;
|
||||
(* mark_debug = "true" *) wire HREADY;
|
||||
wire [3:0] HPROT;
|
||||
wire [1:0] HTRANS;
|
||||
wire HMASTLOCK;
|
||||
wire HREADY;
|
||||
|
||||
|
||||
|
||||
@ -94,41 +94,41 @@ module fpgaTop
|
||||
wire SDCCmdOE;
|
||||
wire SDCCmdOut;
|
||||
|
||||
wire [3:0] m_axi_awid;
|
||||
wire [7:0] m_axi_awlen;
|
||||
wire [2:0] m_axi_awsize;
|
||||
wire [1:0] m_axi_awburst;
|
||||
wire [3:0] m_axi_awcache;
|
||||
wire [31:0] m_axi_awaddr;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_awid;
|
||||
(* mark_debug = "true" *) wire [7:0] m_axi_awlen;
|
||||
(* mark_debug = "true" *) wire [2:0] m_axi_awsize;
|
||||
(* mark_debug = "true" *) wire [1:0] m_axi_awburst;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_awcache;
|
||||
(* mark_debug = "true" *) wire [31:0] m_axi_awaddr;
|
||||
wire [2:0] m_axi_awprot;
|
||||
wire m_axi_awvalid;
|
||||
wire m_axi_awready;
|
||||
wire m_axi_awlock;
|
||||
wire [63:0] m_axi_wdata;
|
||||
wire [7:0] m_axi_wstrb;
|
||||
wire m_axi_wlast;
|
||||
wire m_axi_wvalid;
|
||||
wire m_axi_wready;
|
||||
wire [3:0] m_axi_bid;
|
||||
wire [1:0] m_axi_bresp;
|
||||
wire m_axi_bvalid;
|
||||
wire m_axi_bready;
|
||||
wire [3:0] m_axi_arid;
|
||||
wire [7:0] m_axi_arlen;
|
||||
wire [2:0] m_axi_arsize;
|
||||
wire [1:0] m_axi_arburst;
|
||||
(* mark_debug = "true" *) wire m_axi_awvalid;
|
||||
(* mark_debug = "true" *) wire m_axi_awready;
|
||||
(* mark_debug = "true" *) wire m_axi_awlock;
|
||||
(* mark_debug = "true" *) wire [63:0] m_axi_wdata;
|
||||
(* mark_debug = "true" *) wire [7:0] m_axi_wstrb;
|
||||
(* mark_debug = "true" *) wire m_axi_wlast;
|
||||
(* mark_debug = "true" *) wire m_axi_wvalid;
|
||||
(* mark_debug = "true" *) wire m_axi_wready;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_bid;
|
||||
(* mark_debug = "true" *) wire [1:0] m_axi_bresp;
|
||||
(* mark_debug = "true" *) wire m_axi_bvalid;
|
||||
(* mark_debug = "true" *) wire m_axi_bready;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_arid;
|
||||
(* mark_debug = "true" *) wire [7:0] m_axi_arlen;
|
||||
(* mark_debug = "true" *) wire [2:0] m_axi_arsize;
|
||||
(* mark_debug = "true" *) wire [1:0] m_axi_arburst;
|
||||
wire [2:0] m_axi_arprot;
|
||||
wire [3:0] m_axi_arcache;
|
||||
wire m_axi_arvalid;
|
||||
wire [31:0] m_axi_araddr;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_arcache;
|
||||
(* mark_debug = "true" *) wire m_axi_arvalid;
|
||||
(* mark_debug = "true" *) wire [31:0] m_axi_araddr;
|
||||
wire m_axi_arlock;
|
||||
wire m_axi_arready;
|
||||
wire [3:0] m_axi_rid;
|
||||
wire [63:0] m_axi_rdata;
|
||||
wire [1:0] m_axi_rresp;
|
||||
wire m_axi_rvalid;
|
||||
wire m_axi_rlast;
|
||||
wire m_axi_rready;
|
||||
(* mark_debug = "true" *) wire m_axi_arready;
|
||||
(* mark_debug = "true" *) wire [3:0] m_axi_rid;
|
||||
(* mark_debug = "true" *) wire [63:0] m_axi_rdata;
|
||||
(* mark_debug = "true" *) wire [1:0] m_axi_rresp;
|
||||
(* mark_debug = "true" *) wire m_axi_rvalid;
|
||||
(* mark_debug = "true" *) wire m_axi_rlast;
|
||||
(* mark_debug = "true" *) wire m_axi_rready;
|
||||
|
||||
wire [3:0] BUS_axi_arregion;
|
||||
wire [3:0] BUS_axi_arqos;
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
`include "wally-config.vh"
|
||||
|
||||
module ahbinterface #(parameter WRITEABLE = 0)
|
||||
module ahbinterface #(parameter WRITEABLE = 0) // **** modify to use LSU/ifu parameter to control widths of buses
|
||||
(
|
||||
input logic HCLK, HRESETn,
|
||||
|
||||
@ -57,6 +57,7 @@ module ahbinterface #(parameter WRITEABLE = 0)
|
||||
|
||||
logic CaptureEn;
|
||||
|
||||
/// *** only 32 bit for IFU.
|
||||
flopen #(`XLEN) fb(.clk(HCLK), .en(CaptureEn), .d(HRDATA), .q(ReadDataWord));
|
||||
|
||||
if(WRITEABLE) begin
|
||||
|
@ -41,6 +41,7 @@ module ahbmulticontroller
|
||||
input logic clk, reset,
|
||||
// Signals from IFU
|
||||
input logic [`PA_BITS-1:0] IFUHADDR,
|
||||
input logic [2:0] IFUHSIZE,
|
||||
input logic [2:0] IFUHBURST,
|
||||
input logic [1:0] IFUHTRANS,
|
||||
output logic IFUHREADY,
|
||||
@ -69,28 +70,23 @@ module ahbmulticontroller
|
||||
(* mark_debug = "true" *) output logic HMASTLOCK
|
||||
);
|
||||
|
||||
localparam ADRBITS = $clog2(`XLEN/8); // address bits for Byte Mask generator
|
||||
|
||||
typedef enum logic [1:0] {IDLE, ARBITRATE} statetype;
|
||||
statetype CurrState, NextState;
|
||||
logic LSUGrant;
|
||||
logic [ADRBITS-1:0] HADDRD;
|
||||
logic [1:0] HSIZED;
|
||||
|
||||
logic [1:0] save, restore, dis, sel;
|
||||
logic both;
|
||||
|
||||
logic [`PA_BITS-1:0] IFUHADDRSave, IFUHADDROut;
|
||||
logic [1:0] IFUHTRANSSave, IFUHTRANSOut;
|
||||
logic [2:0] IFUHBURSTSave, IFUHBURSTOut;
|
||||
logic [`PA_BITS-1:0] IFUHADDROut;
|
||||
logic [1:0] IFUHTRANSOut;
|
||||
logic [2:0] IFUHBURSTOut;
|
||||
logic [2:0] IFUHSIZEOut;
|
||||
logic IFUHWRITEOut;
|
||||
|
||||
logic [`PA_BITS-1:0] LSUHADDRSave, LSUHADDROut;
|
||||
logic [1:0] LSUHTRANSSave, LSUHTRANSOut;
|
||||
logic [2:0] LSUHBURSTSave, LSUHBURSTOut;
|
||||
logic [2:0] LSUHSIZESave, LSUHSIZEOut;
|
||||
logic LSUHWRITESave, LSUHWRITEOut;
|
||||
logic [`PA_BITS-1:0] LSUHADDROut;
|
||||
logic [1:0] LSUHTRANSOut;
|
||||
logic [2:0] LSUHBURSTOut;
|
||||
logic [2:0] LSUHSIZEOut;
|
||||
logic LSUHWRITEOut;
|
||||
|
||||
logic IFUReq, LSUReq;
|
||||
logic IFUActive, LSUActive;
|
||||
@ -112,7 +108,7 @@ module ahbmulticontroller
|
||||
// input stage IFU
|
||||
controllerinputstage IFUInput(.HCLK, .HRESETn, .Save(save[0]), .Restore(restore[0]), .Disable(dis[0]),
|
||||
.Request(IFUReq), .Active(IFUActive),
|
||||
.HWRITEin(1'b0), .HSIZEin(3'b010), .HBURSTin(IFUHBURST), .HTRANSin(IFUHTRANS), .HADDRin(IFUHADDR),
|
||||
.HWRITEin(1'b0), .HSIZEin(IFUHSIZE), .HBURSTin(IFUHBURST), .HTRANSin(IFUHTRANS), .HADDRin(IFUHADDR),
|
||||
.HWRITEOut(IFUHWRITEOut), .HSIZEOut(IFUHSIZEOut), .HBURSTOut(IFUHBURSTOut), .HREADYOut(IFUHREADY),
|
||||
.HTRANSOut(IFUHTRANSOut), .HADDROut(IFUHADDROut), .HREADYin(HREADY));
|
||||
|
||||
@ -125,7 +121,7 @@ module ahbmulticontroller
|
||||
|
||||
// output mux //*** rewrite for general number of controllers.
|
||||
assign HADDR = sel[1] ? LSUHADDROut : sel[0] ? IFUHADDROut : '0;
|
||||
assign HSIZE = sel[1] ? LSUHSIZEOut : sel[0] ? 3'b010: '0; // Instruction reads are always 32 bits
|
||||
assign HSIZE = sel[1] ? LSUHSIZEOut : sel[0] ? IFUHSIZEOut: '0;
|
||||
assign HBURST = sel[1] ? LSUHBURSTOut : sel[0] ? IFUHBURSTOut : '0; // If doing memory accesses, use LSUburst, else use Instruction burst.
|
||||
assign HTRANS = sel[1] ? LSUHTRANSOut : sel[0] ? IFUHTRANSOut: '0; // SEQ if not first read or write, NONSEQ if first read or write, IDLE otherwise
|
||||
assign HWRITE = sel[1] ? LSUHWRITEOut : sel[0] ? 1'b0 : '0;
|
||||
|
@ -41,6 +41,7 @@ module ifu (
|
||||
(* mark_debug = "true" *) output logic IFUStallF,
|
||||
(* mark_debug = "true" *) output logic [2:0] IFUHBURST,
|
||||
(* mark_debug = "true" *) output logic [1:0] IFUHTRANS,
|
||||
(* mark_debug = "true" *) output logic [2:0] IFUHSIZE,
|
||||
(* mark_debug = "true" *) output logic IFUHWRITE,
|
||||
(* mark_debug = "true" *) input logic IFUHREADY,
|
||||
(* mark_debug = "true" *) output logic [`XLEN-1:0] PCF,
|
||||
@ -234,7 +235,7 @@ module ifu (
|
||||
ahbcacheinterface #(WORDSPERLINE, LINELEN, LOGBWPL, `ICACHE)
|
||||
ahbcacheinterface(.HCLK(clk), .HRESETn(~reset),
|
||||
.HRDATA,
|
||||
.CacheRW, .HSIZE(), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
|
||||
.CacheRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
|
||||
.Funct3(3'b010), .HADDR(IFUHADDR), .HREADY(IFUHREADY), .HWRITE(IFUHWRITE), .CacheBusAdr(ICacheBusAdr),
|
||||
.WordCount(), .SelUncachedAdr, .SelBusWord(),
|
||||
.CacheBusAck(ICacheBusAck),
|
||||
@ -249,6 +250,7 @@ module ifu (
|
||||
logic CaptureEn;
|
||||
logic [1:0] RW;
|
||||
assign RW = NonIROMMemRWM & ~{ITLBMissF, ITLBMissF};
|
||||
assign IFUHSIZE = 3'b010;
|
||||
|
||||
ahbinterface #(0) ahbinterface(.HCLK(clk), .HRESETn(~reset), .HREADY(IFUHREADY),
|
||||
.HRDATA(HRDATA), .HTRANS(IFUHTRANS), .HWRITE(IFUHWRITE), .HWDATA(),
|
||||
|
@ -216,7 +216,8 @@ module lsu (
|
||||
assign MemStage = CPUBusy | MemRWM[0] | reset; // 1 = M stage; 0 = E stage
|
||||
assign DTIMAdr = MemStage ? IEUAdrExtM : IEUAdrExtE; // zero extend or contract to PA_BITS
|
||||
/* verilator lint_on WIDTH */
|
||||
assign DTIMAccessRW = |MemRWM;
|
||||
assign DTIMAccessRW = |MemRWM;
|
||||
// *** Ross remove this.
|
||||
adrdec dtimdec(IEUAdrExtM, `DTIM_BASE, `DTIM_RANGE, `DTIM_SUPPORTED, DTIMAccessRW, 2'b10, 4'b1111, SelDTIM); // maybe we pull this out of the mmu?
|
||||
//assign NonDTIMMemRWM = MemRWM & ~{2{SelDTIM}}; // disable access to bus-based memory map when DTIM is selected
|
||||
assign NonDTIMMemRWM = MemRWM; // *** fix
|
||||
|
@ -132,18 +132,19 @@ module wallypipelinedcore (
|
||||
logic CommittedM;
|
||||
|
||||
// AHB ifu interface
|
||||
logic [`PA_BITS-1:0] IFUHADDR;
|
||||
logic [2:0] IFUHBURST;
|
||||
logic [1:0] IFUHTRANS;
|
||||
logic IFUHWRITE;
|
||||
logic IFUHREADY;
|
||||
logic [`PA_BITS-1:0] IFUHADDR;
|
||||
logic [2:0] IFUHBURST;
|
||||
logic [1:0] IFUHTRANS;
|
||||
logic [2:0] IFUHSIZE;
|
||||
logic IFUHWRITE;
|
||||
logic IFUHREADY;
|
||||
|
||||
// AHB LSU interface
|
||||
logic [`PA_BITS-1:0] LSUHADDR;
|
||||
logic [`XLEN-1:0] LSUHWDATA;
|
||||
logic [`XLEN/8-1:0] LSUHWSTRB;
|
||||
logic LSUHWRITE;
|
||||
logic LSUHREADY;
|
||||
logic [`PA_BITS-1:0] LSUHADDR;
|
||||
logic [`XLEN-1:0] LSUHWDATA;
|
||||
logic [`XLEN/8-1:0] LSUHWSTRB;
|
||||
logic LSUHWRITE;
|
||||
logic LSUHREADY;
|
||||
|
||||
logic BPPredWrongE;
|
||||
logic BPPredDirWrongM;
|
||||
@ -172,7 +173,7 @@ module wallypipelinedcore (
|
||||
.FlushF, .FlushD, .FlushE, .FlushM,
|
||||
// Fetch
|
||||
.HRDATA, .PCF, .IFUHADDR,
|
||||
.IFUStallF, .IFUHBURST, .IFUHTRANS,
|
||||
.IFUStallF, .IFUHBURST, .IFUHTRANS, .IFUHSIZE,
|
||||
.IFUHREADY, .IFUHWRITE,
|
||||
.ICacheAccess, .ICacheMiss,
|
||||
|
||||
@ -295,6 +296,7 @@ module wallypipelinedcore (
|
||||
.IFUHBURST,
|
||||
.IFUHTRANS,
|
||||
.IFUHREADY,
|
||||
.IFUHSIZE,
|
||||
// LSU interface
|
||||
.LSUHADDR,
|
||||
.LSUHWDATA,
|
||||
|
@ -0,0 +1,25 @@
|
||||
aabbccdd # Test 5.3.2.4: M mode little endian load/store word of 0xAABBCCDD # NOTE: the memory was already filled with's so subword overwrite some, but not all of them. this is why the values are filled with deadbeefs, rather than 00's or ff's
|
||||
deadccdd # M mode little endian load/store halfword of 0xAABBCCDD # NOTE: since we're doing a store that matches the width of the load, we cut out all the sign extension
|
||||
deadbedd # M mode little endian load/store byte of 0xAABBCCDD
|
||||
ddccbbaa # M mode big endian load/store word of 0xDDCCBBAA
|
||||
deadbbaa # M mode big endian load/store halfword of 0xDDCCBBAA
|
||||
deadbeaa # M mode big endian load/store byte of 0xDDCCBBAA
|
||||
0000000b # ecall after going from M mode to S mode
|
||||
aabbccdd # S mode little endian load/store word of 0xAABBCCDD
|
||||
deadccdd # S mode little endian load/store halfword of 0xAABBCCDD
|
||||
deadbedd # S mode little endian load/store byte of 0xAABBCCDD
|
||||
00000009 # ecall after going from S mode to M mode
|
||||
0000000b # ecall after going from M mode to S mode
|
||||
ddccbbaa # S mode big endian load/store word of 0xDDCCBBAA
|
||||
deadbbaa # S mode big endian load/store halfword of 0xDDCCBBAA
|
||||
deadbeaa # S mode big endian load/store byte of 0xDDCCBBAA
|
||||
00000009 # ecall after going from S mode to U mode
|
||||
aabbccdd # U mode little endian load/store word of 0xAABBCCDD
|
||||
deadccdd # U mode little endian load/store halfword of 0xAABBCCDD
|
||||
deadbedd # U mode little endian load/store byte of 0xAABBCCDD
|
||||
00000008 # ecall after going from U mode to M mode
|
||||
0000000b # ecall after going from M mode to U mode
|
||||
ddccbbaa # U mode big endian load/store word of 0xDDCCBBAA
|
||||
deadbbaa # U mode big endian load/store halfword of 0xDDCCBBAA
|
||||
deadbeaa # U mode big endian load/store byte of 0xDDCCBBAA
|
||||
00000008 # ecall after ending tests in U mode
|
@ -0,0 +1,192 @@
|
||||
///////////////////////////////////////////
|
||||
//
|
||||
// WALLY-endianness
|
||||
//
|
||||
// Author: Kip Macsai-Goren <kmacsaigoren@g.hmc.edu>
|
||||
//
|
||||
// Created 2022-09-05
|
||||
//
|
||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||
// is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
///////////////////////////////////////////
|
||||
|
||||
#include "WALLY-TEST-LIB-32.h"
|
||||
|
||||
RVTEST_ISA("RV32I")
|
||||
RVTEST_CASE(0,"//check ISA:=regex(.*32.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True; def NO_SAIL=True;",endianness)
|
||||
|
||||
INIT_TESTS
|
||||
|
||||
TRAP_HANDLER m
|
||||
|
||||
// Test 5.3.2.4: testing that accesses to sub-word memory acceses not on a word boundary go
|
||||
// correctly with the relevant status bit indicating endianness for each mode.
|
||||
// do this by going to each mode with and testing loads with the big endian bit on and off work correctly
|
||||
|
||||
// *** It appears Sail has the MBE, SBE, and UBE bits of mstatus hardwired to zero
|
||||
|
||||
// M Mode little Endianness tests:
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sw x28, 0(x29) // value stored in memory as 0xAABBCCDD
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xAABBCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xCCDD
|
||||
sh x30, 0(t1) // test store half, should save 0xCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xDD
|
||||
sb x30, 0(t1) // test store byte, should save 0xDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
li x28, 0x2000000000
|
||||
csrs mstatus, x28 // turn on big endianness for M mode
|
||||
|
||||
// M mode Big Endianness tests
|
||||
// In big endian modes, all values are sign extended to the right, rather than left
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sw x28, 0(x29) // value stored in memory as 0xDDCCBBAA
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
li x28, 0x2000000000
|
||||
csrc mstatus, x28 // Turn off big endianness for M mode before going into the trap handler
|
||||
|
||||
GOTO_S_MODE
|
||||
|
||||
// S mode Little endian tests
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xAABBCCDD
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xAABBCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xCCDD
|
||||
sh x30, 0(t1) // test store half, should save 0xCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xDD
|
||||
sb x30, 0(t1) // test store byte, should save 0xDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
GOTO_M_MODE // Go back to M mode to be able to toggle SBE bit of mstatus
|
||||
|
||||
li x28, 0x1000000000
|
||||
csrs mstatus, x28 // turn on big endianness for S mode
|
||||
|
||||
GOTO_S_MODE
|
||||
|
||||
// S mode Big endian tests
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xDDCCBBAA
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
GOTO_U_MODE
|
||||
|
||||
// U mode Little endian tests
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xAABBCCDD
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xAABBCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xCCDD
|
||||
sh x30, 0(t1) // test store half, should save 0xCCDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xDD
|
||||
sb x30, 0(t1) // test store byte, should save 0xDD
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
GOTO_M_MODE // go to M mode in order to be able to toggle the UBE bit
|
||||
|
||||
li x28, 0x40
|
||||
csrs mstatus, x28 // turn on big endianness for U mode
|
||||
|
||||
GOTO_U_MODE
|
||||
|
||||
// U mode Big endian tests
|
||||
|
||||
li x28, 0xAABBCCDD
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xDDCCBBAA
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 4
|
||||
addi a6, a6, 4
|
||||
|
||||
END_TESTS
|
||||
|
||||
TEST_STACK_AND_DATA
|
@ -1,26 +1,62 @@
|
||||
00000011 # Test *** NUMBER: Read of 1st byte of 0xAABBCCDDEEFF1122 in M mode little endian
|
||||
eeff1122 # Test 5.3.2.4: M mode little endian load/store double of 0xaabbccddeeff1122
|
||||
aabbccdd # NOTE: since we're doing a store that matches the width of the load, we cut out all the sign extension
|
||||
eeff1122 # M mode little endian load/store word of 0xaabbccddeeff1122
|
||||
deadbeef # NOTE: the memory was already filled with deadbeef's so subword overwrite some, but not all of them. this is why the values are filled with deadbeefs, rather than 00's or ff's
|
||||
dead1122 # M mode little endian load/store halfword of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
deadbe22 # M mode little endian load/store byte of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
ddccbbaa # M mode big endian load/store double of 0x2211ffeeddccbbaa
|
||||
2211ffee
|
||||
ddccbbaa # M mode big endian load/store word of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbbaa # M mode big endian load/store halfword of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbeaa # M mode big endian load/store byte of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
0000000b # ecall after going from M mode to S mode
|
||||
00000000
|
||||
ffffffff # sign extended value after Read of 1st byte of 0xAABBCCDDEEFF1122 in M mode big endian
|
||||
bbffffff # This is 0xbb sign extended and stored in big endian mode
|
||||
0000000b # mcause from ecall going from M mode to S mode
|
||||
eeff1122 # S mode little endian load/store double of 0xaabbccddeeff1122
|
||||
aabbccdd
|
||||
eeff1122 # S mode little endian load/store word of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
dead1122 # S mode little endian load/store halfword of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
deadbe22 # S mode little endian load/store byte of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
00000009 # ecall after going from S mode to M mode
|
||||
00000000
|
||||
00000011 # Read of 1st byte of 0xAABBCCDDEEFF1122 in S mode little endian
|
||||
0000000b # ecall after going from M mode to S mode
|
||||
00000000
|
||||
00000009 # mcause from ecall going from S mode to M mode (necessary to change mstatus bits)
|
||||
ddccbbaa # S mode big endian load/store double of 0x2211ffeeddccbbaa
|
||||
2211ffee
|
||||
ddccbbaa # S mode big endian load/store word of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbbaa # S mode big endian load/store halfword of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbeaa # S mode big endian load/store byte of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
00000009 # ecall after going from S mode to U mode
|
||||
00000000
|
||||
0000000b # mcause from ecall going back from M mode to S mode
|
||||
00000000
|
||||
ffffffff # sign extended value after Read of 1st byte of 0xAABBCCDDEEFF1122 in S mode big endian
|
||||
bbffffff # This is 0xbb sign extended and stored in big endian mode
|
||||
00000009 # mcause from ecall going from S mode to U mode
|
||||
eeff1122 # U mode little endian load/store double of 0xaabbccddeeff1122
|
||||
aabbccdd
|
||||
eeff1122 # U mode little endian load/store word of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
dead1122 # U mode little endian load/store halfword of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
deadbe22 # U mode little endian load/store byte of 0xaabbccddeeff1122
|
||||
deadbeef
|
||||
00000008 # ecall after going from U mode to M mode
|
||||
00000000
|
||||
00000011 # Read of 1st byte of 0xAABBCCDDEEFF1122 in U mode little endian
|
||||
0000000b # ecall after going from M mode to U mode
|
||||
00000000
|
||||
00000008 # mcause from ecall going from U mode to M mode (necessary to change mstatus bits)
|
||||
ddccbbaa # U mode big endian load/store double of 0x2211ffeeddccbbaa
|
||||
2211ffee
|
||||
ddccbbaa # U mode big endian load/store word of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbbaa # U mode big endian load/store halfword of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
deadbeaa # U mode big endian load/store byte of 0x2211ffeeddccbbaa
|
||||
deadbeef
|
||||
00000008 # ecall after ending tests in U mode
|
||||
00000000
|
||||
0000000b # mcause from ecall going back from M mode to U mode
|
||||
00000000
|
||||
ffffffff # sign extended value after Read of 1st byte of 0xAABBCCDDEEFF1122 in U mode big endian
|
||||
bbffffff # This is 0xbb sign extended and stored in big endian mode
|
||||
00000008 # Ecall from terminating tests in U mode.
|
||||
00000000
|
@ -0,0 +1,4 @@
|
||||
00000000 # Test *** Number : Read out SXL, UXL of mstatus as 2 and 2 for 64 bit systems
|
||||
0000000a
|
||||
00000000 # read of read-only uxl, sxl bits after attmepted write
|
||||
0000000a
|
@ -30,29 +30,66 @@ INIT_TESTS
|
||||
|
||||
TRAP_HANDLER m
|
||||
|
||||
// Test ***Number: testing that accesses to sub-word memory acceses not on a word boundary go
|
||||
// Test 5.3.2.4: testing that accesses to sub-word memory acceses not on a word boundary go
|
||||
// correctly with the relevant status bit indicating endianness for each mode.
|
||||
// do this by going to each mode with and testing loads with the big endian bit on and off work correctly
|
||||
|
||||
// *** It appears has the MBE, SBE, and UBE bits of mstatus hardwired to zero
|
||||
// *** It appears Sail has the MBE, SBE, and UBE bits of mstatus hardwired to zero
|
||||
|
||||
// M Mode little Endianness tests:
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // Store test value into memory address in little endian mode
|
||||
// in little endian mode, byte at 0x1(x29) is 0x11
|
||||
// in big endian mode, 0x1(x29) should be 0xBB
|
||||
sd x28, 0(x29) // value stored in memory as 0xAABBCCDDEEFF1122
|
||||
|
||||
lb x30, 0x1(x29) // Test M Mode Little endianness, should return 0x11
|
||||
sd x30, 0(t1) // store recorded M mode Little endian value to output
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0xAABBCCDDEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xEEFF1122
|
||||
sw x30, 0(t1) // test store word, should save 0xEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0x1122
|
||||
sh x30, 0(t1) // test store half, should save 0x1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0x22
|
||||
sb x30, 0(t1) // test store byte, should save 0x22
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
li x28, 0x2000000000
|
||||
csrs mstatus, x28 // turn on big endianness for M mode
|
||||
|
||||
lb x30, 0x1(x29) // Test M mode big endaianness, should return 0xBB
|
||||
sd x30, 0(t1) // store recorded M mode big endian value to output
|
||||
addi t1, t1, 8
|
||||
// M mode Big Endianness tests
|
||||
// In big endian modes, all values are sign extended to the right, rather than left
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0x2211FFEEDDCCBBAA
|
||||
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0x2211FFEEDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
li x28, 0x2000000000
|
||||
@ -60,8 +97,29 @@ csrc mstatus, x28 // Turn off big endianness for M mode before going into the tr
|
||||
|
||||
GOTO_S_MODE
|
||||
|
||||
lb x30, 0x1(x29) // Test S Mode Little endianness, should return 0x11
|
||||
sd x30, 0(t1) // store recorded M mode Little endian value to output
|
||||
// S mode Little endian tests
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xAABBCCDDEEFF1122
|
||||
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0xAABBCCDDEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xEEFF1122
|
||||
sw x30, 0(t1) // test store word, should save 0xEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0x1122
|
||||
sh x30, 0(t1) // test store half, should save 0x1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0x22
|
||||
sb x30, 0(t1) // test store byte, should save 0x22
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
@ -72,18 +130,57 @@ csrs mstatus, x28 // turn on big endianness for S mode
|
||||
|
||||
GOTO_S_MODE
|
||||
|
||||
lb x30, 0x1(x29) // Test S mode big endaianness, should return 0xBB
|
||||
sd x30, 0(t1) // store recorded S mode big endian value to output
|
||||
addi t1, t1, 8
|
||||
// S mode Big endian tests
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0x2211FFEEDDCCBBAA
|
||||
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0x2211FFEEDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
# li x28, 0x1000000000
|
||||
# csrc sstatus, x28 // Turn off big endianness for S mode before going into the trap handler
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
GOTO_U_MODE
|
||||
|
||||
lb x30, 0x1(x29) // Test U Mode Little endianness, should return 0x11
|
||||
sd x30, 0(t1) // store recorded M mode Little endian value to output
|
||||
// U mode Little endian tests
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0xAABBCCDDEEFF1122
|
||||
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0xAABBCCDDEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xEEFF1122
|
||||
sw x30, 0(t1) // test store word, should save 0xEEFF1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0x1122
|
||||
sh x30, 0(t1) // test store half, should save 0x1122
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0x22
|
||||
sb x30, 0(t1) // test store byte, should save 0x22
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
@ -94,8 +191,29 @@ csrs mstatus, x28 // turn on big endianness for U mode
|
||||
|
||||
GOTO_U_MODE
|
||||
|
||||
lb x30, 0x1(x29) // Test U mode big endaianness, should return 0xBB
|
||||
sd x30, 0(t1) // store recorded U mode big endian value to output
|
||||
// U mode Big endian tests
|
||||
|
||||
li x28, 0xAABBCCDDEEFF1122
|
||||
li x29, 0x8000F000
|
||||
sd x28, 0(x29) // value stored in memory as 0x2211FFEEDDCCBBAA
|
||||
|
||||
ld x30, 0(x29) // test load double, should read out 0xAABBCCDDEEFF1122
|
||||
sd x30, 0(t1) // test store double, should save 0x2211FFEEDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lw x30, 0(x29) // test load word, should read out 0xAABBCCDD
|
||||
sw x30, 0(t1) // test store word, should save 0xDDCCBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lh x30, 0(x29) // test load half, should read out 0xAABB
|
||||
sh x30, 0(t1) // test store half, should save 0xBBAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
lb x30, 0(x29) // test load byte, should read out 0xAA
|
||||
sb x30, 0(t1) // test store byte, should save 0xAA
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
|
@ -0,0 +1,51 @@
|
||||
///////////////////////////////////////////
|
||||
//
|
||||
// WALLY-status-xlen
|
||||
//
|
||||
// Author: Kip Macsai-Goren <kmacsaigoren@g.hmc.edu>
|
||||
//
|
||||
// Created 2022-09-17
|
||||
//
|
||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||
// is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
///////////////////////////////////////////
|
||||
|
||||
#include "WALLY-TEST-LIB-64.h"
|
||||
|
||||
RVTEST_ISA("RV64I")
|
||||
RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",endianness)
|
||||
|
||||
INIT_TESTS
|
||||
|
||||
TRAP_HANDLER m
|
||||
|
||||
// Test ***Number: check that the UXL and SXL bits of mstatus are read only and the correct value (2 for 64 bit systems)
|
||||
|
||||
csrr x28, mstatus
|
||||
li x29, 0xF00000000 // mask bits for uxl and sxl
|
||||
and x28, x28, x29
|
||||
sd x28, 0(t1) // should store 0xA00000000 to memory
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
csrs mstatus, x29 // attempt to write to uxl and sxl, should not work
|
||||
csrr x28, mstatus
|
||||
and x28, x28, x29
|
||||
sd x28, 0(t1) // should store 0xA00000000 to memory
|
||||
addi t1, t1, 8
|
||||
addi a6, a6, 8
|
||||
|
||||
END_TESTS
|
||||
|
||||
TEST_STACK_AND_DATA
|
Loading…
Reference in New Issue
Block a user