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

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

3天内不再提示

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

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

在本系列的第一部分中,介绍了SystemVerilog接口的基本概念,并描述了这些接口的参数化给测试平台代码带来的问题。在第二部分中,描述了使用访问器类来保护VIP代码免受参数化影响的方法,但此解决方案对该接口的VIP访问施加了新的限制。在本系列的最后一篇文章中,介绍了一个过程,该流程允许测试平台使用参数化接口,而不会对VIP访问其提供的接口的方式施加任何限制。

最大占用空间:两全其美

参数化接口引入动态测试平台代码的问题无法使用当今现有的SystemVerilog功能来解决。因此,我们必须设计一种方法来避免将这些参数暴露给VIP代码。本系列的上一篇文章介绍了访问器类来实现这一点。另一种解决方案是定义 VIP 可以与之交互的最大占用空间样式接口,以及包装此最大占用空间接口并从最大占用空间接口连接到所需信号的参数化接口。

最大占位面积样式接口定义了每个信号的最大宽度,并且可以将各个VIP组件配置为利用来自这些信号的位片。这允许具有不同宽度的多个 VIP 实例,并且不需要参数化类来使用参数化接口。以下代码段演示了这些概念。

首先,我们定义最大占用空间样式接口。请注意,此接口未参数化,因为这是 VIP 代码将与之交互的接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Redefinable max footprint
`ifndef MAX_DATA_WIDTH
`define MAX_DATA_WIDTH 32
`endif
interface max_footprint_if;
logic clk;
logic[`MAX_DATA_WIDTH-1:0] data_in;
logic[`MAX_DATA_WIDTH-1:0] data_out;
clocking active_cb @(posedge clk);
default input #1 output #1;
input data_in;
output data_out;
endclocking
modport active_mp (clocking active_cb);
endinterface
typedef virtual max_footprint_if max_footprint_vif;

接下来,定义参数化接口,用于包装最大占用空间接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface param_if#(int width = 8);
logic clk;
logic[width-1:0] data_in;
logic[width-1:0] data_out;
max_footprint_if internal_if();
assign internal_if.clk = clk;
// Z values driven on unused inputs of the max footprint
assign internal_if.data_in = {`MAX_DATA_WIDTH'hz, data_in};
// Only selected output values used from the max footprint
assign data_out = internal_if.data_out[width-1:0];
endinterface

在此之后,实现VIP代码以使用最大占用空间接口而不是参数化接口。下面显示的一个附加类在前面的帖子中没有显示,它是配置类,用于定义每个 VIP 实例的信号宽度。该解决方案造成的另一个复杂问题是,VIP在采样和驱动信号时必须使用位切片技术。这很不幸,但SystemVerilog完全有能力处理这个问题。

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
40
41
42
43
44
45
46
47
48
49
50
51
//=======================================================================
class cust_cfg extends uvm_object;
rand int data_width;
constraint valid_data_width {
data_width inside {8, 16, 32};
}
//=======================================================================
class cust_driver extends uvm_driver#(cust_data);
max_footprint_vif vif;
cust_cfg cfg;
`uvm_component_utils(cust_driver)
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(max_footprint_vif)::get(this, "", "vif", vif))
`uvm_fatal("build", "A valid virtual interface was not received.");
if (!uvm_config_db#(cust_cfg)::get(this, "", "cfg", cfg))
`uvm_fatal("build", "A valid configuration was not received.");
task consume_from_seq_item_port();
seq_item_port.get_next_item(req);
vif.active_cb.prop_out <= ((req.prop <> (`MAX_DATA_WIDTH-cfg.data_width));
@(vif.active_cb);
task sample_signals();
bit[31:0] sampled_prop_in = ((vif.active_cb.prop_in <> (`MAX_DATA_WIDTH-cfg.data_width));
VM_LOW);
@(vif.active_cb);
//=======================================================================
class cust_agent extends uvm_agent;
`uvm_component_utils(cust_agent)
max_footprint_vif vif;
cust_driver driver;
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(max_footprint_vif)::get(this, "", "vif", vif))
`uvm_fatal("build", "A valid virtual interface was not received.");
if (!uvm_config_db#(cust_cfg)::get(this, "", "cfg", cfg))
`uvm_fatal("build", "A valid configuration was not received.");
uvm_config_db#(max_footprint_vif)::set(this, "driver", "vif", vif);
uvm_config_db#(cust_cfg)::set(this, "driver", "cfg", cfg);
driver = cust_driver::type_id::create("driver", this);

最后,给出了测试平台代码。测试用例无需参数化即可访问 VIP,并且实例化接口的顶级模块可以使用参数化接口。还显示了为每个 VIP 实例创建配置对象的附加步骤(这不是额外的步骤,因为早期的解决方案也需要这样做,但为了简洁起见,省略了)。

利用最大占用空间样式接口进行VIP信号访问,无需参数化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
40
41
42
43
//=======================================================================
class cust_test extends uvm_test;
cust_cfg cfg8;
cust_cfg cfg16;
cust_cfg cfg32;
cust_agent agent8;
cust_agent agent16;
cust_agent agent32;
virtual function void build_phase(uvm_phase phase);
cfg8 = new("cfg8");
cfg8.data_width = 8;
uvm_config_db#(cust_cfg)::set(this, "agent8", "cfg", cfg8);
agent8 = cust_agent::type_id::create("agent8", this);
cfg16 = new("cfg16");
cfg16.data_width = 16;
uvm_config_db#(cust_cfg)::set(this, "agent16", "cfg", cfg16);
agent16 = cust_agent::type_id::create("agent16", this);
cfg32 = new("cfg32");
cfg32.data_width = 32;
uvm_config_db#(cust_cfg)::set(this, "agent32", "cfg", cfg32);
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
uvm_config_db#(max_footprint_vif)::set(uvm_root::get(), "uvm_test_top.agent8", "vif", if8.internal_if);
uvm_config_db#(max_footprint_vif)::set(uvm_root::get(), "uvm_test_top.agent16", "vif", if16.internal_if);
uvm_config_db#(max_footprint_vif)::set(uvm_root::get(), "uvm_test_top.agent32", "vif", if32.internal_if);
run_test("cust_test");
end
endmodule

利用最大占用空间样式接口进行VIP信号访问,无需参数化VIP代码即可创建VIP代码。定义参数化接口允许测试平台利用它们所支持的改进集成功能。使用参数化接口包装最大占用空间接口的策略可实现这两种样式的优势。

审核编辑:郭婷

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

    关注

    33

    文章

    7653

    浏览量

    148563
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109313
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66834
收藏 人收藏

    评论

    相关推荐

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

    本帖最后由 eehome 于 2013-1-5 10:01 编辑 独特的51单片机教程第三部分—牛人经验,论坛独家奉献指令系统 与 寻址方式 按照顺序,今天该到说指令系统的时候了,要说指令系统
    发表于 11-17 11:18

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

    ——有什么潜力,至于怎么做,怎么写这条指令,这才是接下来要查的内容。 独特的51单片机教程第三部分下—牛人经验,论坛独家奉献独特的51单片机教程汇总贴https://bbs.elecfans.com
    发表于 11-18 09:59

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

    LabVIEW开发者必备技巧宝典第三部分分享给大家,请叫我雷锋。
    发表于 12-05 11:40

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

    本帖最后由 jfzhangjin 于 2015-5-6 09:30 编辑 LabVIEW开发者必备技巧宝典第三部分由电子发烧友网论坛出品,集结众多大牛、工程师的经验之作。为广大LabVIEW
    发表于 12-05 14:19

    【蓝牙4.1】+ 分享一本好书《Psoc 体系结构与编程》四部分完全版

    =292215&highlight=PSOC%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84第二部分第三部分:第四部分
    发表于 06-11 00:21

    (国标)YDT1363.3-2005通信站电源,空调及环境集中监控管理系统 第三部分,前端智能设备协议

    (国标)YDT1363.3-2005通信站电源,空调及环境集中监控管理系统 第三部分,前端智能设备协议论坛上没找到这类的资料,手上刚好有,就分享给大家
    发表于 06-04 14:55

    单电压基准与双电压基准的对决-第三部分

    在这个三部分系列博文中,我已经讨论了生成两个良好匹配、低漂移电压基准的解决方案。我们在第一部分个拓扑结构开始,在第二部分比较和对比了性能方面的不同。现在,我们来看一看这
    发表于 09-12 11:36

    找不到任何基于PSoC4或Pro的第三部分模块

    大家好,我似乎找不到任何基于PSoC4或Pro的第三部分模块。例如,对话框的DA14580来自松下的PAN1740模块。塞浦路斯IC有第三方供应商吗?提前感谢!克里斯托弗
    发表于 09-17 14:18

    JN5189 第二部分-1

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

    【大联大世平 NXP ZigBee JN5189开发板试用体验】第三部分

    本帖最后由 年少的轻狂不用来挥霍 于 2020-10-27 14:05 编辑 第三部分,烧写固件到嵌入式FLASH的话可以使用调试器或者串口等,1.利用GUI FLASH工具(调试器烧录)这个
    发表于 10-27 14:02

    《电子电气产品中六价铬的测定 第三部分:二苯碳酰二肼分光光度

    《电子电气产品中六价铬的测定 第三部分:二苯碳酰二肼分光光度法》SN/T 2004.3—2005
    发表于 08-12 08:54 29次下载

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

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

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

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

    LTC2387驱动程序第三部分

    LTC2387驱动程序第三部分
    发表于 05-16 15:23 4次下载
    LTC2387驱动程序<b class='flag-5'>第三部分</b>

    硬件即代码第三部分:空间与时间

    电子发烧友网站提供《硬件即代码第三部分:空间与时间.zip》资料免费下载
    发表于 06-14 15:12 0次下载
    硬件即代码<b class='flag-5'>第三部分</b>:空间与时间