mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
busybear: make imperas tests work again
This commit is contained in:
parent
5c456e2d7f
commit
cfcd7d1518
@ -37,8 +37,8 @@ mem load -startaddress 0 -endaddress 2047 -filltype value -fillradix hex -fillda
|
|||||||
mem load -startaddress 512 -i "/courses/e190ax/busybear_boot/bootmem.txt" -format hex /testbench_busybear/dut/uncore/bootdtim/RAM
|
mem load -startaddress 512 -i "/courses/e190ax/busybear_boot/bootmem.txt" -format hex /testbench_busybear/dut/uncore/bootdtim/RAM
|
||||||
mem load -startaddress 0 -endaddress 2047 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/imem/bootram
|
mem load -startaddress 0 -endaddress 2047 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/imem/bootram
|
||||||
mem load -startaddress 512 -i "/courses/e190ax/busybear_boot/bootmem.txt" -format hex /testbench_busybear/dut/imem/bootram
|
mem load -startaddress 512 -i "/courses/e190ax/busybear_boot/bootmem.txt" -format hex /testbench_busybear/dut/imem/bootram
|
||||||
mem load -startaddress 268435456 -endaddress 285212671 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/uncore/maindtim/RAM
|
mem load -startaddress 268435456 -endaddress 285212671 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/uncore/dtim/RAM
|
||||||
mem load -startaddress 268435456 -i "/courses/e190ax/busybear_boot/ram.txt" -format hex /testbench_busybear/dut/uncore/maindtim/RAM
|
mem load -startaddress 268435456 -i "/courses/e190ax/busybear_boot/ram.txt" -format hex /testbench_busybear/dut/uncore/dtim/RAM
|
||||||
mem load -startaddress 268435456 -endaddress 285212671 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/imem/RAM
|
mem load -startaddress 268435456 -endaddress 285212671 -filltype value -fillradix hex -filldata 0 /testbench_busybear/dut/imem/RAM
|
||||||
mem load -startaddress 268435456 -i "/courses/e190ax/busybear_boot/ram.txt" -format hex /testbench_busybear/dut/imem/RAM
|
mem load -startaddress 268435456 -i "/courses/e190ax/busybear_boot/ram.txt" -format hex /testbench_busybear/dut/imem/RAM
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ add wave -divider
|
|||||||
add wave /testbench_busybear/dut/uncore/HSELBootTim
|
add wave /testbench_busybear/dut/uncore/HSELBootTim
|
||||||
add wave /testbench_busybear/dut/uncore/HSELTim
|
add wave /testbench_busybear/dut/uncore/HSELTim
|
||||||
add wave /testbench_busybear/dut/uncore/HREADTim
|
add wave /testbench_busybear/dut/uncore/HREADTim
|
||||||
add wave /testbench_busybear/dut/uncore/maindtim/HREADTim0
|
add wave /testbench_busybear/dut/uncore/dtim/HREADTim0
|
||||||
add wave /testbench_busybear/dut/uncore/HREADYTim
|
add wave /testbench_busybear/dut/uncore/HREADYTim
|
||||||
add wave -divider
|
add wave -divider
|
||||||
add wave /testbench_busybear/dut/uncore/HREADBootTim
|
add wave /testbench_busybear/dut/uncore/HREADBootTim
|
||||||
|
@ -35,7 +35,6 @@ module dtim #(parameter BASE=0, RANGE = 65535) (
|
|||||||
output logic HRESPTim, HREADYTim
|
output logic HRESPTim, HREADYTim
|
||||||
);
|
);
|
||||||
|
|
||||||
//logic [`XLEN-1:0] RAM[0:65535];
|
|
||||||
logic [`XLEN-1:0] RAM[BASE>>(1+`XLEN/32):(RANGE+BASE)>>1+(`XLEN/32)];
|
logic [`XLEN-1:0] RAM[BASE>>(1+`XLEN/32):(RANGE+BASE)>>1+(`XLEN/32)];
|
||||||
logic [31:0] HWADDR;
|
logic [31:0] HWADDR;
|
||||||
logic [`XLEN-1:0] HREADTim0;
|
logic [`XLEN-1:0] HREADTim0;
|
||||||
|
@ -33,7 +33,9 @@ module imem (
|
|||||||
|
|
||||||
/* verilator lint_off UNDRIVEN */
|
/* verilator lint_off UNDRIVEN */
|
||||||
logic [`XLEN-1:0] RAM[`TIMBASE>>(1+`XLEN/32):(`TIMRANGE+`TIMBASE)>>(1+`XLEN/32)];
|
logic [`XLEN-1:0] RAM[`TIMBASE>>(1+`XLEN/32):(`TIMRANGE+`TIMBASE)>>(1+`XLEN/32)];
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
logic [`XLEN-1:0] bootram[`BOOTTIMBASE>>(1+`XLEN/32):(`BOOTTIMRANGE+`BOOTTIMBASE)>>(1+`XLEN/32)];
|
logic [`XLEN-1:0] bootram[`BOOTTIMBASE>>(1+`XLEN/32):(`BOOTTIMRANGE+`BOOTTIMBASE)>>(1+`XLEN/32)];
|
||||||
|
`endif
|
||||||
/* verilator lint_on UNDRIVEN */
|
/* verilator lint_on UNDRIVEN */
|
||||||
logic [28:0] adrbits;
|
logic [28:0] adrbits;
|
||||||
logic [`XLEN-1:0] rd;
|
logic [`XLEN-1:0] rd;
|
||||||
@ -44,15 +46,21 @@ module imem (
|
|||||||
else assign adrbits = AdrF[31:3];
|
else assign adrbits = AdrF[31:3];
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
//assign #2 rd = RAM[adrbits]; // word aligned
|
`ifndef BOOTTIMBASE
|
||||||
|
assign #2 rd = RAM[adrbits]; // word aligned
|
||||||
|
`else
|
||||||
assign #2 rd = (AdrF < (`TIMBASE >> 1)) ? bootram[adrbits] : RAM[adrbits]; // busybear: 2 memory options
|
assign #2 rd = (AdrF < (`TIMBASE >> 1)) ? bootram[adrbits] : RAM[adrbits]; // busybear: 2 memory options
|
||||||
|
`endif
|
||||||
|
|
||||||
// hack right now for unaligned 32-bit instructions
|
// hack right now for unaligned 32-bit instructions
|
||||||
// eventually this will need to cause a stall like a cache miss
|
// eventually this will need to cause a stall like a cache miss
|
||||||
// when the instruction wraps around a cache line
|
// when the instruction wraps around a cache line
|
||||||
// could be optimized to only stall when the instruction wrapping is 32 bits
|
// could be optimized to only stall when the instruction wrapping is 32 bits
|
||||||
//assign #2 rd2 = RAM[adrbits+1][15:0];
|
`ifndef BOOTTIMBASE
|
||||||
|
assign #2 rd2 = RAM[adrbits+1][15:0];
|
||||||
|
`else
|
||||||
assign #2 rd2 = (AdrF < (`TIMBASE >> 1)) ? bootram[adrbits+1][15:0] : RAM[adrbits+1][15:0]; //busybear: 2 memory options
|
assign #2 rd2 = (AdrF < (`TIMBASE >> 1)) ? bootram[adrbits+1][15:0] : RAM[adrbits+1][15:0]; //busybear: 2 memory options
|
||||||
|
`endif
|
||||||
generate
|
generate
|
||||||
if (`XLEN==32) begin
|
if (`XLEN==32) begin
|
||||||
assign InstrF = AdrF[1] ? {rd2[15:0], rd[31:16]} : rd;
|
assign InstrF = AdrF[1] ? {rd2[15:0], rd[31:16]} : rd;
|
||||||
@ -60,8 +68,11 @@ module imem (
|
|||||||
end else begin
|
end else begin
|
||||||
assign InstrF = AdrF[2] ? (AdrF[1] ? {rd2[15:0], rd[63:48]} : rd[63:32])
|
assign InstrF = AdrF[2] ? (AdrF[1] ? {rd2[15:0], rd[63:48]} : rd[63:32])
|
||||||
: (AdrF[1] ? rd[47:16] : rd[31:0]);
|
: (AdrF[1] ? rd[47:16] : rd[31:0]);
|
||||||
|
`ifndef BOOTTIMBASE
|
||||||
|
assign InstrAccessFaultF = |AdrF[`XLEN-1:32] | ~&({AdrF[31:1],1'b0} ~^ `TIMBASE | `TIMRANGE);
|
||||||
|
`else
|
||||||
assign InstrAccessFaultF = 0; //busybear: for now, i know we're not doing this
|
assign InstrAccessFaultF = 0; //busybear: for now, i know we're not doing this
|
||||||
//assign InstrAccessFaultF = |AdrF[`XLEN-1:32] | ~&({AdrF[31:1],1'b0} ~^ `TIMBASE | `TIMRANGE);
|
`endif
|
||||||
end
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -58,30 +58,42 @@ module uncore (
|
|||||||
);
|
);
|
||||||
|
|
||||||
logic [`XLEN-1:0] HWDATA;
|
logic [`XLEN-1:0] HWDATA;
|
||||||
logic [`XLEN-1:0] HREADBootTim, HREADTim, HREADCLINT, HREADGPIO, HREADUART;
|
logic [`XLEN-1:0] HREADTim, HREADCLINT, HREADGPIO, HREADUART;
|
||||||
logic HSELBootTim, HSELTim, HSELCLINT, HSELGPIO, PreHSELUART, HSELUART;
|
logic HSELTim, HSELCLINT, HSELGPIO, PreHSELUART, HSELUART;
|
||||||
logic HRESPBootTim, HRESPTim, HRESPCLINT, HRESPGPIO, HRESPUART;
|
logic HRESPTim, HRESPCLINT, HRESPGPIO, HRESPUART;
|
||||||
logic HREADYBootTim, HREADYTim, HREADYCLINT, HREADYGPIO, HREADYUART;
|
logic HREADYTim, HREADYCLINT, HREADYGPIO, HREADYUART;
|
||||||
logic [1:0] MemRW;
|
logic [1:0] MemRW;
|
||||||
logic [1:0] MemRWboottim, MemRWtim, MemRWclint, MemRWgpio, MemRWuart;
|
logic [1:0] MemRWtim, MemRWclint, MemRWgpio, MemRWuart;
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
|
logic [`XLEN-1:0] HREADBootTim;
|
||||||
|
logic HSELBootTim, HRESPBootTim, HREADYBootTim;
|
||||||
|
logic [1:0] MemRWboottim;
|
||||||
|
`endif
|
||||||
logic UARTIntr;// *** will need to tie INTR to an interrupt handler
|
logic UARTIntr;// *** will need to tie INTR to an interrupt handler
|
||||||
|
|
||||||
|
|
||||||
// AHB Address decoder
|
// AHB Address decoder
|
||||||
adrdec timdec(HADDR, `TIMBASE, `TIMRANGE, HSELTim);
|
adrdec timdec(HADDR, `TIMBASE, `TIMRANGE, HSELTim);
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
adrdec boottimdec(HADDR, `BOOTTIMBASE, `BOOTTIMRANGE, HSELBootTim);
|
adrdec boottimdec(HADDR, `BOOTTIMBASE, `BOOTTIMRANGE, HSELBootTim);
|
||||||
|
`endif
|
||||||
adrdec clintdec(HADDR, `CLINTBASE, `CLINTRANGE, HSELCLINT);
|
adrdec clintdec(HADDR, `CLINTBASE, `CLINTRANGE, HSELCLINT);
|
||||||
// Busybear: for now, leaving out gpio since OVPsim doesn't seem to have it
|
`ifdef GPIOBASE
|
||||||
//adrdec gpiodec(HADDR, `GPIOBASE, `GPIORANGE, HSELGPIO);
|
adrdec gpiodec(HADDR, `GPIOBASE, `GPIORANGE, HSELGPIO);
|
||||||
|
`endif
|
||||||
adrdec uartdec(HADDR, `UARTBASE, `UARTRANGE, PreHSELUART);
|
adrdec uartdec(HADDR, `UARTBASE, `UARTRANGE, PreHSELUART);
|
||||||
assign HSELUART = PreHSELUART && (HSIZE == 3'b000); // only byte writes to UART are supported
|
assign HSELUART = PreHSELUART && (HSIZE == 3'b000); // only byte writes to UART are supported
|
||||||
|
|
||||||
// Enable read or write based on decoded address
|
// Enable read or write based on decoded address
|
||||||
assign MemRW = {~HWRITE, HWRITED};
|
assign MemRW = {~HWRITE, HWRITED};
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
assign MemRWboottim = MemRW & {2{HSELBootTim}};
|
assign MemRWboottim = MemRW & {2{HSELBootTim}};
|
||||||
|
`endif
|
||||||
assign MemRWtim = MemRW & {2{HSELTim}};
|
assign MemRWtim = MemRW & {2{HSELTim}};
|
||||||
assign MemRWclint = MemRW & {2{HSELCLINT}};
|
assign MemRWclint = MemRW & {2{HSELCLINT}};
|
||||||
//assign MemRWgpio = MemRW & {2{HSELGPIO}};
|
`ifdef GPIOBASE
|
||||||
|
assign MemRWgpio = MemRW & {2{HSELGPIO}};
|
||||||
|
`endif
|
||||||
assign MemRWuart = MemRW & {2{HSELUART}};
|
assign MemRWuart = MemRW & {2{HSELUART}};
|
||||||
/* always_ff @(posedge HCLK) begin
|
/* always_ff @(posedge HCLK) begin
|
||||||
HADDRD <= HADDR;
|
HADDRD <= HADDR;
|
||||||
@ -95,13 +107,17 @@ module uncore (
|
|||||||
subwordwrite sww(.*);
|
subwordwrite sww(.*);
|
||||||
|
|
||||||
// tightly integrated memory
|
// tightly integrated memory
|
||||||
dtim #(.BASE(`TIMBASE), .RANGE(`TIMRANGE)) maindtim (.*);
|
dtim #(.BASE(`TIMBASE), .RANGE(`TIMRANGE)) dtim (.*);
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
dtim #(.BASE(`BOOTTIMBASE), .RANGE(`BOOTTIMRANGE)) bootdtim (.MemRWtim(MemRWboottim),
|
dtim #(.BASE(`BOOTTIMBASE), .RANGE(`BOOTTIMRANGE)) bootdtim (.MemRWtim(MemRWboottim),
|
||||||
.HSELTim(HSELBootTim), .HREADTim(HREADBootTim), .HRESPTim(HRESPBootTim), .HREADYTim(HREADYBootTim), .*);
|
.HSELTim(HSELBootTim), .HREADTim(HREADBootTim), .HRESPTim(HRESPBootTim), .HREADYTim(HREADYBootTim), .*);
|
||||||
|
`endif
|
||||||
|
|
||||||
// memory-mapped I/O peripherals
|
// memory-mapped I/O peripherals
|
||||||
clint clint(.HADDR(HADDR[15:0]), .*);
|
clint clint(.HADDR(HADDR[15:0]), .*);
|
||||||
//gpio gpio(.HADDR(HADDR[7:0]), .*); // *** may want to add GPIO interrupts
|
`ifdef GPIOBASE
|
||||||
|
gpio gpio(.HADDR(HADDR[7:0]), .*); // *** may want to add GPIO interrupts
|
||||||
|
`endif
|
||||||
uart uart(.HADDR(HADDR[2:0]), .TXRDYb(), .RXRDYb(), .INTR(UARTIntr), .SIN(UARTSin), .SOUT(UARTSout),
|
uart uart(.HADDR(HADDR[2:0]), .TXRDYb(), .RXRDYb(), .INTR(UARTIntr), .SIN(UARTSin), .SOUT(UARTSout),
|
||||||
.DSRb(1'b1), .DCDb(1'b1), .CTSb(1'b0), .RIb(1'b1),
|
.DSRb(1'b1), .DCDb(1'b1), .CTSb(1'b0), .RIb(1'b1),
|
||||||
.RTSb(), .DTRb(), .OUT1b(), .OUT2b(), .*);
|
.RTSb(), .DTRb(), .OUT1b(), .OUT2b(), .*);
|
||||||
@ -109,12 +125,39 @@ module uncore (
|
|||||||
// mux could also include external memory
|
// mux could also include external memory
|
||||||
// AHB Read Multiplexer
|
// AHB Read Multiplexer
|
||||||
assign HRDATA = ({`XLEN{HSELTim}} & HREADTim) | ({`XLEN{HSELCLINT}} & HREADCLINT) |
|
assign HRDATA = ({`XLEN{HSELTim}} & HREADTim) | ({`XLEN{HSELCLINT}} & HREADCLINT) |
|
||||||
({`XLEN{HSELBootTim}} & HREADBootTim) | ({`XLEN{HSELUART}} & HREADUART);
|
`ifdef GPIOBASE
|
||||||
assign HRESP = HSELBootTim & HRESPBootTim | HSELTim & HRESPTim | HSELCLINT & HRESPCLINT | HSELUART & HRESPUART;
|
({`XLEN{HSELGPIO}} & HREADGPIO) |
|
||||||
assign HREADY = HSELBootTim & HREADYBootTim | HSELTim & HREADYTim | HSELCLINT & HREADYCLINT | HSELUART & HREADYUART;
|
`endif
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
|
({`XLEN{HSELBootTim}} & HREADBootTim) |
|
||||||
|
`endif
|
||||||
|
({`XLEN{HSELUART}} & HREADUART);
|
||||||
|
assign HRESP = HSELTim & HRESPTim | HSELCLINT & HRESPCLINT |
|
||||||
|
`ifdef GPIOBASE
|
||||||
|
HSELGPIO & HRESPGPIO |
|
||||||
|
`endif
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
|
HSELBootTim & HRESPBootTim |
|
||||||
|
`endif
|
||||||
|
HSELUART & HRESPUART;
|
||||||
|
assign HREADY = HSELTim & HREADYTim | HSELCLINT & HREADYCLINT |
|
||||||
|
`ifdef GPIOBASE
|
||||||
|
HSELGPIO & HREADYGPIO |
|
||||||
|
`endif
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
|
HSELBootTim & HREADYBootTim |
|
||||||
|
`endif
|
||||||
|
HSELUART & HREADYUART;
|
||||||
|
|
||||||
// Faults
|
// Faults
|
||||||
assign DataAccessFaultM = ~(HSELTim | HSELCLINT | HSELUART);
|
assign DataAccessFaultM = ~(HSELTim | HSELCLINT |
|
||||||
|
`ifdef GPIOBASE
|
||||||
|
HSELGPIO |
|
||||||
|
`endif
|
||||||
|
`ifdef BOOTTIMBASE
|
||||||
|
HSELBootTim |
|
||||||
|
`endif
|
||||||
|
HSELUART);
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -407,9 +407,9 @@ string tests32i[] = {
|
|||||||
i = 0;
|
i = 0;
|
||||||
errors = 0;
|
errors = 0;
|
||||||
if (`XLEN == 32)
|
if (`XLEN == 32)
|
||||||
testadr = tests[test+1].atohex()/4;
|
testadr = (`TIMBASE+tests[test+1].atohex())/4;
|
||||||
else
|
else
|
||||||
testadr = tests[test+1].atohex()/8;
|
testadr = (`TIMBASE+tests[test+1].atohex())/8;
|
||||||
/* verilator lint_off INFINITELOOP */
|
/* verilator lint_off INFINITELOOP */
|
||||||
while (signature[i] !== 'bx) begin
|
while (signature[i] !== 'bx) begin
|
||||||
//$display("signature[%h] = %h", i, signature[i]);
|
//$display("signature[%h] = %h", i, signature[i]);
|
||||||
|
@ -136,9 +136,9 @@ module testbench();
|
|||||||
i = 0;
|
i = 0;
|
||||||
errors = 0;
|
errors = 0;
|
||||||
if (`XLEN == 32)
|
if (`XLEN == 32)
|
||||||
testadr = tests[test+1].atohex()/4;
|
testadr = (`TIMBASE+tests[test+1].atohex())/4;
|
||||||
else
|
else
|
||||||
testadr = tests[test+1].atohex()/8;
|
testadr = (`TIMBASE+tests[test+1].atohex())/8;
|
||||||
/* verilator lint_off INFINITELOOP */
|
/* verilator lint_off INFINITELOOP */
|
||||||
while (signature[i] !== 'bx) begin
|
while (signature[i] !== 'bx) begin
|
||||||
//$display("signature[%h] = %h", i, signature[i]);
|
//$display("signature[%h] = %h", i, signature[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user