forked from Github_Repos/cvw
Merge branch 'main' of https://github.com/openhwgroup/cvw into dev
This commit is contained in:
commit
77affa7ccd
2
src/cache/cachefsm.sv
vendored
2
src/cache/cachefsm.sv
vendored
@ -135,7 +135,7 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
|
|||||||
end
|
end
|
||||||
|
|
||||||
// com back to CPU
|
// com back to CPU
|
||||||
assign CacheCommitted = CurrState != STATE_READY;
|
assign CacheCommitted = (CurrState != STATE_READY) & ~(READ_ONLY_CACHE & CurrState == STATE_READ_HOLD);
|
||||||
assign CacheStall = (CurrState == STATE_READY & (FlushCache | AnyMiss)) |
|
assign CacheStall = (CurrState == STATE_READY & (FlushCache | AnyMiss)) |
|
||||||
(CurrState == STATE_FETCH) |
|
(CurrState == STATE_FETCH) |
|
||||||
(CurrState == STATE_WRITEBACK) |
|
(CurrState == STATE_WRITEBACK) |
|
||||||
|
@ -33,7 +33,8 @@ module ahbcacheinterface #(
|
|||||||
parameter BEATSPERLINE, // Number of AHBW words (beats) in cacheline
|
parameter BEATSPERLINE, // Number of AHBW words (beats) in cacheline
|
||||||
parameter AHBWLOGBWPL, // Log2 of ^
|
parameter AHBWLOGBWPL, // Log2 of ^
|
||||||
parameter LINELEN, // Number of bits in cacheline
|
parameter LINELEN, // Number of bits in cacheline
|
||||||
parameter LLENPOVERAHBW // Number of AHB beats in a LLEN word. AHBW cannot be larger than LLEN. (implementation limitation)
|
parameter LLENPOVERAHBW, // Number of AHB beats in a LLEN word. AHBW cannot be larger than LLEN. (implementation limitation)
|
||||||
|
parameter READ_ONLY_CACHE
|
||||||
)(
|
)(
|
||||||
input logic HCLK, HRESETn,
|
input logic HCLK, HRESETn,
|
||||||
// bus interface controls
|
// bus interface controls
|
||||||
@ -115,7 +116,7 @@ module ahbcacheinterface #(
|
|||||||
|
|
||||||
flopen #(`AHBW/8) HWSTRBReg(HCLK, HREADY, BusByteMaskM[`AHBW/8-1:0], HWSTRB);
|
flopen #(`AHBW/8) HWSTRBReg(HCLK, HREADY, BusByteMaskM[`AHBW/8-1:0], HWSTRB);
|
||||||
|
|
||||||
buscachefsm #(BeatCountThreshold, AHBWLOGBWPL) AHBBuscachefsm(
|
buscachefsm #(BeatCountThreshold, AHBWLOGBWPL, READ_ONLY_CACHE) AHBBuscachefsm(
|
||||||
.HCLK, .HRESETn, .Flush, .BusRW, .Stall, .BusCommitted, .BusStall, .CaptureEn, .SelBusBeat,
|
.HCLK, .HRESETn, .Flush, .BusRW, .Stall, .BusCommitted, .BusStall, .CaptureEn, .SelBusBeat,
|
||||||
.CacheBusRW, .CacheBusAck, .BeatCount, .BeatCountDelayed,
|
.CacheBusRW, .CacheBusAck, .BeatCount, .BeatCountDelayed,
|
||||||
.HREADY, .HTRANS, .HWRITE, .HBURST);
|
.HREADY, .HTRANS, .HWRITE, .HBURST);
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
// HCLK and clk must be the same clock!
|
// HCLK and clk must be the same clock!
|
||||||
module buscachefsm #(
|
module buscachefsm #(
|
||||||
parameter BeatCountThreshold, // Largest beat index
|
parameter BeatCountThreshold, // Largest beat index
|
||||||
parameter AHBWLOGBWPL // Log2 of BEATSPERLINE
|
parameter AHBWLOGBWPL, // Log2 of BEATSPERLINE
|
||||||
|
parameter READ_ONLY_CACHE
|
||||||
)(
|
)(
|
||||||
input logic HCLK,
|
input logic HCLK,
|
||||||
input logic HRESETn,
|
input logic HRESETn,
|
||||||
@ -121,7 +122,7 @@ module buscachefsm #(
|
|||||||
(CurrState == DATA_PHASE) |
|
(CurrState == DATA_PHASE) |
|
||||||
(CurrState == CACHE_FETCH & ~HREADY) |
|
(CurrState == CACHE_FETCH & ~HREADY) |
|
||||||
(CurrState == CACHE_WRITEBACK & ~HREADY);
|
(CurrState == CACHE_WRITEBACK & ~HREADY);
|
||||||
assign BusCommitted = CurrState != ADR_PHASE;
|
assign BusCommitted = (CurrState != ADR_PHASE) & ~(READ_ONLY_CACHE & CurrState == MEM3);
|
||||||
|
|
||||||
// AHB bus interface
|
// AHB bus interface
|
||||||
assign HTRANS = (CurrState == ADR_PHASE & HREADY & ((|BusRW) | (|CacheBusRW)) & ~Flush) |
|
assign HTRANS = (CurrState == ADR_PHASE & HREADY & ((|BusRW) | (|CacheBusRW)) & ~Flush) |
|
||||||
|
@ -251,7 +251,7 @@ module ifu (
|
|||||||
.NextSet(PCSpillNextF[11:0]),
|
.NextSet(PCSpillNextF[11:0]),
|
||||||
.PAdr(PCPF),
|
.PAdr(PCPF),
|
||||||
.CacheCommitted(CacheCommittedF), .InvalidateCache(InvalidateICacheM));
|
.CacheCommitted(CacheCommittedF), .InvalidateCache(InvalidateICacheM));
|
||||||
ahbcacheinterface #(WORDSPERLINE, LOGBWPL, LINELEN, LLENPOVERAHBW)
|
ahbcacheinterface #(WORDSPERLINE, LOGBWPL, LINELEN, LLENPOVERAHBW, 1)
|
||||||
ahbcacheinterface(.HCLK(clk), .HRESETn(~reset),
|
ahbcacheinterface(.HCLK(clk), .HRESETn(~reset),
|
||||||
.HRDATA,
|
.HRDATA,
|
||||||
.Flush(FlushD), .CacheBusRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS), .HWSTRB(),
|
.Flush(FlushD), .CacheBusRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS), .HWSTRB(),
|
||||||
|
@ -275,7 +275,7 @@ module lsu (
|
|||||||
.FetchBuffer, .CacheBusRW,
|
.FetchBuffer, .CacheBusRW,
|
||||||
.CacheBusAck(DCacheBusAck), .InvalidateCache(1'b0));
|
.CacheBusAck(DCacheBusAck), .InvalidateCache(1'b0));
|
||||||
|
|
||||||
ahbcacheinterface #(.BEATSPERLINE(BEATSPERLINE), .AHBWLOGBWPL(AHBWLOGBWPL), .LINELEN(LINELEN), .LLENPOVERAHBW(LLENPOVERAHBW)) ahbcacheinterface(
|
ahbcacheinterface #(.BEATSPERLINE(BEATSPERLINE), .AHBWLOGBWPL(AHBWLOGBWPL), .LINELEN(LINELEN), .LLENPOVERAHBW(LLENPOVERAHBW), .READ_ONLY_CACHE(0)) ahbcacheinterface(
|
||||||
.HCLK(clk), .HRESETn(~reset), .Flush(FlushW),
|
.HCLK(clk), .HRESETn(~reset), .Flush(FlushW),
|
||||||
.HRDATA, .HWDATA(LSUHWDATA), .HWSTRB(LSUHWSTRB),
|
.HRDATA, .HWDATA(LSUHWDATA), .HWSTRB(LSUHWSTRB),
|
||||||
.HSIZE(LSUHSIZE), .HBURST(LSUHBURST), .HTRANS(LSUHTRANS), .HWRITE(LSUHWRITE), .HREADY(LSUHREADY),
|
.HSIZE(LSUHSIZE), .HBURST(LSUHBURST), .HTRANS(LSUHTRANS), .HWRITE(LSUHWRITE), .HREADY(LSUHREADY),
|
||||||
|
@ -29,9 +29,9 @@
|
|||||||
`include "tests.vh"
|
`include "tests.vh"
|
||||||
|
|
||||||
`define PrintHPMCounters 1
|
`define PrintHPMCounters 1
|
||||||
`define BPRED_LOGGER 1
|
`define BPRED_LOGGER 0
|
||||||
`define I_CACHE_ADDR_LOGGER 1
|
`define I_CACHE_ADDR_LOGGER 0
|
||||||
`define D_CACHE_ADDR_LOGGER 1
|
`define D_CACHE_ADDR_LOGGER 0
|
||||||
|
|
||||||
module testbench;
|
module testbench;
|
||||||
parameter DEBUG=0;
|
parameter DEBUG=0;
|
||||||
@ -169,7 +169,8 @@ logic [3:0] dummy;
|
|||||||
logic InitializingMemories;
|
logic InitializingMemories;
|
||||||
integer ResetCount, ResetThreshold;
|
integer ResetCount, ResetThreshold;
|
||||||
logic InReset;
|
logic InReset;
|
||||||
|
logic Begin;
|
||||||
|
|
||||||
// instantiate device to be tested
|
// instantiate device to be tested
|
||||||
assign GPIOIN = 0;
|
assign GPIOIN = 0;
|
||||||
assign UARTSin = 1;
|
assign UARTSin = 1;
|
||||||
@ -417,7 +418,7 @@ logic [3:0] dummy;
|
|||||||
if(`PrintHPMCounters & `ZICOUNTERS_SUPPORTED) begin : HPMCSample
|
if(`PrintHPMCounters & `ZICOUNTERS_SUPPORTED) begin : HPMCSample
|
||||||
integer HPMCindex;
|
integer HPMCindex;
|
||||||
logic StartSampleFirst;
|
logic StartSampleFirst;
|
||||||
logic StartSampleDelayed;
|
logic StartSampleDelayed, BeginDelayed;
|
||||||
logic EndSampleFirst, EndSampleDelayed;
|
logic EndSampleFirst, EndSampleDelayed;
|
||||||
logic [`XLEN-1:0] InitialHPMCOUNTERH[`COUNTERS-1:0];
|
logic [`XLEN-1:0] InitialHPMCOUNTERH[`COUNTERS-1:0];
|
||||||
|
|
||||||
@ -476,8 +477,11 @@ logic [3:0] dummy;
|
|||||||
assign StartSampleFirst = InReset;
|
assign StartSampleFirst = InReset;
|
||||||
flopr #(1) StartSampleReg(clk, reset, StartSampleFirst, StartSampleDelayed);
|
flopr #(1) StartSampleReg(clk, reset, StartSampleFirst, StartSampleDelayed);
|
||||||
assign StartSample = StartSampleFirst & ~ StartSampleDelayed;
|
assign StartSample = StartSampleFirst & ~ StartSampleDelayed;
|
||||||
|
|
||||||
assign EndSample = DCacheFlushStart & ~DCacheFlushDone;
|
assign EndSample = DCacheFlushStart & ~DCacheFlushDone;
|
||||||
|
|
||||||
|
flop #(1) BeginReg(clk, StartSampleFirst, BeginDelayed);
|
||||||
|
assign Begin = StartSampleFirst & ~ BeginDelayed;
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
always @(negedge clk) begin
|
always @(negedge clk) begin
|
||||||
@ -528,7 +532,7 @@ logic [3:0] dummy;
|
|||||||
|
|
||||||
|
|
||||||
// initialize the branch predictor
|
// initialize the branch predictor
|
||||||
if (`BPRED_SUPPORTED == 1) begin
|
if (`BPRED_SUPPORTED) begin
|
||||||
integer adrindex;
|
integer adrindex;
|
||||||
|
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
@ -551,55 +555,63 @@ logic [3:0] dummy;
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
if (`I_CACHE_ADDR_LOGGER == 1) begin
|
if (`ICACHE_SUPPORTED && `I_CACHE_ADDR_LOGGER) begin
|
||||||
int file;
|
int file;
|
||||||
string LogFile;
|
string LogFile;
|
||||||
logic resetD, resetEdge;
|
logic resetD, resetEdge;
|
||||||
|
logic Enable;
|
||||||
|
assign Enable = ~dut.core.StallD & ~dut.core.FlushD & dut.core.ifu.bus.icache.CacheRWF[1] & ~reset;
|
||||||
flop #(1) ResetDReg(clk, reset, resetD);
|
flop #(1) ResetDReg(clk, reset, resetD);
|
||||||
assign resetEdge = ~reset & resetD;
|
assign resetEdge = ~reset & resetD;
|
||||||
initial begin
|
initial begin
|
||||||
LogFile = $psprintf("ICache.log");
|
LogFile = $psprintf("ICache.log");
|
||||||
file = $fopen(LogFile, "w");
|
file = $fopen(LogFile, "w");
|
||||||
|
$fwrite(file, "BEGIN %s\n", memfilename);
|
||||||
end
|
end
|
||||||
|
string HitMissString;
|
||||||
|
assign HitMissString = dut.core.ifu.bus.icache.icache.CacheHit ? "H" : "M";
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if(resetEdge) $fwrite(file, "TRAIN\n");
|
if(resetEdge) $fwrite(file, "TRAIN\n");
|
||||||
if(StartSample) $fwrite(file, "BEGIN %s\n", memfilename);
|
if(Begin) $fwrite(file, "BEGIN %s\n", memfilename);
|
||||||
if(~dut.core.StallD & ~dut.core.FlushD) begin
|
if(Enable) begin // only log i cache reads
|
||||||
$fwrite(file, "%h R\n", dut.core.ifu.PCPF);
|
$fwrite(file, "%h R %s\n", dut.core.ifu.PCPF, HitMissString);
|
||||||
end
|
end
|
||||||
if(EndSample) $fwrite(file, "END %s\n", memfilename);
|
if(EndSample) $fwrite(file, "END %s\n", memfilename);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (`D_CACHE_ADDR_LOGGER == 1) begin
|
if (`DCACHE_SUPPORTED && `D_CACHE_ADDR_LOGGER) begin
|
||||||
int file;
|
int file;
|
||||||
string LogFile;
|
string LogFile;
|
||||||
logic resetD, resetEdge;
|
logic resetD, resetEdge;
|
||||||
|
string HitMissString;
|
||||||
flop #(1) ResetDReg(clk, reset, resetD);
|
flop #(1) ResetDReg(clk, reset, resetD);
|
||||||
assign resetEdge = ~reset & resetD;
|
assign resetEdge = ~reset & resetD;
|
||||||
|
assign HitMissString = dut.core.lsu.bus.dcache.dcache.CacheHit ? "H" : "M";
|
||||||
initial begin
|
initial begin
|
||||||
LogFile = $psprintf("DCache.log");
|
LogFile = $psprintf("DCache.log");
|
||||||
file = $fopen(LogFile, "w");
|
file = $fopen(LogFile, "w");
|
||||||
|
$fwrite(file, "BEGIN %s\n", memfilename);
|
||||||
end
|
end
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if(resetEdge) $fwrite(file, "TRAIN\n");
|
if(resetEdge) $fwrite(file, "TRAIN\n");
|
||||||
if(StartSample) $fwrite(file, "BEGIN %s\n", memfilename);
|
if(Begin) $fwrite(file, "BEGIN %s\n", memfilename);
|
||||||
if(~dut.core.StallW & ~dut.core.FlushW & dut.core.InstrValidM) begin
|
if(~dut.core.StallW & ~dut.core.FlushW & dut.core.InstrValidM) begin
|
||||||
if(dut.core.lsu.bus.dcache.CacheRWM == 2'b10) begin
|
if(dut.core.lsu.bus.dcache.CacheRWM == 2'b10) begin
|
||||||
$fwrite(file, "%h R\n", dut.core.lsu.PAdrM);
|
$fwrite(file, "%h R %s\n", dut.core.lsu.PAdrM, HitMissString);
|
||||||
end else if (dut.core.lsu.bus.dcache.CacheRWM == 2'b01) begin
|
end else if (dut.core.lsu.bus.dcache.CacheRWM == 2'b01) begin
|
||||||
$fwrite(file, "%h W\n", dut.core.lsu.PAdrM);
|
$fwrite(file, "%h W %s\n", dut.core.lsu.PAdrM, HitMissString);
|
||||||
end else if (dut.core.lsu.bus.dcache.CacheAtomicM[1] == 1'b1) begin // *** This may change
|
end else if (dut.core.lsu.bus.dcache.CacheAtomicM[1] == 1'b1) begin // *** This may change
|
||||||
$fwrite(file, "%h A\n", dut.core.lsu.PAdrM);
|
$fwrite(file, "%h A %s\n", dut.core.lsu.PAdrM, HitMissString);
|
||||||
end else if (dut.core.lsu.bus.dcache.FlushDCache) begin
|
end else if (dut.core.lsu.bus.dcache.FlushDCache) begin
|
||||||
$fwrite(file, "%h F\n", dut.core.lsu.PAdrM);
|
$fwrite(file, "%h F %s\n", dut.core.lsu.PAdrM, HitMissString);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if(EndSample) $fwrite(file, "END %s\n", memfilename);
|
if(EndSample) $fwrite(file, "END %s\n", memfilename);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (`BPRED_SUPPORTED == 1) begin
|
if (`BPRED_SUPPORTED) begin
|
||||||
if (`BPRED_LOGGER) begin
|
if (`BPRED_LOGGER) begin
|
||||||
string direction;
|
string direction;
|
||||||
int file;
|
int file;
|
||||||
|
Loading…
Reference in New Issue
Block a user