0% found this document useful (0 votes)
100 views15 pages

Axi (Lite)

The document details the design and verification of an AXI Lite slave memory module, including the Verilog code for the module and the verification environment. It outlines the state machine for handling write and read operations, as well as the classes for transaction generation, driving, monitoring, and scoreboard functionalities. The testbench setup and initial conditions for simulation are also described.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
100 views15 pages

Axi (Lite)

The document details the design and verification of an AXI Lite slave memory module, including the Verilog code for the module and the verification environment. It outlines the state machine for handling write and read operations, as well as the classes for transaction generation, driving, monitoring, and scoreboard functionalities. The testbench setup and initial conditions for simulation are also described.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 15

VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

DESIGN CODE OF AXI LITE(SLAVE)

module axilite_s(
input wire s_axi_aclk,
input wire s_axi_aresetn,
input wire s_axi_awvalid,
output reg s_axi_awready,
input wire [31: 0] s_axi_awaddr,
input wire s_axi_wvalid,
output reg s_axi_wready,
input wire [31: 0] s_axi_wdata,
output reg s_axi_bvalid,
input wire s_axi_bready,
output reg [1: 0] s_axi_bresp,
input wire s_axi_arvalid,
output reg s_axi_arready,
input wire [31: 0] s_axi_araddr,
output reg s_axi_rvalid,
input wire s_axi_rready,
output reg [31: 0] s_axi_rdata,
output reg [1: 0] s_axi_rresp
);
localparam idle = 0,
send_waddr_ack = 1,
send_raddr_ack = 2,
send_wdata_ack = 3,
update_mem = 4,
send_wr_err = 5,
send_wr_resp = 6,
gen_data = 7,
send_rd_err = 8,
send_rdata = 9;
reg [3:0] state = idle;
reg [3:0] next_state = idle;

1|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

reg [1:0] count = 0;


