0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

参数化接口和可重用VIP:第一部分

星星科技指导员 来源:synopsys 作者:Aron Pratt 2023-05-29 10:30 次阅读

背景

基于SystemVerilog的验证引入了接口的概念来表示设计模块之间的通信。在其最基本的形式中,SystemVerilog 接口只是一个命名的信号束,可以通过模块端口作为单个项目进行通信。然后,接收此接口的设计模块可以通过此接口参考访问信号。但是,接口的更高级别函数也可以提供更强类型的通信,以更好地表示设计意图。以下是系统Verilog接口中可用的高阶函数的子集:

可以通过使用时钟块和模块端口在信号列表上执行访问规则

函数和任务可用于封装高阶排序或访问控制

初始块和始终块等进程可以添加功能

连续赋值语句还可以添加功能

断言可以确保正确的集成

SystemVerilog 接口的一个非常重要的用途是将静态设计元素连接到动态测试平台元素。动态测试平台元素需要访问静态设计元素才能采样和驱动信号,但可重用的测试平台元素无法访问静态设计元素,除非通过称为虚拟接口的特殊构造。虚拟接口是测试平台代码中的接口句柄,可以与接口实例一起分配。虚拟接口是动态属性,可以分配给不同测试平台中的不同接口实例,从而提高可重用性。

设计可重用设计块的常用技术是使用参数使设计块的不同实例具有独特的特征。例如,可以对模块进行参数化,以允许在声明模块并提供参数值时定义数据总线宽度。SystemVerilog 接口也支持参数化,但参数化接口的使用在测试平台端带来了不可预见的复杂性。为了与赋值兼容,参数化虚拟接口必须专用于接口实例专用的相同值。除非采取预防措施,否则这可能会使一些非常丑陋的测试平台代码具有更丑陋的使用模型。

参数扩散:蛮力法

参数化虚拟接口引入的问题是,访问它的测试平台元素必须知道强类型接口。因此,当接口专用化尚未知时,无法编写泛型类以使用参数化虚拟接口。此问题的一个解决方案是参数化访问参数化虚拟接口的类。例如,可以使用 UVM 驱动程序必须使用的虚拟接口类型进行参数化。然而,这只是将问题向上移动了一层,因为现在实例化该参数化驱动程序的代理也必须参数化,以便它可以创建驱动程序的正确专用实例。这会不断向上移动,直到您到达“知道”正在测试的特定专业化存在的顶层测试平台组件。以下代码段演示了此问题。

首先,我们定义参数化的虚拟接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
interface param_if#(int width = 8);
logic clk;
logic[width-1:0] data;
clocking active_cb @(posedge clk);
default input #1 output #1;
output data;
endclocking
modport active_mp (clocking active_cb);
endinterface
typedef virtual param_if param_vif

接下来,我们定义可重复使用的 VIP 代码。此测试平台代码必须设计为可在参数化接口可以使用的任何环境中重用,因此还必须参数化VIP代码本身,以便可以访问正确的接口。以下代码段演示必须如何参数化 UVM 驱动程序类和包含该驱动程序的代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//=======================================================================
class param_driver#(type vif_t=param_vif) extends uvm_driver#(cust_data);
`uvm_component_param_utils(param_driver#(vif_t))
vif_t vif;
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(vif_t)::get(this, "", "vif", vif))
`uvm_fatal("build", "A valid interface was not received.");
endfunction
endclass
//=======================================================================
class cust_agent#(type vif_t=param_vif) extends uvm_agent;
`uvm_component_param_utils(param_agent#(vif_t))
vif_t vif;
param_driver#(vif_t) param_driver;
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(vif_t)::get(this, "", "vif", vif))
`uvm_fatal("build", "A valid interface was not received.");
uvm_config_db#(vif_t)::set(this, "param_driver", "vif", vif);
param_driver = param_driver#(vif_t)::type_id::create("param_driver", this);
endfunction
endclass

