Professional Documents
Culture Documents
Apb Uvm TB
Apb Uvm TB
Date:24/07/2023
@shraddha_pawankar
DESIGN.SV
module apb_ram (
input presetn,
input pclk,
input psel,
input penable,
input pwrite,
input [31:0] paddr, pwdata,
output reg [31:0] prdata,
output reg pready, pslverr
);
mem[i] <= 0;
end
end
else
begin
case(state)
idle :
begin
begin
if(paddr < 32)
begin
mem[paddr] <= pwdata;
state <= transfer;
pslverr <= 1'b0;
@shraddha_pawankar
Date:24/07/2023
begin
state <= transfer;
pready <= 1'b1;
pslverr <= 1'b1;
end
end
else if (!pwrite && penable)
begin
if(paddr < 32)
begin
else
begin
state <= transfer;
pready <= 1'b1;
pslverr <= 1'b1;
transfer: begin
state <= setup;
pready <= 1'b0;
end
endmodule
///////////////////////////////////////////////////////////////////////////////////////////////
apb_intf.sv
interface apb_if ();
// Signals
logic pclk;
logic presetn;
logic [31:0] paddr;
logic pwrite;
logic pready;
endinterface
///////////////////////////////////////////////////////////////////////////////////////////
apb_seq_item.sv
typedef enum bit [1:0] {readd = 0, writed = 1, rst = 2} oper_mode;
class apb_seq_item extends uvm_sequence_item;
@shraddha_pawankar
Date:24/07/2023
`uvm_object_utils(apb_seq_item)
endfunction
endclass
//////////////////////////////////////////////////////////////////////////////////////////////
apb_seq.sv
class write_data extends uvm_sequence#(apb_seq_item);
`uvm_object_utils(write_data)
apb_seq_item tx;
function new(string name ="write_data");
super.new(name);
endfunction
start_item(tx);
tx.randomize();
tx.op = writed;
finish_item(tx);
end
endtask
endclass
///////////////////////////////////////////////////////////////////
class read_data extends uvm_sequence#(apb_seq_item);
`uvm_object_utils(read_data)
apb_seq_item tx;
function new(string name ="read_data");
super.new(name);
endfunction
tx = apb_seq_item::type_id::create("tx");
start_item(tx);
tx.randomize();
tx.op = readd;
@shraddha_pawankar
Date:24/07/2023
finish_item(tx);
end
endtask
endclass
////////////////////////////////////////////////////////////////////
class write_read extends uvm_sequence#(apb_seq_item); //////read after write
`uvm_object_utils(write_read)
apb_seq_item tx;
function new(string name = "write_read");
super.new(name);
endfunction
start_item(tx);
tx.randomize;
tx.op = writed;
finish_item(tx);
start_item(tx);
tx.randomize();
tx.op = readd;
finish_item(tx);
end
@shraddha_pawankar
Date:24/07/2023
endtask
endclass
////////////////////////////////////////////////////////////////////////////////////
apb_sqr.sv
class apb_sqr extends uvm_sequencer#(apb_seq_item);
`uvm_component_utils(apb_sqr)
apb_drv.sv
class apb_drv extends uvm_driver #(apb_seq_item);
`uvm_component_utils(apb_drv)
uvm_config_db#(virtual apb_if)::get(this,"","intf",vif);
@shraddha_pawankar
Date:24/07/2023
endfunction
begin
vif.presetn <= 1'b0;
vif.paddr <= 'h0;
vif.pwdata <= 'h0;
vif.pwrite <= 'b0;
end
begin
vif.psel <= 1'b1;
vif.paddr <= tx.PADDR;
vif.presetn <= 1'b1;
vif.pwrite <= 1'b0;
@(posedge vif.pclk);
vif.penable <= 1'b1;
@(negedge vif.pready);
vif.penable <= 1'b0;
end
seq_item_port.item_done();
end
endtask
endclass
///////////////////////////////////////////////////////////////////////////////////////////////
apb_mon.sv
class apb_mon extends uvm_monitor;
`uvm_component_utils(apb_mon)
uvm_analysis_port#(apb_seq_item) mon_ap;
apb_seq_item tx;
endfunction
mon_ap=new("mon_ap",this);
if(!uvm_config_db#(virtual apb_if)::get(this,"","intf",vif))
`uvm_error("MON","Unable to access Interface");
endfunction
if(!vif.presetn)
begin
tx.op = rst;
mon_ap.write(tx);
end
tx.PADDR = vif.paddr;
tx.PSLVERR = vif.pslverr;
mon_ap.write(tx);
end
tx.op = readd;
tx.PADDR = vif.paddr;
tx.PRDATA = vif.prdata;
tx.PSLVERR = vif.pslverr;
mon_ap.write(tx);
end
end
endtask
endclass
///////////////////////////////////////////////////////////////////////////////////////
apb_agent.sv
class apb_agent extends uvm_agent;
`uvm_component_utils(apb_agent)
apb_sqr sqr;
apb_drv drv;
@shraddha_pawankar
Date:24/07/2023
apb_mon mon;
super.build_phase(phase);
sqr=apb_sqr::type_id::create("sqr",this);
drv=apb_drv::type_id::create("drv",this);
mon=apb_mon::type_id::create("mon",this);
endfunction
endclass
///////////////////////////////////////////////////////////////////////////////////////////////
apb_scb.sv
class apb_scb extends uvm_scoreboard;
`uvm_component_utils(apb_scb)
uvm_analysis_imp#(apb_seq_item,apb_scb) scb_ip;
endfunction
if(tx.op == rst)
begin
`uvm_info("SCB", "SYSTEM RESET DETECTED", UVM_NONE);
end
////////////////////////////////////
end
else
begin
array[tx.PADDR] = tx.PWDATA;
`uvm_info("SCB", $sformatf("DATA WRITE OP addr:%0d, wdata:%0d
arr_wr:%0d",tx.PADDR,tx.PWDATA, array[tx.PADDR]), UVM_NONE);
end
end
/////////////////////////////////////////////////////////
begin
if(tx.PSLVERR == 1'b1)
begin
if (data_rd == tx.PRDATA)
`uvm_info("SCO", $sformatf("DATA MATCHED : addr:%0d,
rdata:%0d",tx.PADDR,tx.PRDATA), UVM_NONE)
else
`uvm_info("SCB",$sformatf("TEST FAILED : addr:%0d, rdata:%0d
data_rd_arr:%0d",tx.PADDR,tx.PRDATA,data_rd), UVM_NONE)
end
end
endfunction
endclass
//////////////////////////////////////////////////
apb_env.sv
class apb_env extends uvm_env;
`uvm_component_utils(apb_env)
apb_agent agent;
apb_scb scb;
@shraddha_pawankar
Date:24/07/2023
agent = apb_agent::type_id::create("agent",this);
scb = apb_scb::type_id::create("scb",this);
endfunction
super.connect_phase(phase);
agent.mon.mon_ap.connect(scb.scb_ip);
endfunction
endclass
////////////////////////////////////////////////////////////////////
apb_test.sv
class apb_test extends uvm_test;
`uvm_component_utils(apb_test)
apb_env env;
write_data seq1;
read_data seq2;
write_read seq3;
env = apb_env::type_id::create("env",this);
seq1 = write_data::type_id::create("seq1");
seq2 = read_data::type_id::create("seq2");
seq3 = write_read::type_id::create("seq3");
endfunction
`uvm_info("TEST",sprint(),UVM_LOW)
endfunction
seq1.start(env.agent.sqr);
seq2.start(env.agent.sqr);
seq3.start(env.agent.sqr);
#20
phase.drop_objection(this);
endtask
endclass
////////////////////////////////////////////////////////////////////////////////////////
testbench.sv
`include "uvm_macros.svh"
import uvm_pkg::*;
`include "apb_intf.sv"
`include "apb_seq_item.sv"
`include "apb_seq.sv"
`include "apb_sqr.sv"
`include "apb_drv.sv"
@shraddha_pawankar
Date:24/07/2023
`include "apb_mon.sv"
`include "apb_agent.sv"
`include "apb_scb.sv"
`include "apb_env.sv"
`include "apb_test.sv"
module tb;
apb_if pif();
.pwrite(pif.pwrite),
.paddr(pif.paddr),
.pwdata(pif.pwdata),
.prdata(pif.prdata),
.pready(pif.pready),
.pslverr(pif.pslverr));
initial begin
pif.pclk <= 0;
end
initial begin
uvm_config_db#(virtual apb_if)::set(null, "*", "intf", pif);
run_test("apb_test");
@shraddha_pawankar
Date:24/07/2023
end
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule
OUTPUT:
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 10: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:29, wdata:3518879974 arr_wr:3518879974
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 70: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:19, wdata:1223309303 arr_wr:1223309303
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 130: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:0, wdata:927135257 arr_wr:927135257
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 190: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:4, wdata:2630357836 arr_wr:2630357836
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 250: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:30, wdata:2038009744 arr_wr:2038009744
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 310: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:14, wdata:3445058277 arr_wr:3445058277
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 370: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:21, wdata:2556536139 arr_wr:2556536139
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 430: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:19, wdata:3667410626 arr_wr:3667410626
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 490: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:7, wdata:2482714442 arr_wr:2482714442
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 550: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:17, wdata:3297414883 arr_wr:3297414883
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 610: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:18, wdata:1816544653 arr_wr:1816544653
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 670: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:10, wdata:2335071048 arr_wr:2335071048
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 730: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:24, wdata:558026772 arr_wr:558026772
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 790: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:28, wdata:780379121 arr_wr:780379121
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 850: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:23, wdata:3002128095 arr_wr:3002128095
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 910: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:12, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 970: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:2, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1030: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:15, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1090: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:19, rdata:3667410626
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1150: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:13, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1210: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:29, rdata:x data_rd_arr:3518879974
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1270: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:4, rdata:2630357836
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1330: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:2, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1390: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:22, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1450: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:0, rdata:927135257
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1510: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:1, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1570: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:25, rdata:x data_rd_arr:0
@shraddha_pawankar
Date:24/07/2023
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1630: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:7, rdata:2482714442
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1690: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:11, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 1750: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:6, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 1810: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:29, wdata:527641457 arr_wr:527641457
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1870: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:19, rdata:3667410626
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 1930: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:0, wdata:2230864036 arr_wr:2230864036
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 1990: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:4, rdata:2630357836
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2050: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:30, wdata:3341738523 arr_wr:3341738523
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 2110: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:14, rdata:3445058277
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2170: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:21, wdata:3860264918 arr_wr:3860264918
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 2230: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:19, rdata:3667410626
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2290: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:7, wdata:3786443221 arr_wr:3786443221
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 2350: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:17, rdata:3297414883
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2410: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:18, wdata:3120273432 arr_wr:3120273432
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 2470: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:10, rdata:2335071048
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2530: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:24, wdata:1861755551 arr_wr:1861755551
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 2590: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:28, rdata:780379121
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2650: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:23, wdata:10889578 arr_wr:10889578
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 2710: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:9, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2770: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:17, wdata:1862642809 arr_wr:1862642809
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 2830: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:15, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 2890: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:4, wdata:3122047948 arr_wr:3122047948
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 2950: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:16, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 3010: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:18, wdata:3789104995 arr_wr:3789104995
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 3070: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:10, rdata:2335071048
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 3130: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:25, wdata:3863813950 arr_wr:3863813950
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 3190: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:31, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 3250: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:27, wdata:3346174813 arr_wr:3346174813
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(54) @ 3310: uvm_test_top.env.scb [SCB]
TEST FAILED : addr:13, rdata:x data_rd_arr:0
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 3370: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:22, wdata:2236187584 arr_wr:2236187584
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 3430: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:22, rdata:2236187584
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(36) @ 3490: uvm_test_top.env.scb [SCB]
DATA WRITE OP addr:12, wdata:533852263 arr_wr:533852263
# KERNEL: UVM_INFO /home/runner/apb_scb.sv(52) @ 3550: uvm_test_top.env.scb [SCO]
DATA MATCHED : addr:24, rdata:1861755551
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_objection.svh(1271)
@ 3570: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-
1.2/src/base/uvm_report_server.svh(869) @ 3570: reporter [UVM/REPORT/SERVER]
# KERNEL: --- UVM Report Summary ---
@shraddha_pawankar
Date:24/07/2023
# KERNEL:
# KERNEL: ** Report counts by severity
# KERNEL: UVM_INFO : 64
# KERNEL: UVM_WARNING : 0
# KERNEL: UVM_ERROR : 0
# KERNEL: UVM_FATAL : 0
https://www.edaplayground.com/x/dMch