reg [31:0] waddr, raddr, wdata, rdata;
reg [31:0] mem [128];
always@(posedge s_axi_aclk)
begin
if (s_axi_aresetn == 1'b0)
begin
state <= idle;
for(int i = 0; i < 128; i++)
begin
mem[i] <= 0;
end
s_axi_awready <= 0;
s_axi_wready <= 0;
s_axi_bvalid <= 0;
s_axi_bresp <= 0;
s_axi_arready <= 0;
s_axi_rvalid <= 0;
s_axi_rdata <= 0;
s_axi_rresp <= 0;
waddr <= 0;
raddr <= 0;
wdata <= 0;
rdata <= 0;
end
else
begin
case(state)
idle:
begin
s_axi_awready <= 0;
s_axi_wready <= 0;
s_axi_bvalid <= 0;
s_axi_bresp <= 0;

2|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

s_axi_arready <= 0;
s_axi_rvalid <= 0;
s_axi_rdata <= 0;
s_axi_rresp <= 0;
waddr <= 0;
raddr <= 0;
wdata <= 0;
rdata <= 0;
count <= 0;
s_axi_rvalid <= 1'b0;

if (s_axi_awvalid == 1'b1)
begin
state <= send_waddr_ack;
waddr <= s_axi_awaddr;
s_axi_awready <= 1'b1;
end
else if (s_axi_arvalid == 1'b1)
begin
state <= send_raddr_ack;
raddr <= s_axi_araddr;
s_axi_arready <= 1'b1;
end
else
begin
state <= idle;
end
end

send_waddr_ack :
begin
s_axi_awready <= 1'b0;
if(s_axi_wvalid)
begin

3|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

wdata <= s_axi_wdata;


s_axi_wready <= 1'b1;
state <= send_wdata_ack;
end
else
begin
state <= send_waddr_ack;
end
end
send_wdata_ack:
begin
s_axi_wready <= 1'b0;
if(waddr < 128)
begin
state <= update_mem;
mem[waddr] <= wdata;
end
else
begin
state <= send_wr_err;
s_axi_bresp <= 2'b11; //error response
s_axi_bvalid <= 1'b1;
end
end

update_mem:
begin
mem[waddr] <= wdata;
state <= send_wr_resp;
end
send_wr_resp:
begin
s_axi_bresp <= 2'b00;
s_axi_bvalid <= 1'b1;

4|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

if(s_axi_bready)
begin
state <= idle;
end
else
begin
state <= send_wr_resp;
end
end
send_wr_err: begin
if(s_axi_bready)
begin
state <= idle;
end
else
begin
state <= send_wr_err;
end
end
READ OPERATION
send_raddr_ack :
begin
s_axi_arready = 1'b0;
if(raddr < 128)
state <= gen_data;
else
begin
s_axi_rvalid <= 1'b1;
state <= send_rd_err;
s_axi_rdata <= 0;
s_axi_rresp <= 2'b11;
end
end

5|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

gen_data: begin
if(count < 2)
begin
rdata <= mem[raddr];
state <= gen_data;
count <= count + 1;
end
else
begin
s_axi_rvalid <= 1'b1;
s_axi_rdata <= rdata;
s_axi_rresp <= 2'b00;
if(s_axi_rready)
state <= idle;
else
state <= gen_data;
end
end
send_rd_err:
begin
if(s_axi_rready)
begin
state <= idle;
end
else
begin
state <= send_rd_err;
end
end

default: state <= idle;


endcase
end
end

6|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

endmodule
interface axi_if;
logic clk,resetn;
logic awvalid, awready;
logic arvalid, arready;
logic wvalid, wready;
logic bready, bvalid;
logic rvalid, rready;
logic [31:0] awaddr, araddr, wdata, rdata;
logic [1:0] wresp,rresp;
endinterface

VERIFIACTION CODE

class transaction;
randc bit op;
rand bit [31:0] awaddr;
rand bit [31:0] wdata;
rand bit [31:0] araddr;
bit [31:0] rdata;
bit [1:0] wresp;
bit [1:0] rresp;
constraint valid_addr_range {awaddr == 1; araddr == 1;}
constraint valid_data_range {wdata < 12; rdata < 12;}
endclass

class generator;
transaction tr;
mailbox #(transaction) mbxgd;
event done; ///gen completed sending requested no. of transaction
event sconext; ///scoreboard complete its work
int count = 0;
function new( mailbox #(transaction) mbxgd);

7|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

this.mbxgd = mbxgd;
tr =new();
endfunction
task run();
for(int i=0; i < count; i++)
begin
assert(tr.randomize) else $error("Randomization Failed");
$display("[GEN] : OP : %0b awaddr : %0d wdata : %0d araddr : %0d",tr.op,
tr.awaddr, tr.wdata, tr.araddr);
mbxgd.put(tr);
@(sconext);
end
->done;
endtask
endclass

class driver;
virtual axi_if vif;
transaction tr;
mailbox #(transaction) mbxgd;
mailbox #(transaction) mbxdm;
function new( mailbox #(transaction) mbxgd, mailbox #(transaction) mbxdm);
this.mbxgd = mbxgd;
this.mbxdm = mbxdm;
endfunction
RESETTING THE SYSTEM
task reset();
vif.resetn <= 1'b0;
vif.awvalid <= 1'b0;
vif.awaddr <= 0;
vif.wvalid <= 0;
vif.wdata <= 0;
vif.bready <= 0;
vif.arvalid <= 1'b0;

8|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

vif.araddr <= 0;
repeat(5) @(posedge vif.clk);
vif.resetn <= 1'b1;
$display("-----------------[DRV] : RESET DONE-----------------------------");
endtask
task write_data(input transaction tr);
$display("[DRV] : OP : %0b awaddr : %0d wdata : %0d ",tr.op, tr.awaddr,
tr.wdata);
mbxdm.put(tr);
vif.resetn <= 1'b1;
vif.awvalid <= 1'b1;
vif.arvalid <= 1'b0; ////disable read
vif.araddr <= 0;
vif.awaddr <= tr.awaddr;
@(negedge vif.awready);
vif.awvalid <= 1'b0;
vif.awaddr <= 0;
vif.wvalid <= 1'b1;
vif.wdata <= tr.wdata;
@(negedge vif.wready);
vif.wvalid <= 1'b0;
vif.wdata <= 0;
vif.bready <= 1'b1;
vif.rready <= 1'b0;
@(negedge vif.bvalid);
vif.bready <= 1'b0;
endtask
task read_data(input transaction tr);
$display("[DRV] : OP : %0b araddr : %0d ",tr.op, tr.araddr);
mbxdm.put(tr);
vif.resetn <= 1'b1;
vif.awvalid <= 1'b0;
vif.awaddr <= 0;
vif.wvalid <= 1'b0;

9|Page
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

vif.wdata <= 0;
vif.bready <= 1'b0;
vif.arvalid <= 1'b1;
vif.araddr <= tr.araddr;
@(negedge vif.arready);
vif.araddr <= 0;
vif.arvalid <= 1'b0;
vif.rready <= 1'b1;
@(negedge vif.rvalid);
vif.rready <= 1'b0;
endtask
task run();
forever
begin
mbxgd.get(tr);
@(posedge vif.clk);
write mode check and sig gen
if(tr.op == 1'b1)
write_data(tr);
else
read_data(tr);
end
endtask
endclass

class monitor;
virtual axi_if vif;
transaction tr,trd;
mailbox #(transaction) mbxms;
mailbox #(transaction) mbxdm;
function new( mailbox #(transaction) mbxms , mailbox #(transaction) mbxdm);
this.mbxms = mbxms;
this.mbxdm = mbxdm;
endfunction

10 | P a g e
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

task run();
tr = new();
forever
begin
@(posedge vif.clk);
mbxdm.get(trd);
if(trd.op == 1)
begin
tr.op = trd.op;
tr.awaddr = trd.awaddr;
tr.wdata = trd.wdata;
@(posedge vif.bvalid);
tr.wresp = vif.wresp;
@(negedge vif.bvalid);
$display("[MON] : OP : %0b awaddr : %0d wdata : %0d wresp:%0d",tr.op,
tr.awaddr, tr.wdata, tr.wresp);
mbxms.put(tr);
end
else
begin
tr.op = trd.op;
tr.araddr = trd.araddr;
@(posedge vif.rvalid);
tr.rdata = vif.rdata;
tr.rresp = vif.rresp;
@(negedge vif.rvalid);
$display("[MON] : OP : %0b araddr : %0d rdata : %0d rresp:%0d",tr.op,
tr.araddr, tr.rdata, tr.rresp);
mbxms.put(tr);
end

end
endtask
endclass

11 | P a g e
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

class scoreboard;
transaction tr,trd;
event sconext;
mailbox #(transaction) mbxms;
bit [31:0] temp;
bit [31:0] data[128] = '{default:0};
function new( mailbox #(transaction) mbxms);
this.mbxms = mbxms;
endfunction
task run();
forever
begin
mbxms.get(tr);
if(tr.op == 1)
begin
$display("[SCO] : OP : %0b awaddr : %0d wdata : %0d wresp :
%0d",tr.op, tr.awaddr, tr.wdata, tr.wresp);
if(tr.wresp == 3)
$display("[SCO] : DEC ERROR");
else begin
data[tr.awaddr] = tr.wdata;
$display("[SCO] : DATA STORED ADDR :%0d and DATA :%0d",
tr.awaddr, tr.wdata);
end
end
else
begin
$display("[SCO] : OP : %0b araddr : %0d rdata : %0d rresp : %0d",tr.op,
tr.araddr, tr.rdata, tr.rresp);
temp = data[tr.araddr];
if(tr.rresp == 3)
$display("[SCO] : DEC ERROR");
else if (tr.rresp == 0 && tr.rdata == temp)
$display("[SCO] : DATA MATCHED");
else

12 | P a g e
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

$display("[SCO] : DATA MISMATCHED");


end
$display("----------------------------------------------------");
->sconext;
end
endtask
endclass

module tb;
monitor mon;
generator gen;
driver drv;
scoreboard sco;
event nextgd;
event nextgm;
mailbox #(transaction) mbxgd, mbxms, mbxdm;
axi_if vif();
axilite_s dut (vif.clk, vif.resetn, vif.awvalid, vif.awready, vif.awaddr, vif.wvalid,
vif.wready, vif.wdata, vif.bvalid, vif.bready, vif.wresp , vif.arvalid, vif.arready,
vif.araddr, vif.rvalid, vif.rready, vif.rdata, vif.rresp);
initial begin
vif.clk <= 0;
end
always #5 vif.clk <= ~vif.clk;
initial begin
mbxgd = new();
mbxms = new();
mbxdm = new();
gen = new(mbxgd);
drv = new(mbxgd,mbxdm);
mon = new(mbxms,mbxdm);
sco = new(mbxms);
gen.count = 10;
drv.vif = vif;
mon.vif = vif;

13 | P a g e
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

gen.sconext = nextgm;
sco.sconext = nextgm;

end

initial begin
drv.reset();
fork
gen.run();
drv.run();
mon.run();
sco.run();
join_any
wait(gen.done.triggered);
$finish;
end

initial begin
$dumpfile("dump.vcd");
$dumpvars;
end

endmodule

14 | P a g e
VERIFICATION OF AXI MEMORY (AXI LITE - SLAVE)

RESULT :

WAVEFORM (EDA PLAYGROUND)

15 | P a g e

You might also like