| |
该测试平台示例采用两个块级验证环境,并说明如何在更高的集成级重用它们。示例中说明的原则适用于多次重复的垂直重用。
该示例采用SPI块级示例,并将其与GPIO DUT的另一个块级验证环境集成。这两个blocks的硬件已集成到外设子系统(PSS)中,该子系统使用AHB到APB总线桥接器与SPI和GPIO block上的APB接口连接。来自块级的环境由pss_env封装,pss_env还包括用于驱动外部的AHB总线接口的AHB agent。在此配置中,不再公开块级APB总线接口,因此APB agent被置于passive模式以监视APB 传输。激励需要驱动AHB接口,并且寄存器分层使得能够在集成级别重用块级激励。
【此处需一幅图】
我们现在将从顶层向下完成测试平台和构建过程,从顶层测试module开始。
Top Level Test Bench Module
与块级测试平台示例一样,顶层测试平台模块用于封装DUT,且将接口连接到DUT信号引脚,然后在调用run_test()之前将虚拟接口容器设置在配置空间中。此代码与块级测试平台代码之间的主要区别在于有了更多接口,还需要绑定到某些内部信号以监控APB总线。DUT由一个模块包含着,该模块将其I / O信号连接到UVM测试平台中使用的接口。使用binder模块将内部信号绑定到APB接口:
module top_tb;
import uvm_pkg::*;
import pss_test_lib_pkg::*;
// PCLK and PRESETn
//
logic HCLK;
logic HRESETn;
//
// Instantiate the interfaces:
//
apb_if APB(HCLK, HRESETn); // APB interface - shared between passive agents
ahb_if AHB(HCLK, HRESETn); // AHB interface
spi_if SPI(); // SPI Interface
intr_if INTR(); // Interrupt
gpio_if GPO();
gpio_if GPI();
gpio_if GPOE();
icpit_if ICPIT();
serial_if UART_RX();
serial_if UART_TX();
modem_if MODEM();
// Binder
binder probe();
// DUT Wrapper:
pss_wrapper wrapper(.ahb(AHB),
.spi(SPI),
.gpi(GPI),
.gpo(GPO),
.gpoe(GPOE),
.icpit(ICPIT),
.uart_rx(UART_RX),
.uart_tx(UART_TX),
.modem(MODEM));
// 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 ahb_if)::set( null , "uvm_test_top" , "AHB_vif" , AHB);
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);
uvm_config_db #(virtual gpio_if)::set( null , "uvm_test_top" , "GPO_vif" , GPO);
uvm_config_db #(virtual gpio_if)::set( null , "uvm_test_top" , "GPOE_vif" , GPOE);
uvm_config_db #(virtual gpio_if)::set( null , "uvm_test_top" , "GPI_vif" , GPI);
uvm_config_db #(virtual icpit_if)::set( null , "uvm_test_top" , "ICPIT_vif" , ICPIT);
uvm_config_db #(virtual serial_if)::set( null , "uvm_test_top" , "UART_RX_vif" , UART_RX);
uvm_config_db #(virtual serial_if)::set( null , "uvm_test_top" , "UART_TX_vif" , UART_TX);
uvm_config_db #(virtual modem_if)::set( null , "uvm_test_top" , "MODEM_vif" , MODEM);
run_test();
end
//
// Clock and reset initial block:
//
initial begin
HCLK = 0;
HRESETn = 0;
repeat(8) begin
#10ns HCLK = ~HCLK;
end
HRESETn = 1;
forever begin
#10ns HCLK = ~HCLK;
end
end
// Clock assignments:
assign GPO.clk = HCLK;
assign GPOE.clk = HCLK;
assign GPI.clk = HCLK;
assign ICPIT.PCLK = HCLK;
endmodule: top_tb