| |
作为块级测试平台的一个例子,我们将考虑构建一个用于验证SPI Master DUT的测试平台。在这种例子里,UVM environment有两个agent - 一个用于处理其在APB slave端口上进行的总线传输,以及一个用于在其SPI端口上处理SPI协议传输的SPI agent。整个UVM验证环境的结构在框图中说明。我们将遍历测试平台的每一层,并描述它是如何从上到下组合在一起的。
【此处需一副图】
The Test Bench Module
顶层测试平台模块用于封装SPI Master DUT并将其连接到apb_if和spi_if SystemVerilog接口。还有一个initia块,它为APB接口产生一个时钟和一个复位信号。在测试平台的initial块中,使用uvm_config_db :: set将APB,SPI和INTR(中断)虚拟接口的句柄传入UVM顶层配置空间。然后调用run_test()方法 - 这会导致指定的test被构造并开始启动处理UVM phases。
module top_tb;
`include "timescale.v"
import uvm_pkg::*;
import spi_test_lib_pkg::*;
// PCLK and PRESETn
//
logic PCLK;
logic PRESETn;
//
// Instantiate the interfaces:
//
apb_if APB(PCLK, PRESETn); // APB interface
spi_if SPI(); // SPI Interface
intr_if INTR(); // Interrupt
// DUT
spi_top DUT(
// APB Interface:
.PCLK(PCLK),
.PRESETN(PRESETn),
.PSEL(APB.PSEL[0]),
.PADDR(APB.PADDR[4:0]),
.PWDATA(APB.PWDATA),
.PRDATA(APB.PRDATA),
.PENABLE(APB.PENABLE),
.PREADY(APB.PREADY),
.PSLVERR(),
.PWRITE(APB.PWRITE),
// Interrupt output
.IRQ(INTR.IRQ),
// SPI signals
.ss_pad_o(SPI.cs),
.sclk_pad_o(SPI.clk),
.mosi_pad_o(SPI.mosi),
.miso_pad_i(SPI.miso)
);
// UVM initial block:
// Virtual interface wrapping & run_test()
initial begin
uvm_config_db #(virtual apb_if)::set( null , "uvm_test_top" , "APB_vif" , APB);
uvm_config_db #(virtual spi_if)::set( null , "uvm_test_top" , "SPI_vif" , SPI);
uvm_config_db #(virtual intr_if)::set( null , "uvm_test_top" , "INTR_vif", INTR);
run_test();
end
//
// Clock and reset initial block:
//
initial begin
PCLK = 0;
PRESETn = 0;
repeat(8) begin
#10ns PCLK = ~PCLK;
end
PRESETn = 1;
forever begin
#10ns PCLK = ~PCLK;
end
end
endmodule: top_tb