86 lines
1.6 KiB
Systemverilog
86 lines
1.6 KiB
Systemverilog
module testbench();
|
|
|
|
timeunit 10ns;
|
|
|
|
timeprecision 1ns;
|
|
|
|
logic clk_50, clk, cs;
|
|
logic rw, MM_cs;
|
|
logic rst;
|
|
logic [3:0] RS, MA;
|
|
logic [7:0] data_in;
|
|
logic [7:0] data_out;
|
|
|
|
logic [11:0] MO;
|
|
|
|
logic [11:0] _data_in;
|
|
assign _data_in = {4'h0, data_in};
|
|
|
|
logic [11:0] _data_out;
|
|
assign data_out = _data_out[7:0];
|
|
|
|
logic [15:0] cpu_addr;
|
|
logic [23:0] mm_address;
|
|
assign MA = cpu_addr[15:12];
|
|
assign mm_address = {MO, cpu_addr[11:0]};
|
|
|
|
memory_mapper dut(
|
|
.data_in(_data_in),
|
|
.data_out(_data_out),
|
|
.*
|
|
);
|
|
|
|
always #1 clk_50 = clk_50 === 1'b0;
|
|
always #100 clk = clk === 1'b0;
|
|
|
|
task write_reg(logic [3:0] addr, logic [7:0] data);
|
|
@(negedge clk);
|
|
cs <= '1;
|
|
RS <= addr;
|
|
data_in <= data;
|
|
rw <= '0;
|
|
@(posedge clk);
|
|
cs <= '0;
|
|
rw <= '1;
|
|
@(negedge clk);
|
|
endtask
|
|
|
|
task enable(logic [7:0] data);
|
|
@(negedge clk);
|
|
MM_cs <= '1;
|
|
rw <= '0;
|
|
data_in <= data;
|
|
@(posedge clk);
|
|
rw <= '1;
|
|
MM_cs <= '0;
|
|
@(negedge clk);
|
|
endtask
|
|
|
|
initial begin
|
|
rst <= '1;
|
|
repeat(5) @(posedge clk);
|
|
rst <= '0;
|
|
|
|
cpu_addr <= 16'h0abc;
|
|
write_reg(4'h0, 8'hcc);
|
|
$display("Address: %x", mm_address);
|
|
assert(mm_address == 24'h000abc) else begin
|
|
$error("Bad address before enable!");
|
|
end
|
|
|
|
enable(1);
|
|
$display("Address: %x", mm_address);
|
|
assert(mm_address == 24'h0ccabc) else begin
|
|
$error("Bad address after enable!");
|
|
end
|
|
|
|
enable(0);
|
|
$display("Address: %x", mm_address);
|
|
assert(mm_address == 24'h000abc) else begin
|
|
$error("Bad address after enable!");
|
|
end
|
|
$finish();
|
|
end
|
|
|
|
endmodule
|