busybear: add support for subwords in ram

this is really weird and i'm not sure if i did it right. I'd love if @kaveh could review it
This commit is contained in:
Noah Boorstin 2021-02-24 01:51:18 +00:00
parent 00605864fc
commit a24270c4ca

View File

@ -30,6 +30,7 @@ module testbench_busybear();
// instantiate processor and memories // instantiate processor and memories
wallypipelinedsocbusybear dut(.*); wallypipelinedsocbusybear dut(.*);
// initialize test // initialize test
initial initial
begin begin
@ -163,18 +164,19 @@ module testbench_busybear();
end end
endgenerate endgenerate
`define MAX_RAM 'h8000000 logic [`XLEN-1:0] RAM[('h8000000 >> 3):0];
logic [`XLEN-1:0] RAM[`MAX_RAM:0];
logic [`XLEN-1:0] readRAM, readPC; logic [`XLEN-1:0] readRAM, readPC;
integer RAMAdr, RAMPC; integer RAMAdr, RAMPC;
assign RAMAdr = HADDR - 'h80000000; assign RAMAdr = (HADDR - 'h80000000) >> 3;
assign RAMPC = PCF - 'h80000000; assign RAMPC = (PCF - 'h80000000) >> 3;
logic [63:0] readMask;
assign readMask = ((1 << (8*(1 << HSIZE))) - 1) << 8 * HADDR[2:0];
always @(HWDATA or HADDR or HSIZE or HWRITE or dut.hart.MemRWM[1]) begin always @(HWDATA or HADDR or HSIZE or HWRITE or dut.hart.MemRWM[1]) begin
if ((HWRITE || dut.hart.MemRWM[1]) && (HADDR >= 'h80000000 && HADDR <= 'h87FFFFFF)) begin if ((HWRITE || dut.hart.MemRWM[1]) && (HADDR >= 'h80000000 && HADDR <= 'h87FFFFFF)) begin
if (HWRITE) begin if (HWRITE) begin
RAM[RAMAdr] = HWDATA; RAM[RAMAdr] = (RAM[RAMAdr] & (~readMask)) | ((HWDATA << 8 * HADDR[2:0]) & readMask);
end else begin end else begin
readRAM = RAM[RAMAdr]; readRAM = RAM[RAMAdr] & readMask;
end end
end end
end end
@ -199,8 +201,9 @@ module testbench_busybear();
$display("%0t ps, instr %0d: HADDR does not equal readAdrExpected: %x, %x", $time, instrs, HADDR, readAdrExpected); $display("%0t ps, instr %0d: HADDR does not equal readAdrExpected: %x, %x", $time, instrs, HADDR, readAdrExpected);
`ERROR `ERROR
end end
if (HRDATA != readRAM && (HADDR >= 'h80000000 && HADDR <= 'h87FFFFFF)) begin
$display("warning %0t ps, instr %0d: HRDATA does not equal readRAM: %x, %x from address %x", $time, instrs, HRDATA, readRAM, HADDR); if (((readMask & HRDATA) != (readMask & readRAM)) && (HADDR >= 'h80000000 && HADDR <= 'h87FFFFFF)) begin
$display("warning %0t ps, instr %0d: HRDATA does not equal readRAM: %x, %x from address %x, %x", $time, instrs, HRDATA, readRAM, HADDR, HSIZE);
warningCount += 1; warningCount += 1;
`ERROR `ERROR
end end