| |
BusFunctionalModels
Bus Functional Models for DUT communication
有时,DUT连接不是直接连接到DUT的端口,而是通过BFM间接进行。如下图所示,通常BFM将具有生成DUT transactions的tasks。
【此处需一幅图】
BFM有几种不同的“版本”:
Verilog Module BFM - Can be modified
如果BFM是Verilog模块,则此类连接的首选是将BFM修改为interface。然后可以与BFM建立标准虚拟接口连接,并且测试平台transactors可以直接访问BFM trasaction tasks。
Verilog Module BFM - Can not be modified
Verilog BFM可能由于多种原因而无法修改。它可能有一个模块实例,在这种情况下它不能更改为interface。或者它根本无法编辑。在这种情况下,引入了包装模块。包装器模块包含BFM实例,DUT和接口实例,如下图所示。
【此处需一幅图】
该接口充当BFM到testbench事务处理器的“代理”(即此接口处于TB和BFM的中间环节)。例如,为了执行wishbone总线写入事务,驱动程序将调用接口中的write task,该接口又将调用BFM中的write task。 请参见下图。
【此处需一幅图】
包装器模块的示例代码如下:
module wb_bus_wrapper #(int WB_ID = 0);
...
// WISHBONE BFM instance
wishbone_bus_syscon_bfm wb_bfm();
// WISHBONE 0, slave 0: 000000 - 0fffff
wb_slave_mem #(mem_slave_size) wb_s_0 (...);
// MAC 0
eth_top mac_0(...);
// Interface
interface wishbone_bus_bfm_if #(int ID = WB_ID)
(input bit clk);
// Methods
//WRITE 1 or more write cycles
task wb_write_cycle(wb_txn req_txn, bit [2:0] m_id);
wb_bfm.wb_write_cycle(req_txn, m_id);
endtask
// other tasks not shown
...
endinterface
// Interface instance
wishbone_bus_bfm_if #(WB_ID) wb_bus_bfm_if(.clk(wb_bfm.clk));
initial
//set interface in config space
uvm_config_db #(virtual wishbone_bus_bfm_if)::set(null, "uvm_test_top",
$sformatf("WB_BFM_IF_%0d",WB_ID), wb_bus_bfm_if);
endmodule
(在http://verificationacademy.com/uvm-ovm上在线下载源代码示例)。