当我学会了SystemVerilog验证特性,一个概念让我困惑——虚拟接口。 这些是什么,为什么他们需要吗?
一个接口是什么?
从一个接口。 快速总结:Verilog时候,模块端口,单独的信号。 连接两个模块,每个都有9个港口,你必须列出所有9信号。 这很容易出错。
当你连接电视,DVD播放器,你连接个人电线吗? 不,你把一个HDMI电缆,单击完成。 你甚至不需要知道有多少电线的HDMI电缆(20 !)。 在SystemVerilog,一束电线被称为一个接口。
一个接口包含电线和synthesizable方法来执行操作,如发送和接收事务。 一个接口是RTL,就像你的设计。 这是一个接口与7信号和一个任务接收事务。
接口color_ifc; 逻辑r, o, y, g, b,我,v; 任务接收(输出逻辑[31:0]数据); … endtask endinterface
真正的硬件是静态的。 如果你的芯片是用3 m盖茨制作的,它不会突然有4米盖茨只是因为你需要一点刺激。 在仿真中,RTL设计是静态的。 在编译时,不能描述增长或萎缩。 同样,你的模拟有固定数量的接口,在编译时指定,在运行时不能改变。
动态Testbenches
SystemVerilog类和对象是动态的。 如果你需要发送1000个事务,建立1000个对象。 需要有2000个吗? 只是建造更多。 如果你UVM testbench决定它需要2司机而不是默认的1,它只是在运行时创建另一个驱动程序(或代理)。
因为对象是动态的,他们不能包含接口。 否则,当你建造第二个驱动程序在运行时,它将创建第二个接口,它是不允许的。
但一个对象可以包含指针。 例如,代理有一个指针(处理/类变量)为驱动的对象,显示器,等。你怎么能让一个指针RTL接口?
在SystemVerilog,关键字“虚拟”通常意味着指针。 一个虚拟的接口是一个指针指向一个接口。
例子
这里是一个颜色的测试模块接口和一个司机。 构造司机时,它通过一个指针(物理)接口。
模块测试(colors_ifc c_ifc); 司机d; 最初的开始 d =新(c); / /通过接口 d.send (42); 结束 endmodule
司机类保存指针在虚拟接口,所以可以使用它后驱动信号。
类驱动程序; 虚拟colors_ifc v_ifc; / /指针RTL实例
新功能(输入虚拟colors_ifc c_ifc); v_ifc = c_ifc; endfunction
任务发送(输入逻辑[31:0]数据); v_ifc。 r =数据[0]; … endtask endclass
好处
驱动程序类是可重用的,因为它可以指向任何color_ifc。 如果你testbench需要连接两个接口,它只是构造两个驱动程序对象,通过在每个接口实例。
探索更多的
想要了解更多关于SystemVerilog UVM ? 访问西门子EDA培训一个课程列表或探索我们的许多学习路径OneGlance地图。 我们提供生活教师和课程按需培训自主学习。
博客作者:克里斯长矛,主要客户培训工程师,西门子EDA学习服务.这本书的作者SystemVerilog核查 |