mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Hacked the sram memory models to reset their internal registers. This allows the simulation to run but is only temporary.
About 149307ns of simulation run.
This commit is contained in:
parent
8cbc9f7e51
commit
7d6093b302
@ -4,14 +4,15 @@ add wave -noupdate /testbench/clk
|
|||||||
add wave -noupdate /testbench/reset
|
add wave -noupdate /testbench/reset
|
||||||
add wave -noupdate -divider <NULL>
|
add wave -noupdate -divider <NULL>
|
||||||
add wave -noupdate /testbench/dut/hart/ebu/IReadF
|
add wave -noupdate /testbench/dut/hart/ebu/IReadF
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/DataStall
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/DataStall
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/InstrStall
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/InstrStall
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/StallF
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/hzu/FlushF
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/StallD
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/StallF
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/FlushD
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/StallD
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/FlushE
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/FlushD
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/FlushM
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/FlushE
|
||||||
add wave -noupdate -group HDU /testbench/dut/hart/FlushW
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/FlushM
|
||||||
|
add wave -noupdate -expand -group HDU /testbench/dut/hart/FlushW
|
||||||
add wave -noupdate -expand -group Bpred -expand -group direction -divider Update
|
add wave -noupdate -expand -group Bpred -expand -group direction -divider Update
|
||||||
add wave -noupdate -expand -group Bpred -expand -group direction /testbench/dut/hart/ifu/bpred/DirPredictor/UpdatePC
|
add wave -noupdate -expand -group Bpred -expand -group direction /testbench/dut/hart/ifu/bpred/DirPredictor/UpdatePC
|
||||||
add wave -noupdate -expand -group Bpred -expand -group direction /testbench/dut/hart/ifu/bpred/DirPredictor/UpdateEN
|
add wave -noupdate -expand -group Bpred -expand -group direction /testbench/dut/hart/ifu/bpred/DirPredictor/UpdateEN
|
||||||
@ -22,8 +23,32 @@ add wave -noupdate -expand -group InstrClass /testbench/dut/hart/ifu/bpred/Instr
|
|||||||
add wave -noupdate -expand -group InstrClass /testbench/dut/hart/ifu/bpred/InstrClassD
|
add wave -noupdate -expand -group InstrClass /testbench/dut/hart/ifu/bpred/InstrClassD
|
||||||
add wave -noupdate -expand -group InstrClass /testbench/dut/hart/ifu/bpred/InstrClassE
|
add wave -noupdate -expand -group InstrClass /testbench/dut/hart/ifu/bpred/InstrClassE
|
||||||
add wave -noupdate /testbench/dut/hart/ifu/bpred/InstrF
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/InstrF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/BPPredWrongE
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/PCNextF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/PCF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/PCPlus2or4F
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/PCNext0F
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/PCNext1F
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/SelBPPredF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/BTBValidF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/BPPredF
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/TargetPredictor/ValidBits
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/TargetPredictor/LookUpPCIndexQ
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/TargetPredictor/UpdatePCIndexQ
|
||||||
|
add wave -noupdate /testbench/dut/hart/ifu/bpred/TargetPredictor/LookUpPC
|
||||||
|
add wave -noupdate -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/TargetWrongE
|
||||||
|
add wave -noupdate -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/FallThroughWrongE
|
||||||
|
add wave -noupdate -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/PredictionDirWrongE
|
||||||
|
add wave -noupdate -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/PredictionPCWrongE
|
||||||
|
add wave -noupdate -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/BPPredWrongE
|
||||||
|
add wave -noupdate -expand -group BTB -divider Update
|
||||||
|
add wave -noupdate -expand -group BTB /testbench/dut/hart/ifu/bpred/TargetPredictor/UpdateEN
|
||||||
|
add wave -noupdate -expand -group BTB /testbench/dut/hart/ifu/bpred/TargetPredictor/UpdatePC
|
||||||
|
add wave -noupdate -expand -group BTB /testbench/dut/hart/ifu/bpred/TargetPredictor/UpdateTarget
|
||||||
|
add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/PCE
|
||||||
|
add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/InstrE
|
||||||
TreeUpdate [SetDefaultTree]
|
TreeUpdate [SetDefaultTree]
|
||||||
WaveRestoreCursors {{Cursor 1} {72 ns} 0}
|
WaveRestoreCursors {{Cursor 1} {66 ns} 0}
|
||||||
quietly wave cursor active 1
|
quietly wave cursor active 1
|
||||||
configure wave -namecolwidth 250
|
configure wave -namecolwidth 250
|
||||||
configure wave -valuecolwidth 185
|
configure wave -valuecolwidth 185
|
||||||
@ -39,4 +64,4 @@ configure wave -griddelta 40
|
|||||||
configure wave -timeline 0
|
configure wave -timeline 0
|
||||||
configure wave -timelineunits ns
|
configure wave -timelineunits ns
|
||||||
update
|
update
|
||||||
WaveRestoreZoom {0 ns} {329 ns}
|
WaveRestoreZoom {21 ns} {105 ns}
|
||||||
|
@ -32,19 +32,19 @@ module BTBPredictor
|
|||||||
#(parameter int Depth = 10
|
#(parameter int Depth = 10
|
||||||
)
|
)
|
||||||
(input logic clk,
|
(input logic clk,
|
||||||
input logic reset,
|
input logic reset,
|
||||||
input logic [`XLEN-1:0] LookUpPC,
|
input logic [`XLEN-1:0] LookUpPC,
|
||||||
output logic [`XLEN-1:0] TargetPC,
|
output logic [`XLEN-1:0] TargetPC,
|
||||||
output logic Valid,
|
output logic Valid,
|
||||||
// update
|
// update
|
||||||
input logic UpdateEN,
|
input logic UpdateEN,
|
||||||
input logic [`XLEN-1:0] UpdatePC,
|
input logic [`XLEN-1:0] UpdatePC,
|
||||||
input logic [`XLEN-1:0] UpdateTarget
|
input logic [`XLEN-1:0] UpdateTarget
|
||||||
);
|
);
|
||||||
|
|
||||||
localparam TotalDepth = 2 ** Depth;
|
localparam TotalDepth = 2 ** Depth;
|
||||||
logic [TotalDepth-1:0] ValidBits;
|
logic [TotalDepth-1:0] ValidBits;
|
||||||
logic [Depth-1:0] LookUpPCIndex, UpdatePCIndex;
|
logic [Depth-1:0] LookUpPCIndex, UpdatePCIndex, LookUpPCIndexQ, UpdatePCIndexQ;
|
||||||
|
|
||||||
// hashing function for indexing the PC
|
// hashing function for indexing the PC
|
||||||
// We have Depth bits to index, but XLEN bits as the input.
|
// We have Depth bits to index, but XLEN bits as the input.
|
||||||
@ -53,29 +53,44 @@ module BTBPredictor
|
|||||||
assign UpdatePCIndex = {UpdatePC[Depth+1] ^ UpdatePC[1], UpdatePC[Depth:2]};
|
assign UpdatePCIndex = {UpdatePC[Depth+1] ^ UpdatePC[1], UpdatePC[Depth:2]};
|
||||||
assign LookUpPCIndex = {LookUpPC[Depth+1] ^ LookUpPC[1], LookUpPC[Depth:2]};
|
assign LookUpPCIndex = {LookUpPC[Depth+1] ^ LookUpPC[1], LookUpPC[Depth:2]};
|
||||||
|
|
||||||
|
|
||||||
|
flopenr #(Depth) UpdatePCIndexReg(.clk(clk),
|
||||||
|
.reset(reset),
|
||||||
|
.en(1'b1),
|
||||||
|
.d(UpdatePCIndex),
|
||||||
|
.q(UpdatePCIndexQ));
|
||||||
|
|
||||||
// The valid bit must be resetable.
|
// The valid bit must be resetable.
|
||||||
always_ff @ (posedge clk) begin
|
always_ff @ (posedge clk) begin
|
||||||
if (reset) begin
|
if (reset) begin
|
||||||
ValidBits <= #1 {TotalDepth{1'b0}};
|
ValidBits <= #1 {TotalDepth{1'b0}};
|
||||||
end else if (UpdateEN) begin
|
end else if (UpdateEN) begin
|
||||||
ValidBits[UpdatePCIndex] <= #1 1'b1;
|
ValidBits[UpdatePCIndexQ] <= #1 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
flopenr #(Depth) LookupPCIndexReg(.clk(clk),
|
||||||
|
.reset(reset),
|
||||||
|
.en(1'b1),
|
||||||
|
.d(LookUpPCIndex),
|
||||||
|
.q(LookUpPCIndexQ));
|
||||||
|
|
||||||
|
assign Valid = ValidBits[LookUpPCIndexQ];
|
||||||
|
|
||||||
// the BTB contains the target address.
|
// the BTB contains the target address.
|
||||||
// *** future version may contain the instruction class, a tag or partial tag,
|
// *** future version may contain the instruction class, a tag or partial tag,
|
||||||
// and other indirection branch data.
|
// and other indirection branch data.
|
||||||
// Another optimization may be using a PC relative address.
|
// Another optimization may be using a PC relative address.
|
||||||
|
|
||||||
SRAM2P1R1W #(Depth, `XLEN) memory(.clk(clk),
|
SRAM2P1R1W #(Depth, `XLEN) memory(.clk(clk),
|
||||||
.RA1(LookUpPCIndex),
|
.reset(reset),
|
||||||
.RD1(TargetPC),
|
.RA1(LookUpPCIndex),
|
||||||
.REN1(1'b1),
|
.RD1(TargetPC),
|
||||||
.WA1(UpdatePCIndex),
|
.REN1(1'b1),
|
||||||
.WD1(UpdateTarget),
|
.WA1(UpdatePCIndex),
|
||||||
.WEN1(UpdateEN),
|
.WD1(UpdateTarget),
|
||||||
.BitWEN1({`XLEN{1'b1}}));
|
.WEN1(UpdateEN),
|
||||||
|
.BitWEN1({`XLEN{1'b1}}));
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -40,8 +40,10 @@ module SRAM2P1R1W
|
|||||||
parameter int Width = 2
|
parameter int Width = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
(input clk,
|
(input logic clk,
|
||||||
|
// *** have to remove reset eventually
|
||||||
|
input logic reset,
|
||||||
|
|
||||||
// port 1 is read only
|
// port 1 is read only
|
||||||
input logic [Depth-1:0] RA1,
|
input logic [Depth-1:0] RA1,
|
||||||
output logic [Width-1:0] RD1,
|
output logic [Width-1:0] RD1,
|
||||||
@ -59,39 +61,39 @@ module SRAM2P1R1W
|
|||||||
logic WEN1Q;
|
logic WEN1Q;
|
||||||
logic [Width-1:0] WD1Q;
|
logic [Width-1:0] WD1Q;
|
||||||
|
|
||||||
logic [Width-1:0] memory [2**Depth-1:0];
|
logic [Width-1:0] memory [2**Depth-1:0];
|
||||||
|
|
||||||
|
|
||||||
// SRAMs address busses are always registered first.
|
// SRAMs address busses are always registered first.
|
||||||
|
|
||||||
flopenr #(Depth) RA1Reg(.clk(clk),
|
flopenr #(Depth) RA1Reg(.clk(clk),
|
||||||
.reset(1'b0),
|
.reset(reset),
|
||||||
.en(REN1),
|
.en(REN1),
|
||||||
.d(RA1),
|
.d(RA1),
|
||||||
.q(RA1Q));
|
.q(RA1Q));
|
||||||
|
|
||||||
|
|
||||||
flopenr #(Depth) WA1Reg(.clk(clk),
|
flopenr #(Depth) WA1Reg(.clk(clk),
|
||||||
.reset(1'b0),
|
.reset(reset),
|
||||||
.en(REN1),
|
.en(REN1),
|
||||||
.d(WA1),
|
.d(WA1),
|
||||||
.q(WA1Q));
|
.q(WA1Q));
|
||||||
|
|
||||||
flopenr #(1) WEN1Reg(.clk(clk),
|
flopenr #(1) WEN1Reg(.clk(clk),
|
||||||
.reset(1'b0),
|
.reset(reset),
|
||||||
.en(1'b1),
|
.en(1'b1),
|
||||||
.d(WEN1),
|
.d(WEN1),
|
||||||
.q(WEN1Q));
|
.q(WEN1Q));
|
||||||
|
|
||||||
flopenr #(Width) WD1Reg(.clk(clk),
|
flopenr #(Width) WD1Reg(.clk(clk),
|
||||||
.reset(1'b0),
|
.reset(reset),
|
||||||
.en(REN1),
|
.en(REN1),
|
||||||
.d(WD1),
|
.d(WD1),
|
||||||
.q(WD1Q));
|
.q(WD1Q));
|
||||||
// read port
|
// read port
|
||||||
assign RD1 = memory[RA1Q];
|
assign RD1 = memory[RA1Q];
|
||||||
|
|
||||||
genvar index;
|
genvar index;
|
||||||
|
|
||||||
// write port
|
// write port
|
||||||
generate
|
generate
|
||||||
|
@ -162,13 +162,13 @@ module bpred
|
|||||||
// Check the prediction makes execution.
|
// Check the prediction makes execution.
|
||||||
assign TargetWrongE = PCTargetE != PCD;
|
assign TargetWrongE = PCTargetE != PCD;
|
||||||
assign FallThroughWrongE = PCLinkE != PCD;
|
assign FallThroughWrongE = PCLinkE != PCD;
|
||||||
assign PredictionDirWrongE = BPPredE ^ PCSrcE;
|
assign PredictionDirWrongE = (BPPredE[1] ^ PCSrcE) & InstrClassE[0];
|
||||||
assign PredictionPCWrongE = PCSrcE ? TargetWrongE : FallThroughWrongE;
|
assign PredictionPCWrongE = PCSrcE ? TargetWrongE : FallThroughWrongE;
|
||||||
assign BPPredWrongE = PredictionPCWrongE | PredictionDirWrongE;
|
assign BPPredWrongE = (PredictionPCWrongE | PredictionDirWrongE) & (|InstrClassE);
|
||||||
|
|
||||||
// Update predictors
|
// Update predictors
|
||||||
|
|
||||||
satCounter2 BPDirUpdate(.BrDir(~PredictionDirWrongE),
|
satCounter2 BPDirUpdate(.BrDir(PCSrcE),
|
||||||
.OldState(BPPredE),
|
.OldState(BPPredE),
|
||||||
.NewState(UpdateBPPredE));
|
.NewState(UpdateBPPredE));
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ module twoBitPredictor
|
|||||||
#(parameter int Depth = 10
|
#(parameter int Depth = 10
|
||||||
)
|
)
|
||||||
(input logic clk,
|
(input logic clk,
|
||||||
|
input logic reset,
|
||||||
input logic [`XLEN-1:0] LookUpPC,
|
input logic [`XLEN-1:0] LookUpPC,
|
||||||
output logic [1:0] Prediction,
|
output logic [1:0] Prediction,
|
||||||
// update
|
// update
|
||||||
@ -52,6 +53,7 @@ module twoBitPredictor
|
|||||||
|
|
||||||
|
|
||||||
SRAM2P1R1W #(Depth, 2) memory(.clk(clk),
|
SRAM2P1R1W #(Depth, 2) memory(.clk(clk),
|
||||||
|
.reset(reset),
|
||||||
.RA1(LookUpPCIndex),
|
.RA1(LookUpPCIndex),
|
||||||
.RD1(PredictionMemory),
|
.RD1(PredictionMemory),
|
||||||
.REN1(1'b1),
|
.REN1(1'b1),
|
||||||
|
@ -329,7 +329,7 @@ string tests32i[] = {
|
|||||||
memfilename = {"../../imperas-riscv-tests/work/", tests[test], ".elf.memfile"};
|
memfilename = {"../../imperas-riscv-tests/work/", tests[test], ".elf.memfile"};
|
||||||
$readmemh(memfilename, dut.imem.RAM);
|
$readmemh(memfilename, dut.imem.RAM);
|
||||||
$readmemh(memfilename, dut.uncore.dtim.RAM);
|
$readmemh(memfilename, dut.uncore.dtim.RAM);
|
||||||
reset = 1; # 22; reset = 0;
|
reset = 1; # 42; reset = 0;
|
||||||
end
|
end
|
||||||
|
|
||||||
// generate clock to sequence tests
|
// generate clock to sequence tests
|
||||||
|
Loading…
Reference in New Issue
Block a user