|
|
@@ -0,0 +1,126 @@ |
|
|
|
//=============================AXI TRANSACTION CLASSS ==========================================//
|
|
|
|
class axi_seq_item extends uvm_sequence_item;
|
|
|
|
|
|
|
|
//FACTORY REGISTRATION
|
|
|
|
|
|
|
|
'uvm_object_utils(axi_seq_item);
|
|
|
|
|
|
|
|
//WRITE ADDRESS CHANNEL
|
|
|
|
rand logic [31:0] AWADDR;
|
|
|
|
rand logic [3:0] AWLEN;
|
|
|
|
rand logic [2:0] AWSIZE;
|
|
|
|
rand logic [1:0] AWBURST;
|
|
|
|
bit AWVALID;
|
|
|
|
bit AWREADY;
|
|
|
|
bit [1:0] AWLOCK;
|
|
|
|
rand logic [2:0] AWPROT;
|
|
|
|
rand logic [3:0] AWCACHE;
|
|
|
|
rand bit [3:0] AWID;
|
|
|
|
|
|
|
|
//WRITE DATA CHANNEL
|
|
|
|
rand bit [3:0] WID;
|
|
|
|
bit [2:0] WSTRB;
|
|
|
|
rand logic [7:0] WDATA;
|
|
|
|
bit WVALID;
|
|
|
|
bit WREADY;
|
|
|
|
bit WLAST;
|
|
|
|
//WRITE RESPONSE CHANNEL
|
|
|
|
bit [1:0] BRESP;
|
|
|
|
bit BVALID;
|
|
|
|
bit BREADY;
|
|
|
|
|
|
|
|
//READ ADDRESS CHANNEL
|
|
|
|
rand bit [3:0] ARID;
|
|
|
|
rand logic [31:0] ARADDR;
|
|
|
|
rand logic [2:0] ARSIZE;
|
|
|
|
rand logic [1:0] ARBURST;
|
|
|
|
rand logic [3:0] ARLEN;
|
|
|
|
rand logic [2:0] ARPROT;
|
|
|
|
rand logic [3:0] ARCACHE;
|
|
|
|
rand logic [1:0] AELOCK;
|
|
|
|
bit ARVALID;
|
|
|
|
bit ARREADY;
|
|
|
|
|
|
|
|
//READ DATA CHANNEL
|
|
|
|
bit [3:0] RID;
|
|
|
|
logic [7:0] RDATA;
|
|
|
|
bit [1:0] RRESP;
|
|
|
|
bit RVALID;
|
|
|
|
bit RREADY;
|
|
|
|
bit [3:0] RSTRB;
|
|
|
|
bit RLAST;
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================4kb boundary=====================================//
|
|
|
|
constraint awaddr_4k{ AWADDR % 4096 + (AWLEN + (1 << AWSIZE) <= 4096;}
|
|
|
|
constraint araddr_4k{ ARADDR % 4096 + (ARLEN + (1 << ARSIZE) <= 4096;}
|
|
|
|
|
|
|
|
//==============================================id must be same for bot read/write operation =====================================//
|
|
|
|
constraint ali_w_addr{ AWID==ARID;}
|
|
|
|
constraint ali_r_addr{WID==RID;}
|
|
|
|
|
|
|
|
//==============================================burst type always not reserved=====================================//
|
|
|
|
constraint burst_type{ AWBURST!=2'b11; ARBURST!=2'b11;}
|
|
|
|
|
|
|
|
constraint wr_data_size{if(AWBURST==2'b01)
|
|
|
|
(WDATA inside{[1:((2**AWSIZE)*16)]});}
|
|
|
|
constraint rd_data_size{if(ARBURST==2'b01)
|
|
|
|
(RDATA inside{[1:((2**ARSIZE)*16)]});}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constraint wrap_data{ if(AWBURST==2'b10)
|
|
|
|
WDATA inside {((2**AWSIZE)*2),((2**AWSIZE)*4),((2**AWSIZE)*8),((2**AWSIZE)*16)};}
|
|
|
|
|
|
|
|
|
|
|
|
endclass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=============================AXI SEQUENCE CLASSS ==========================================//
|
|
|
|
class axi_wrap_sequence extends uvm_sequence #(axi_seq_item);
|
|
|
|
|
|
|
|
`uvm_object_utills(axi_wrap_sequence)
|
|
|
|
axi_wrap_sequence wrap_xtn;
|
|
|
|
|
|
|
|
function new(string name ="axi_wrap_sequene")
|
|
|
|
super.new(name);
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
task body();
|
|
|
|
repeat(10)
|
|
|
|
begin
|
|
|
|
wrap_xtn=axi_seq_item::type_id::create("wrap_xtn");
|
|
|
|
start_item(wrap_xtn);
|
|
|
|
assert(wrap_xtn.randomize() with {AWBURST==2;});
|
|
|
|
finish_item(wrap_xtn);
|
|
|
|
end
|
|
|
|
endtask
|
|
|
|
endclass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=============================AXI SEQUENCE CLASSS ==========================================//
|
|
|
|
class axi_wrap_read_seq extends uvm_sequence #(axi_seq_item);
|
|
|
|
|
|
|
|
`uvm_object_utills(axi_wrap_read_seq)
|
|
|
|
axi_wrap_sequence rwrap_xtn;
|
|
|
|
|
|
|
|
function new(string name ="axi_wrap_read_seq")
|
|
|
|
super.new(name);
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
task body();
|
|
|
|
repeat(10)
|
|
|
|
begin
|
|
|
|
rwrap_xtn=axi_seq_item::type_id::create("rwrap_xtn");
|
|
|
|
start_item(rwrap_xtn);
|
|
|
|
assert(rwrap_xtn.randomize() with {ARBURST==2;});
|
|
|
|
finish_item(rwrap_xtn);
|
|
|
|
end
|
|
|
|
endtask
|
|
|
|
endclass
|
|
|
|
|
|
|
|
|