到目前为止,这看起来还不错!它给类定义增加了一点复杂性,但不会太多。然而,在你检查测试平台必须如何访问这些参数化类之前,这些问题不会变得明显。以下段显示了测试如何根据接口的参数化方式唯一地访问 VIP 的每个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//=======================================================================
class cust_test extends uvm_test;
`uvm_component_utils(cust_test)
param_agent#(virtual param_if#(8)) param_agent8;
param_agent#(virtual param_if#(16)) param_agent16;
param_agent#(virtual param_if#(32)) param_agent32;
virtual function void build_phase(uvm_phase phase);
param_agent8 = param_agent#(virtual param_if#(8))::type_id::create("param_agent8", this);
param_agent16 = param_agent#(virtual param_if#(16))::type_id::create("param_agent16", this);
param_agent32 = param_agent#(virtual param_if#(32))::type_id::create("param_agent32", this);
endfunction
endclass
//=======================================================================
module test_top;
param_if#(8) if8();
param_if#(16) if16();
param_if#(32) if32();
initial begin
uvm_config_db#(virtual param_if#(8))::set(uvm_root::get(), "uvm_test_top.param_agent8", "vif", if8);
uvm_config_db#(virtual param_if#(16))::set(uvm_root::get(), "uvm_test_top.param_agent16", "vif", if16);
uvm_config_db#(virtual param_if#(32))::set(uvm_root::get(), "uvm_test_top.param_agent32", "vif", if32);
run_test("cust_test");
end
endmodule

如您所见,对 VIP 的每个引用都必须使用要使用的正确接口类型进行参数化。这不仅会影响VIP建设,还会影响回调注册、工厂覆盖等。这给测试平台开发人员带来了很大的负担,并限制了这些环境的可重用性。

向验证组件添加参数是可重用VIP的有效技术解决方案,但它使使用模型大大复杂化,并限制了测试平台的可重用性。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7653

    浏览量

    148551
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109313
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18974
收藏 人收藏

    评论

    相关推荐

    Protel99se 安装好了,一部分ddb文件能打开一部分pcb格式打不开

    Protel99se 安装好了,一部分ddb文件能打开,一部分pcb格式打不开,该怎么办
    发表于 12-21 20:14

    京东卖的最热的:Labview宝典 第一部分

    由于限制每日只能传20M,所以先传第一部分,每天都传。
    发表于 09-28 20:29

    GBT 18487.1-2015 电动汽车传导充电系统 第一部分 通用要求

    新能源电动汽车最新国家标准【GBT 18487.1-2015 电动汽车传导充电系统 第一部分 通用要求】
    发表于 03-21 21:30

    什么是LDO噪声?第一部分

    有多大呢?可用如上文所示的积分噪声频率范围表示。这个范围通常是10赫兹至100千赫。请继续关注第二部分,在第二部分中,我们将更深入地讨论下个问题。
    发表于 10-30 09:04

    Altium Designer 17 绘制89C51开发板全程实战 第一部分: 原理图部分)相关资料分享

    Altium Designer 17 绘制89C51开发板全程实战 第一部分: 原理图部分)工程文件的创建 、创建工程文件:二、创建工程文件--原理图:三、创建工程文件--原理
    发表于 07-06 06:33

    保护您的 IP 核——第一部分软 IP——前言

    保护您的 IP 核——第一部分软 IP——前言 随着全球硬件设计和制造过程的激增以及IP供应商之间的竞争,IP盗版/假冒、虚假所有权等威胁正在加剧。因此,保护​​ IP 核设计的要求及其代表的专有
    发表于 02-23 11:59

    免调节中频VCO的实现(第一部分)

    免调节中频VCO的实现(第一部分)
    发表于 05-07 13:21 24次下载

    射频识别基础:第一部分

    射频识别基础:第一部分:天线是一个产生电流和电荷的器件,并且其影响对于远处的观看者无法消除。对于一个要工作的天线来说,显然要改变一些事情:辐射是被延迟的信号无
    发表于 09-25 08:12 45次下载

    GBT 20234.1-2011 第一部分

    电动汽车传导充电用连接装置第一部分,通用部分
    发表于 05-10 14:24 1次下载

    2012年PSoC数模混合设计培训_第一部分

    2012年PSoC数模混合设计培训_第一部分
    发表于 10-27 09:35 4次下载

    有时你需要一点收获第一部分

    有时你需要一点收获第一部分
    发表于 04-20 10:31 1次下载
    有时你需要一点收获<b class='flag-5'>第一部分</b>

    第一部分、硬件设计

    第一部分、硬件设计我把一个硬件系统分为五个单元:电源单元、单片机单元、输入单元、输出单元、通信单元。如下图:
    发表于 12-09 12:36 15次下载
    <b class='flag-5'>第一部分</b>、硬件设计

    参数接口和可重用VIP:第三部分

    在本系列的第一部分中,介绍了SystemVerilog接口的基本概念,并描述了这些接口参数化给测试平台代码带来的问题。在第二部分中,描述了
    的头像 发表于 05-29 10:32 463次阅读

    差分驱动ADC 第一部分

    电子发烧友网站提供《差分驱动ADC 第一部分.pdf》资料免费下载
    发表于 11-23 16:36 0次下载
    差分驱动ADC <b class='flag-5'>第一部分</b>

    使用Σ-Δ转换器——第一部分

    电子发烧友网站提供《使用Σ-Δ转换器——第一部分.pdf》资料免费下载
    发表于 11-23 14:31 0次下载
    使用Σ-Δ转换器——<b class='flag-5'>第一部分</b>