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

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

3天内不再提示

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

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

在本系列的第一部分中,介绍了SystemVerilog接口的基本概念,并描述了这些接口的参数化给测试平台代码带来的问题。这篇文章将描述此问题的可能解决方法,但需要付出代价...

特洛伊木马:偷袭方法

虚拟接口不支持多态性,因为它们与静态设计元素相关联。但是,SystemVerilog 类确实支持多态性,这一事实可用于创建接口访问器类。

创建一个虚拟类,该类声明在 SystemVerilog 接口上执行特定操作的纯虚拟访问器方法。然后,参数化类扩展此类以执行对强类型接口的实际访问。VIP 代码仅与非参数化基访问器类交互,因此无需参数化 VIP 代码即可使用强类型接口。测试平台必须设置强类型访问器类并将其传递给 VIP,但在此之后,无需参数化 VIP 即可执行与 VIP 的所有交互。以下代码段演示如何进行此设置。

首先,我们定义参数化虚拟接口,该接口与上周代码段中使用的接口相同:

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

接下来,我们定义非参数化接口访问器类和参数化以使用参数化接口的扩展类:

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
//=======================================================================
virtual class port_wrapper extends uvm_object;
pure virtual task do_write(logic[31:0] data);
pure virtual task do_read(output logic[31:0] data);
pure virtual task sync_driver_cb();
endclass
//=======================================================================
class port_wrapper_typed#(type vif_t=param_vif) extends port_wrapper;
vif_t vif;
function new(vif_t vif);
this.vif = vif;
endfunction
virtual task do_write(logic[31:0] data);
vif.active_cb.data <= data;
endtask
virtual task do_read(output logic[31:0] data);
data = vif.active_cb.data;
endtask
virtual task sync_driver_cb();
@(vif.active_cb);
endtask
endclass

在此之后,实现 VIP 代码以使用此访问器类,而不是直接访问虚拟接口。下面的代码段展示了驱动程序和代理类,并演示了必须使用访问器方法的各个位置。关于此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
30
31
32
33
34
35
36
37
38
39
//=======================================================================
class cust_driver extends uvm_driver#(cust_data);
`uvm_component_utils(cust_driver)
port_wrapper port;
task consume_from_seq_item_port();
forever begin
seq_item_port.get_next_item(req);
port.do_write(req.data);
port.sync_driver_cb();
task sample_signals();
forever begin
bit[31:0] sampled_data;
port.do_read(sampled_data);
port.sync_driver_cb();
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(port_wrapper)::get(this, "", "port", port))
`uvm_fatal("build", "A valid port wrapper was not received.");
//=======================================================================
class cust_agent extends uvm_agent;
`uvm_component_utils(cust_agent)
cust_driver driver;
function void build_phase(uvm_phase phase);
port_wrapper port;
if (!uvm_config_db#(port_wrapper)::get(this, "", "port", port))
`uvm_fatal("build", "A valid port wrapper was not received.");
uvm_config_db#(port_wrapper)::set(this, "driver", "port", port);
driver = cust_driver::type_id::create("driver", this);

