Axi TB
Axi TB
module axi_tb;
parameter AW = 32;
parameter DW = 32;
// DUT signals
logic clk;
logic rst;
logic awvalid;
logic [AW-1:0] awaddr;
logic [3:0] awlen; // Tie to 0
logic [2:0] awsize; // Tie to 2 (for 4-byte/32-bit)
logic awready;
logic wvalid;
logic [DW-1:0] wdata;
logic wready;
logic arvalid;
logic [AW-1:0] araddr;
logic [3:0] arlen; // Tie to 0
logic [2:0] arsize; // Tie to 2
logic arready;
logic rvalid;
logic [DW-1:0] rdata;
logic rready;
// Clock generation
always #5 clk = ~clk;
// DUT instantiation
axi_csr_cmdlut_intf
// #(
// .INIT_FILE("mem_init.mem")
// )
u_dut(
.clk_i(clk),
.rst_n_i(rst),
.awvalid_i(awvalid),
.awaddr_i(awaddr),
.awlen_i(awlen),
.awsize_i(awsize),
.awready_o(awready),
.wvalid_i(wvalid),
.wdata_i(wdata),
.wready_o(wready),
.bvalid_o(bvalid),
.bready_i(bready),
.bresp_o(bresp),
.arvalid_i(arvalid),
.araddr_i(araddr),
.arlen_i(arlen),
.arsize_i(arsize),
.arready_o(arready),
.rvalid_o(rvalid),
.rdata_o(rdata),
.rready_i(rready),
.in_port_list(in_port_list_tb),
.out_port_list(out_port_list_tb),
.hw_cmdlut_rd_addr (hw_cmdlut_rd_addr ),
.hw_cmdlut_rd_en (hw_cmdlut_rd_en ),
.hw_data_cmdlut (hw_data_cmdlut ),
.hw_data_cmdlut_val(hw_data_cmdlut_val)
);
// --------------------------
// WRITE TASK
task automatic axi_write(input [AW-1:0] addr, input [DW-1:0] data);
begin
@(posedge clk);
awvalid <= 1;
awaddr <= addr;
wvalid <= 1;
wdata <= data;
wait (awready)
@(posedge clk);
awvalid <= 0;
wvalid <= 0;
wdata <= 0;//data;
// Wait for ready
//wait (wready );
//@(posedge clk);
//awvalid <= 0;
//wvalid <= 0;
// --------------------------
// READ TASK
task automatic axi_read(input [AW-1:0] addr, output [DW-1:0] data_out);
begin
@(posedge clk);
arvalid <= 1;
araddr <= addr;
//rready <= 0;
wait (arready);
@(posedge clk);
arvalid <= 0;
wait (rvalid);
@(posedge clk);
rready <= 1;
araddr <= 0 ;
@(posedge clk);
rready <= 0;
end
endtask
// --------------------------
// WRITE ONE TO CLEAR TASK
task automatic axi_w1c(input [AW-1:0] addr, input [DW-1:0] bits_to_clear);
begin
axi_write(addr, bits_to_clear);
end
endtask
always_ff @(posedge clk or negedge rst)
begin
if (!rst)
in_port_list_tb.c0_pmbus_rx_dbuf_rx_data <= 0 ;
else if (out_port_list_tb.rx_data_pop)
in_port_list_tb.c0_pmbus_rx_dbuf_rx_data <= 32'hDEADBEEF ;
end
// --------------------------
// TEST SEQUENCE
initial begin
clk <= 0;
rst <= 0;
awvalid <= 0;
wvalid <= 0;
arvalid <= 0;
rready <= 0;
awaddr <= 0;
wdata <= 0;
araddr <= 0;
hw_cmdlut_rd_addr <=0 ;
hw_cmdlut_rd_en <=0 ;
//----HW READ INPUTS --
//in_port_list_tb.hw_read_addr = 32'h0;
//in_port_list_tb.hw_read_en = 32'h0;
#20;
rst = 1;
repeat(2)@(posedge clk);
in_port_list_tb.c0_pmbus_sts0_stopf <= 1'h1;
in_port_list_tb.c0_pmbus_sts0_cmd_data_avlf <= 1'h1;
in_port_list_tb.c0_pmbus_sts0_rx_buf_of <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_tx_buf_lowf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_tx_buf_urf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_slv_busyf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_multif <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_cmd_valf <= 1'h1;
in_port_list_tb.c0_pmbus_sts0_data_avlf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_rpt_start_valf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_ext_cmd_valf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_rd_valf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_err_detf <= 1'b1;
in_port_list_tb.c0_pmbus_sts0_pg_detf <= 2'b1;
in_port_list_tb.c0_pmbus_sts0_rx_data_buf_fill_cntf <= 3'b11;
in_port_list_tb.c0_pmbus_sts0_tx_data_buf_fill_cntf <= 3'b111;
in_port_list_tb.c0_pmbus_sts0_cmdf <= 8'b11111111;
repeat(2)@(posedge clk);
in_port_list_tb.c0_pmbus_sts0_stopf <= 1'h0;
in_port_list_tb.c0_pmbus_sts0_cmd_data_avlf <= 1'h0;
in_port_list_tb.c0_pmbus_sts0_rx_buf_of <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_tx_buf_lowf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_tx_buf_urf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_slv_busyf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_multif <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_cmd_valf <= 1'h0;
in_port_list_tb.c0_pmbus_sts0_data_avlf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_rpt_start_valf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_ext_cmd_valf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_rd_valf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_err_detf <= 1'b0;
in_port_list_tb.c0_pmbus_sts0_pg_detf <= 2'b0;
in_port_list_tb.c0_pmbus_sts0_rx_data_buf_fill_cntf <= 3'b0;
in_port_list_tb.c0_pmbus_sts0_tx_data_buf_fill_cntf <= 3'b0;
in_port_list_tb.c0_pmbus_sts0_cmdf <= 8'b0;
repeat(5)@(posedge clk);
axi_write(32'h00000000, 32'hFFFFDEAD);
repeat(3)@(posedge clk);
// Read back
axi_read(32'h00000000, data_out);
$display("Read Data = 0x%08X", data_out);
repeat(3)@(posedge clk);
//@(posedge clk);
axi_write(32'h00000004, 32'hDEADFFFF);
repeat(3)@(posedge clk);
// Read back
axi_read(32'h00000004, data_out);
$display("Read Data = 0x%08X", data_out);
repeat(3)@(posedge clk);
// Normal write
axi_write(32'h00000008, 32'hFFFFFFFF);
repeat(3)@(posedge clk);
// Read back
axi_read(32'h00000008, data_out);
$display("Read Data = 0x%08X", data_out);
repeat(3)@(posedge clk);
axi_write(32'h00000012, 32'hABCDABCD);
repeat(3)@(posedge clk);
// Read back
axi_read(32'h00000012, data_out);
$display("Read Data = 0x%08X", data_out);
repeat(3)@(posedge clk);
repeat(5)@(posedge clk);
// W1C operation
axi_w1c(32'h00000040, 32'hFFFFFFFF);//STATUS REGISTER FAST
repeat(4)@(posedge clk);
axi_w1c(32'h00000048, 32'hFFFFFFFF);//STATUS REGISTER NORMAL
repeat(5)@(posedge clk);
axi_read(32'h00000040, data_out);//READING FAST STATUS INFORMATION AFTER WRITE
ONE TO CLEAR
repeat(4)@(posedge clk);
axi_read(32'h00000048, data_out);//READING NORMAL STATUS INFORMATION AFTER
WRITE ONE TO CLEAR
@(posedge clk);
axi_write(32'h00000080, 32'hABCDABCD);
repeat(3)@(posedge clk);
axi_read(32'h00000064, data_out);
@(posedge clk);
axi_write(32'h00000804, 32'hABCDABCD);
repeat(3)@(posedge clk);
axi_read(32'h000000804, data_out);
@(posedge clk);
axi_write(32'h00000C00, 32'hDEADBEEF);
repeat(3)@(posedge clk);
axi_read(32'h000000C00, data_out);
repeat(3)@(posedge clk);
hw_cmdlut_rd_addr <=32'h00000804 ;
hw_cmdlut_rd_en <= 1'b1 ;
@(posedge clk);
hw_cmdlut_rd_addr <=32'h0 ;
hw_cmdlut_rd_en <= 1'b0 ;
repeat(3)@(posedge clk);
hw_cmdlut_rd_addr <=32'h00000C00 ;
hw_cmdlut_rd_en <= 1'b1 ;
@(posedge clk);
hw_cmdlut_rd_addr <=32'h0 ;
hw_cmdlut_rd_en <= 1'b0 ;
#2000 $finish;
end
endmodule