interface(接口)在验证平台中的使用
参考:
uvm实战
绿皮书
interface在SV中的使用
使用文件:
interface.sv //用来定义接口的文件,里面声明了接口信号或clocking等信息
test.sv //是用来产生激励的文件
test_top.sv //顶层文件,用来连接dut和test
具体做法:
1.在interface中编写好需要用到的接口文件
//interface.sv
interface my_itf(input bit clk);
logic in_1;
logic in_2;
logic out;
endinterface
2.在test中用virtual声明interface
//test.sv
class test;
virtual my_itf vir_itf //声明接口指针,interface作为介于硬件软件之间的媒介,不能直接在tb中声明,需要使用virtual前缀即相当于用指针的方式调用。
function new(virtual my_itf itf ,……);
this.vir_itf = itf; //将传入的接口赋给tb声明的接口变量,此时对vir_itf的赋值操作便相当于对dut的赋值操作,即接口已经将dut和tb连接起来。
……
endfuction
endclass
3.在test_top中例化接口、dut,并连接各个端口
//test_top.sv
`include "interface.sv" //使用include相当于将改文件粘贴到改位置,如果不用那么编译器将会报错,表示找不到
module router_test_top;
my_itf itf(clk); //例化接口
dut M1(
.in_1(itf.in_1),
.in_2(itf.in_1=2),
.out(itf.out),
.clock(itf.clk),
) //连接dut和tb
initial begin
/*
例化对象
*/
test t;
t = new(itf);
……
end
endmodule
在UVM中使用接口
使用文件:
test_top.sv
Interface.sv
my_driver.sv
具体做法:
1.定义interface //同sv内容一样
2.在test中用virtual声明interface,并使用get获得interface
//my_driver.sv
class my_driver extends uvm_driver;
virtual itf vir_itf; //声明接口
......
uvm_config_db#(virtual itf)::get(this, " ", "vif", "vir_itf"); //在build_phase中获得接口
endclass
……
vir_itf.in_1 = 0; //对接口操作
3.在test_top中例化接口、dut,并连接各个端口,使用set发送接口
//test_top.sv
`include"interface"
module top;
itf vir_itf; //例化接口
……
dut M1(...
); //连接端口
initial begin
uvm_config_db#(virtual itf)::set(null, "uvm_test_top.xxx", "vif", vir_itf); //在top中传递接口
......
end
endmodule
总结
uvm作为当前通用的验证方法学,其内含有大量的宏和包,uvm本质上也是使用sv语言编辑的。故在uvm中我们可以使用内置好的代码,非常方便的搭建接口,尽管在一个初级的验证环境中uvm显得繁琐,但是大型项目中uvm的优势便会立刻体现出来。
哎,csdn不支持sv和uvm语法高亮