最后,给出了测试平台代码。测试用例可以在不参数化的情况下访问 VIP,但实例化接口的顶级模块确实必须实现一些额外的步骤。它不仅必须实例化参数化接口,还必须创建参数化接口访问器类并将其传递给 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
30
31
32
33
34
35
36
37
//=======================================================================
class cust_test extends uvm_test;
`uvm_component_utils(cust_test)
cust_agent agent8;
cust_agent agent16;
cust_agent agent32;
virtual function void build_phase(uvm_phase phase);
agent8 = cust_agent::type_id::create("agent8", this);
agent16 = cust_agent::type_id::create("agent16", this);
agent32 = cust_agent::type_id::create("agent32", this);
endfunction
endclass
//=======================================================================
module test_top;
param_if#(8) if8();
param_if#(16) if16();
param_if#(32) if32();
initial begin
port_wrapper_typed#(virtual param_if#(8)) port_wrapper8;
port_wrapper_typed#(virtual param_if#(16)) port_wrapper16;
port_wrapper_typed#(virtual param_if#(32)) port_wrapper32;
port_wrapper8 = new(if8);
port_wrapper16 = new(if16);
port_wrapper32 = new(if32);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent8", "port", port_wrapper8);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent16", "port", port_wrapper16);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent32", "port", port_wrapper32);
run_test("cust_test");
end
endmodule

如您所见,此解决方案确实解决了参数化接口的使用模型问题。创建正确类型的端口包装器需要一些额外的代码,但是测试平台编写者可以访问使用不同专用接口的代理,而无需知道这些接口是如何专用的。

但是,此解决方案对 VIP 如何使用虚拟接口施加了严格的限制。驱动程序和监视器类不能直接与接互,而必须将这些访问推迟到强类型包装类。通过将驱动程序和监视器类的大部分功能移动到强类型包装类,可以抵消这种生产力损失;然而,这种更复杂的结构可能会令人困惑且不太灵活。上面的代码段仅显示了驱动程序类可能需要的几个访问方法,但在实际环境中,此列表可能会增长许多倍,并且监视器类也需要完整的访问器方法。

经过反思,处理参数化接口的蛮力方法和特洛伊木马方法都不是理想的。使用前一种方法,向类添加参数会使 VIP 的使用模型复杂化。在后面的方法中,必须提前规划端口包装类支持的访问方法,并且对虚拟接口的 VIP 访问受到限制。如果 VIP 代码可以在不实际使用参数化接口的情况下启用类似于参数化接口的功能,该怎么办?

审核编辑:郭婷

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

    关注

    33

    文章

    7973

    浏览量

    149251
  • 监视器
    +关注

    关注

    0

    文章

    764

    浏览量

    32907
  • Verilog
    +关注

    关注

    28

    文章

    1328

    浏览量

    109510
收藏 人收藏

    评论

    相关推荐

    独特的51单片机教程第二部分—牛人经验,论坛独家奉献

    点亮LED......仍然是没有任何直接帮助...... 就51单片机而言(别的也是类似的,不要担心。)独特的51单片机教程第二部分[hide][/hide]独特的51单片机教程汇总贴https
    发表于 11-16 09:48

    LabVIEW开发者必备技巧宝典第二部分

    LabVIEW开发者必备技巧宝典第二部分:由电子发烧友网论坛整理出品,集结众多大牛、工程师的经验之作。为广大LabVIEW开发工程师提供开发、调试技巧,助力LabVIEW工程师。
    发表于 11-26 15:32

    LabVIEW开发者必备技巧宝典第二部分

    ``LabVIEW开发者必备技巧宝典第二部分:由电子发烧友网论坛总结出品,集结众多大牛、工程师的经验之作。为广大LabVIEW开发工程师提供开发、调试技巧,助力LabVIEW工程师。欢迎大家下载收藏
    发表于 12-05 14:17

    DSP三相交流同步电机矢量控制C程序经典著作(第二部分)

    本帖最后由 一只耳朵怪 于 2018-6-11 14:39 编辑 DSP三相交流同步电机矢量控制C程序经典著作(第二部分)
    发表于 06-11 06:02

    JN5189 第二部分-1

    接下来是第二部分了和第三部分,直接见附件中的Word吧!附上运行测试视频和led_blinky.bin
    发表于 09-23 00:40

    实现免调整VCO1的IC (第二部分)

    实现免调整VCO1的IC (第二部分)
    发表于 05-07 13:18 46次下载

    《电子电气产品中多溴联苯和多溴联苯醚的测定 第二部分:气相色

    SN/T 2005.2—2005 《电子电气产品中多溴联苯和多溴联苯醚的测定 第二部分:气相色谱法—质谱法》
    发表于 08-12 08:57 23次下载

    开关电源设计(第3版)第二部分

    电子发烧友网站提供《开关电源设计(第3版)第二部分.txt》资料免费下载
    发表于 09-12 15:04 0次下载

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

    2012年PSoC数模混合设计培训_第二部分
    发表于 10-27 09:32 26次下载
    2012年PSoC数模混合设计培训_<b class='flag-5'>第二部分</b>

    如何使用 Nios II 处理器进行你中意的设计之第二部分教程

    使用 Nios II 处理器进行设计”第二部分
    的头像 发表于 06-11 14:36 4847次阅读
    如何使用 Nios II 处理器进行你中意的设计之<b class='flag-5'>第二部分</b>教程

    AN-389: 使用Σ-Δ转换器—第二部分[中文版]

    AN-389: 使用Σ-Δ转换器—第二部分[中文版]
    发表于 03-19 06:38 0次下载
    AN-389: 使用Σ-Δ转换器—<b class='flag-5'>第二部分</b>[中文版]

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

    有时你需要一点收获第二部分
    发表于 04-19 11:32 9次下载
    有时你需要一点收获<b class='flag-5'>第二部分</b>

    设计一台物联网模块灯——第二部分

    设计一台物联网模块灯——第二部分
    发表于 11-02 08:16 0次下载
    设计一台物联网模块灯——<b class='flag-5'>第二部分</b>

    救世主Ga N来啦!第二部分:测量

    救世主Ga N来啦!第二部分:测量
    发表于 11-03 08:04 0次下载
    救世主Ga N来啦!<b class='flag-5'>第二部分</b>:测量

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

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