Added some stuff from modem and added formal
This commit is contained in:
178
cores/wb/wb_mem32/tb/tb_wb_mem32.v
Normal file
178
cores/wb/wb_mem32/tb/tb_wb_mem32.v
Normal file
@@ -0,0 +1,178 @@
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_wb_mem32;
|
||||
reg i_clk;
|
||||
reg i_rst;
|
||||
reg i_wb_rst;
|
||||
reg [31:0] i_wb_adr;
|
||||
reg [31:0] i_wb_dat;
|
||||
reg [3:0] i_wb_sel;
|
||||
reg i_wb_we;
|
||||
reg i_wb_stb;
|
||||
reg i_wb_cyc;
|
||||
wire [31:0] o_wb_rdt;
|
||||
wire o_wb_ack;
|
||||
|
||||
reg [31:0] read_data;
|
||||
|
||||
wb_mem32 #(
|
||||
.memsize(64),
|
||||
.sim(1)
|
||||
) dut (
|
||||
.i_clk(i_clk),
|
||||
.i_rst(i_rst),
|
||||
.i_wb_rst(i_wb_rst),
|
||||
.i_wb_adr(i_wb_adr),
|
||||
.i_wb_dat(i_wb_dat),
|
||||
.i_wb_sel(i_wb_sel),
|
||||
.i_wb_we(i_wb_we),
|
||||
.i_wb_stb(i_wb_stb),
|
||||
.i_wb_cyc(i_wb_cyc),
|
||||
.o_wb_rdt(o_wb_rdt),
|
||||
.o_wb_ack(o_wb_ack)
|
||||
);
|
||||
|
||||
initial i_clk = 1'b0;
|
||||
always #5 i_clk = ~i_clk;
|
||||
|
||||
task automatic wb_write;
|
||||
input [31:0] addr;
|
||||
input [31:0] data;
|
||||
input [3:0] sel;
|
||||
begin
|
||||
@(negedge i_clk);
|
||||
i_wb_adr <= addr;
|
||||
i_wb_dat <= data;
|
||||
i_wb_sel <= sel;
|
||||
i_wb_we <= 1'b1;
|
||||
i_wb_stb <= 1'b1;
|
||||
i_wb_cyc <= 1'b1;
|
||||
|
||||
@(posedge i_clk);
|
||||
#1;
|
||||
if (!o_wb_ack) begin
|
||||
$display("ERROR: write ack missing at time %0t", $time);
|
||||
$finish;
|
||||
end
|
||||
|
||||
@(posedge i_clk);
|
||||
i_wb_stb <= 1'b0;
|
||||
i_wb_cyc <= 1'b0;
|
||||
i_wb_we <= 1'b0;
|
||||
i_wb_sel <= 4'b0000;
|
||||
i_wb_dat <= 32'h0;
|
||||
|
||||
@(posedge i_clk);
|
||||
#1;
|
||||
if (o_wb_ack) begin
|
||||
$display("ERROR: write ack did not clear at time %0t", $time);
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
task automatic wb_read;
|
||||
input [31:0] addr;
|
||||
output [31:0] data;
|
||||
begin
|
||||
@(negedge i_clk);
|
||||
i_wb_adr <= addr;
|
||||
i_wb_dat <= 32'h0;
|
||||
i_wb_sel <= 4'b1111;
|
||||
i_wb_we <= 1'b0;
|
||||
i_wb_stb <= 1'b1;
|
||||
i_wb_cyc <= 1'b1;
|
||||
|
||||
@(posedge i_clk);
|
||||
#1;
|
||||
if (!o_wb_ack) begin
|
||||
$display("ERROR: read ack missing at time %0t", $time);
|
||||
$finish;
|
||||
end
|
||||
data = o_wb_rdt;
|
||||
|
||||
@(posedge i_clk);
|
||||
i_wb_stb <= 1'b0;
|
||||
i_wb_cyc <= 1'b0;
|
||||
i_wb_sel <= 4'b0000;
|
||||
|
||||
@(posedge i_clk);
|
||||
#1;
|
||||
if (o_wb_ack) begin
|
||||
$display("ERROR: read ack did not clear at time %0t", $time);
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
$dumpfile("wb_mem32.vcd");
|
||||
$dumpvars(0, tb_wb_mem32);
|
||||
|
||||
i_rst = 1'b1;
|
||||
i_wb_rst = 1'b0;
|
||||
i_wb_adr = 32'h0;
|
||||
i_wb_dat = 32'h0;
|
||||
i_wb_sel = 4'b0000;
|
||||
i_wb_we = 1'b0;
|
||||
i_wb_stb = 1'b0;
|
||||
i_wb_cyc = 1'b0;
|
||||
|
||||
repeat (2) @(posedge i_clk);
|
||||
i_rst = 1'b0;
|
||||
|
||||
@(negedge i_clk);
|
||||
i_wb_adr <= 32'h0000_0000;
|
||||
i_wb_sel <= 4'b1111;
|
||||
i_wb_stb <= 1'b1;
|
||||
i_wb_cyc <= 1'b0;
|
||||
|
||||
@(posedge i_clk);
|
||||
#1;
|
||||
if (o_wb_ack) begin
|
||||
$display("ERROR: ack asserted without cyc at time %0t", $time);
|
||||
$finish;
|
||||
end
|
||||
|
||||
@(negedge i_clk);
|
||||
i_wb_stb <= 1'b0;
|
||||
i_wb_sel <= 4'b0000;
|
||||
|
||||
wb_read(32'h0000_0000, read_data);
|
||||
if (read_data !== 32'h0000_0000) begin
|
||||
$display("ERROR: reset contents mismatch, got %08x", read_data);
|
||||
$finish;
|
||||
end
|
||||
|
||||
wb_write(32'h0000_0000, 32'hA1B2_C3D4, 4'b1111);
|
||||
wb_read(32'h0000_0000, read_data);
|
||||
if (read_data !== 32'hA1B2_C3D4) begin
|
||||
$display("ERROR: full-word write mismatch, got %08x", read_data);
|
||||
$finish;
|
||||
end
|
||||
|
||||
wb_write(32'h0000_0000, 32'h5566_7788, 4'b0101);
|
||||
wb_read(32'h0000_0000, read_data);
|
||||
if (read_data !== 32'hA166_C388) begin
|
||||
$display("ERROR: byte-enable write mismatch, got %08x", read_data);
|
||||
$finish;
|
||||
end
|
||||
|
||||
wb_write(32'h0000_0004, 32'hDEAD_BEEF, 4'b1111);
|
||||
wb_read(32'h0000_0004, read_data);
|
||||
if (read_data !== 32'hDEAD_BEEF) begin
|
||||
$display("ERROR: second word mismatch, got %08x", read_data);
|
||||
$finish;
|
||||
end
|
||||
|
||||
wb_read(32'h0000_0000, read_data);
|
||||
if (read_data !== 32'hA166_C388) begin
|
||||
$display("ERROR: first word changed unexpectedly, got %08x", read_data);
|
||||
$finish;
|
||||
end
|
||||
|
||||
$display("PASS: wb_mem32 testbench completed successfully");
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user