|
|
|
@@ -0,0 +1,204 @@ |
|
|
|
interface axi_slave_if (input bit clk, resetn);
|
|
|
|
|
|
|
|
///////////////////write address channel
|
|
|
|
input logic awvalid; /// master is sending new address
|
|
|
|
output logic awready; /// slave is ready to accept request
|
|
|
|
input logic [3:0] awid; ////// unique ID for each transaction
|
|
|
|
input logic [3:0] awlen; ////// burst length AXI3 : 1 to 16, AXI4 : 1 to 256
|
|
|
|
input logic [2:0] awsize; ////unique transaction size : 1,2,4,8,16 ...128 bytes
|
|
|
|
input logic [31:0] awaddr; ////write adress of transaction
|
|
|
|
input logic [1:0] awburst; ////burst type : fixed , INCR , WRAP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////write data channel
|
|
|
|
input logic wvalid; //// master is sending new data
|
|
|
|
output logic wready; //// slave is ready to accept new data
|
|
|
|
input logic [3:0] wid; /// unique id for transaction
|
|
|
|
input logic [31:0] wdata; //// data
|
|
|
|
input logic [3:0] wstrb; //// lane having valid data
|
|
|
|
input logic wlast, //// last transfer in write burst
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////write response channel
|
|
|
|
input logic bready; ///master is ready to accept response
|
|
|
|
output logic bvalid; //// slave has valid response
|
|
|
|
output logic [3:0] bid; ////unique id for transaction
|
|
|
|
output logic [1:0] bresp; /// status of write transaction
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////// read address channel
|
|
|
|
output logic reg arready; //read address ready signal from slave
|
|
|
|
input logic [3:0] arid; //read address id
|
|
|
|
input logic [31:0] araddr; //read address signal
|
|
|
|
input logic [3:0] arlen; //length of the burst
|
|
|
|
input logic [2:0] arsize; //number of bytes in a transfer
|
|
|
|
input logic [1:0] arburst;//burst type - fixed, incremental, wrapping
|
|
|
|
input logic arvalid; //address read valid signal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////read data channel
|
|
|
|
output logic [3:0] rid; //read data id
|
|
|
|
output logic [31:0]rdata; //read data from slave
|
|
|
|
output logic [1:0] rresp; //read response signal
|
|
|
|
output logic rlast; //read data last signal
|
|
|
|
output logic rvalid; //read data valid signal
|
|
|
|
input logic rready
|
|
|
|
|
|
|
|
|
|
|
|
//========================== ASSERTIONS========================
|
|
|
|
|
|
|
|
// WRITE ADDRESS CHANNEL************************************************************************************************************
|
|
|
|
|
|
|
|
//1st.(When awvalid is asserted then it remains asserted until awready is HIGH)
|
|
|
|
property AXI_AWVALID_AWREADY;
|
|
|
|
@(posedge clk) awvalid |-> (awvalid throughout (awready[->1]));
|
|
|
|
endproperty
|
|
|
|
|
|
|
|
A1:assert property (AXI_AWVALID_AWREADY);
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_AWVALID_AWREADY");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//2nd.(BURST can not cross a 4KB Boundary)
|
|
|
|
property w_burst_boundary;
|
|
|
|
@(posedge clk) (awvalid && awready) |-> (((2**awsize)*(awlen+1)) < 4096) ;
|
|
|
|
endproperty
|
|
|
|
A2:assert property (w_burst_boundary)
|
|
|
|
else `uvm_error("ASSERTION","Failure w_burst_boundary");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//3rd.(all write address channel remains stable after AWVALID is asserted)
|
|
|
|
property AXI_AWVALID_STABLE;
|
|
|
|
@(posedge clk) $rose(awvalid)|->($stable(awid)&& $stable(awaddr)
|
|
|
|
&&$stable(awlen)&& $stable(awsize)
|
|
|
|
&&$stable(awburst))throughout awready[->1];
|
|
|
|
endproperty
|
|
|
|
A3:assert property (AXI_AWVALID_STABLE)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_AWVALID_STABLE");
|
|
|
|
|
|
|
|
|
|
|
|
//4th.(AWLEN value is 1,3,7,15 for Wrapping type Burst)
|
|
|
|
property AWLEN_WRAP_BURST;
|
|
|
|
@(posedge clk) disable iff(!resetn) (awburst==2'b10) |->(awlen==1|awlen==3||awlen==7||awlen==15);
|
|
|
|
endproperty
|
|
|
|
A4:assert property (AWLEN_WRAP_BURST)
|
|
|
|
else `uvm_error("ASSERTION","Failure AWLEN_WRAP_BURST");
|
|
|
|
|
|
|
|
//5th.(AWBURST val cant be 2'b11)
|
|
|
|
property AWBURST_CANT_2b11;
|
|
|
|
@(posedge clk) (awvalid && awready) |-> (awburst != 2'b11);
|
|
|
|
endproperty
|
|
|
|
|
|
|
|
A5:assert property (AWBURST_CANT_2b11)
|
|
|
|
else `uvm_error("ASSERTION","Failure AWBURST_CANT_2b11");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//WRITE DATA CHANNEL**************************************************************************************************************
|
|
|
|
//1st.
|
|
|
|
property AXI_WVALID_WREADY;
|
|
|
|
@(posedge clk) wvalid |-> (wvalid throughout (wready[->1])) ;
|
|
|
|
endproperty
|
|
|
|
|
|
|
|
A6: assert property (AXI_WVALID_WREADY)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_WVALID_WREADY");
|
|
|
|
|
|
|
|
|
|
|
|
//2nd. Property to check whether all write address channel remains stable after WVALID is asserted
|
|
|
|
property AXI_WVALID_WREADY;
|
|
|
|
@(posedge clk) $rose(wvalid) |-> ( $stable(wid)
|
|
|
|
&& $stable(wdata)
|
|
|
|
&& $stable(wstrb)
|
|
|
|
&& $stable(wlast)) throughout wready[->1];
|
|
|
|
endproperty
|
|
|
|
A7:assert property (AXI_WVALID_STABLE)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_WVALID_STABLE");
|
|
|
|
|
|
|
|
|
|
|
|
//WRITE RESPONSE CHANNEL****************************************************************************************************************
|
|
|
|
//1st.
|
|
|
|
property AXI_BVALID_BREADY;
|
|
|
|
@(posedge clk) bvalid|-> (bvalid throughout (bready[->1])) ;
|
|
|
|
endproperty
|
|
|
|
A8:assert property (AXI_BVALID_BREADY)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_BVALID_BREADY");
|
|
|
|
|
|
|
|
|
|
|
|
//2nd.to check whether all write address channel remains stable after BVALID is asserted
|
|
|
|
property AXI_BVALID_STABLE;
|
|
|
|
@(posedge clk) $rose(bvalid)|->($stable(bid)&& $stable(bresp))throughout bready[->1];
|
|
|
|
endproperty
|
|
|
|
A9:assert property (AXI_BVALID_STABLE)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_BVALID_STABLE");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//READ ADDRESS CHANNEL***********************************************************************************************
|
|
|
|
//1st.
|
|
|
|
property AXI_ARVALID_ARREADY;
|
|
|
|
@(posedge clk) arvalid |-> (arvalid throughout (arready[->1])) ;
|
|
|
|
endproperty
|
|
|
|
B1:assert property AXI_ARVALID_ARREADY;
|
|
|
|
else`uvm_error("ASSERTION","Failure AXI_ARVALID_ARREADY");
|
|
|
|
|
|
|
|
|
|
|
|
//2nd.(BURST can not cross a 4KB Boundary)
|
|
|
|
property r_burst_boubadary;
|
|
|
|
@(posedge clk) (arvalid && arready) |-> (((2**arsize)*(arlen+1)) < 4096);
|
|
|
|
endproperty
|
|
|
|
B2:assert property (r_burst_boubadary)
|
|
|
|
else `uvm_error("ASSERTION","Failure r_burst_boubadary");
|
|
|
|
|
|
|
|
|
|
|
|
//3rd.(ARLEN value is 1,3,7,15 for Wrapping type Burst)
|
|
|
|
property ARLEN_WRAP_BURST;
|
|
|
|
@(posedge clk) disable iff (!resetn) (arburst==2'b10) |-> (arlen==1 || arlen==3 || arlen==7 || arlen==15);
|
|
|
|
endproperty
|
|
|
|
B3:assert property (ARLEN_WRAP_BURST)
|
|
|
|
else `uvm_error("ASSERTION","Failure ARLEN_WRAP_BURST");
|
|
|
|
|
|
|
|
//4th.(arburst val cant be 2'b11)
|
|
|
|
property ARBURST_CANT_2b11; //
|
|
|
|
@(posedge clk) (arvalid && arready) |-> (arburst != 2'b11);
|
|
|
|
endproperty
|
|
|
|
B4:assert property (ARBURST_CANT_2b11)
|
|
|
|
else `uvm_error("ASSERTION","Failure ARBURST_CANT_2b11");
|
|
|
|
|
|
|
|
|
|
|
|
//5th. Property to check whether all write address channel remains stable after ARVALID is asserted
|
|
|
|
property AXI_ARVALID_STABLE;
|
|
|
|
@(posedge clk) $rose(arvalid) |-> ( $stable(arid)
|
|
|
|
&&$stable(araddr)
|
|
|
|
&&$stable(arlen)
|
|
|
|
&&$stable(arsize)
|
|
|
|
&&$stable(arburst)) throughout arready[->1];
|
|
|
|
endproperty
|
|
|
|
B5:assert property (AXI_ARVALID_STABLE)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_ARVALID_STABLE");
|
|
|
|
|
|
|
|
|
|
|
|
//READ DATA CHANNEL***********************************************************************************************************
|
|
|
|
/1st.
|
|
|
|
property AXI_RVALID_RREADY;
|
|
|
|
@(posedge clk) rvalid |-> (rvalid throughout (rready[->1]));
|
|
|
|
endproperty
|
|
|
|
B6:assert property (AXI_RVALID_RREADY)
|
|
|
|
else `uvm_error("ASSERTION","Failure AXI_RVALID_RREADY");
|
|
|
|
|
|
|
|
//2nd.to check whether all write address channel remains stable after RVALID is asserted
|
|
|
|
property AXI_RVALID_STABLE;
|
|
|
|
@(posedge clk) $rose(rvalid) |-> ( $stable(rid)
|
|
|
|
&& $stable(rdata)
|
|
|
|
&& $stable(rresp)
|
|
|
|
&& $stable(rlast)) throughout rready[->1];
|
|
|
|
endproperty
|
|
|
|
B7:assert property (AXI_RVALID_STABLE)
|
|
|
|
else`uvm_error("ASSERTION","Failure AXI_RVALID_STABLE");
|
|
|
|
|
|
|
|
endinterface
|