new timer
This commit is contained in:
143
cores/wb/wb_timer/tb/tb_wb_timer.v
Normal file
143
cores/wb/wb_timer/tb/tb_wb_timer.v
Normal file
@@ -0,0 +1,143 @@
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_wb_timer;
|
||||
localparam ADDR_COUNTER = 32'h0000_0000;
|
||||
localparam ADDR_PRELOAD = 32'h0000_0004;
|
||||
localparam ADDR_ACK = 32'h0000_0008;
|
||||
|
||||
reg i_clk;
|
||||
reg i_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_dat;
|
||||
wire o_wb_ack;
|
||||
wire o_irq;
|
||||
|
||||
reg [31:0] read_data;
|
||||
integer cycle;
|
||||
|
||||
wb_countdown_timer dut (
|
||||
.i_clk(i_clk),
|
||||
.i_rst(i_rst),
|
||||
.o_irq(o_irq),
|
||||
.i_wb_adr(i_wb_adr),
|
||||
.i_wb_dat(i_wb_dat),
|
||||
.o_wb_dat(o_wb_dat),
|
||||
.i_wb_sel(i_wb_sel),
|
||||
.i_wb_we(i_wb_we),
|
||||
.i_wb_cyc(i_wb_cyc),
|
||||
.i_wb_stb(i_wb_stb),
|
||||
.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;
|
||||
|
||||
while (!o_wb_ack)
|
||||
@(posedge i_clk);
|
||||
|
||||
@(negedge i_clk);
|
||||
i_wb_we <= 1'b0;
|
||||
i_wb_stb <= 1'b0;
|
||||
i_wb_cyc <= 1'b0;
|
||||
i_wb_sel <= 4'b0000;
|
||||
i_wb_dat <= 32'h0000_0000;
|
||||
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'h0000_0000;
|
||||
i_wb_sel <= 4'b1111;
|
||||
i_wb_we <= 1'b0;
|
||||
i_wb_stb <= 1'b1;
|
||||
i_wb_cyc <= 1'b1;
|
||||
|
||||
while (!o_wb_ack)
|
||||
@(posedge i_clk);
|
||||
|
||||
#1;
|
||||
data = o_wb_dat;
|
||||
|
||||
@(negedge i_clk);
|
||||
i_wb_stb <= 1'b0;
|
||||
i_wb_cyc <= 1'b0;
|
||||
i_wb_sel <= 4'b0000;
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
$dumpfile("wb_timer.vcd");
|
||||
$dumpvars(0, tb_wb_timer);
|
||||
|
||||
i_rst = 1'b1;
|
||||
i_wb_adr = 32'h0000_0000;
|
||||
i_wb_dat = 32'h0000_0000;
|
||||
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;
|
||||
|
||||
wb_write(ADDR_COUNTER, 5, 4'b1111);
|
||||
wb_write(ADDR_PRELOAD, 0, 4'b1111);
|
||||
|
||||
for (cycle = 0; cycle < 40; cycle = cycle + 1) begin
|
||||
@(posedge i_clk);
|
||||
if(o_irq)
|
||||
wb_write(ADDR_ACK, 32'h0000_ffff, 4'b1111);
|
||||
end
|
||||
|
||||
for (cycle = 0; cycle < 8; cycle = cycle + 1)
|
||||
@(posedge i_clk);
|
||||
|
||||
wb_write(ADDR_PRELOAD, 8, 4'b1111);
|
||||
|
||||
for (cycle = 0; cycle < 21; cycle = cycle + 1) begin
|
||||
@(posedge i_clk);
|
||||
if(o_irq)
|
||||
wb_write(ADDR_ACK, 32'h0000_ffff, 4'b1111);
|
||||
end
|
||||
|
||||
wb_write(ADDR_PRELOAD, 6, 4'b1111);
|
||||
|
||||
for (cycle = 0; cycle < 21; cycle = cycle + 1) begin
|
||||
@(posedge i_clk);
|
||||
if(o_irq)
|
||||
wb_write(ADDR_ACK, 32'h0000_ffff, 4'b1111);
|
||||
end
|
||||
|
||||
wb_write(ADDR_PRELOAD, 0, 4'b1111);
|
||||
|
||||
for (cycle = 0; cycle < 10; cycle = cycle + 1) begin
|
||||
@(posedge i_clk);
|
||||
if(o_irq)
|
||||
wb_write(ADDR_ACK, 32'h0000_ffff, 4'b1111);
|
||||
end
|
||||
|
||||
$finish;
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user