forked from Github_Repos/cvw
59 lines
1.6 KiB
Systemverilog
59 lines
1.6 KiB
Systemverilog
`include "wally-config.vh"
|
|
|
|
module tlb_testbench();
|
|
logic clk, reset;
|
|
|
|
// DUT inputs
|
|
logic [`XLEN-1:0] SATP;
|
|
logic [`XLEN-1:0] VirtualAddress;
|
|
logic [`XLEN-1:0] PageTableEntryWrite;
|
|
logic TLBWrite, TLBFlush;
|
|
|
|
// DUT outputs
|
|
logic [`XLEN-1:0] PhysicalAddress;
|
|
logic TLBMiss, TLBHit;
|
|
|
|
// Testbench signals
|
|
logic [33:0] expected;
|
|
logic [31:0] vectornum, errors;
|
|
logic [99:0] testvectors[10000:0];
|
|
|
|
assign SATP = {1'b1, 31'b0};
|
|
|
|
// instantiate device under test
|
|
tlb_toy dut(.*);
|
|
|
|
// generate clock
|
|
always begin
|
|
clk=1; #5; clk=0; #5;
|
|
end
|
|
|
|
// at start of test, load vectors and pulse reset
|
|
initial begin
|
|
$readmemb("tlb_toy.tv", testvectors);
|
|
vectornum = 0; errors = 0; reset = 1; #22; reset = 0;
|
|
end
|
|
|
|
// apply test vectors on rising edge of clk
|
|
always @(posedge clk) begin
|
|
#1; {VirtualAddress, PageTableEntryWrite, TLBWrite, TLBFlush, expected} = testvectors[vectornum];
|
|
end
|
|
|
|
// check results on falling edge of clk
|
|
always @(negedge clk)
|
|
if (~reset) begin // skip during reset
|
|
if ({PhysicalAddress, TLBMiss, TLBHit} !== expected) begin // check result
|
|
$display("Error: VirtualAddress = %b, write = %b, data = %b, flush = %b", VirtualAddress,
|
|
TLBWrite, PageTableEntryWrite, TLBFlush);
|
|
$display(" outputs = %b %b %b (%b expected)",
|
|
PhysicalAddress, TLBMiss, TLBHit, expected);
|
|
errors = errors + 1;
|
|
end
|
|
vectornum = vectornum + 1;
|
|
if (testvectors[vectornum] === 100'bx) begin
|
|
$display("%d tests completed with %d errors", vectornum, errors);
|
|
$stop;
|
|
end
|
|
end
|
|
endmodule
|