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

    文章

    8580

    浏览量

    151042
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110078
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539
收藏 人收藏

    评论

    相关推荐

    独特的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

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

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

    接收机用晶体变换器设计及制作第三部分

    接收机用晶体变换器设计及制作第三部分 晶体变换器的印刷电路基板的制作与调整 图26晶体变换器的印刷电路基板
    发表于 05-15 10:58 1003次阅读
    接收机用晶体变换器设计及制作<b class='flag-5'>第三部分</b>

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

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

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

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

    《电动汽车传导充电系统》国家标准第三部分直流充电接口资料免费下载

    本文档的主要内容详细介绍的是《电动汽车传导充电系统》国家标准第三部分直流充电接口资料免费下载。
    发表于 12-18 08:00 34次下载
    《电动汽车传导充电系统》国家标准<b class='flag-5'>第三部分</b>直流充电<b class='flag-5'>接口</b>资料免费下载

    LTC2387驱动程序第三部分

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

    用于激活设备的可编程定时器-第三部分

    电子发烧友网站提供《用于激活设备的可编程定时器-第三部分.zip》资料免费下载
    发表于 12-16 10:28 0次下载
    用于激活设备的可编程定时器-<b class='flag-5'>第三部分</b>

    用Raspberry Pi和传感器制作“自动营造舒适空间的装置” 第三部分

    大家好,我是吉田!我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第三部分。在第二部分中,我们用BLE连接了罗姆SensorMedal并测量了各种数据。
    的头像 发表于 02-24 10:43 596次阅读
    用Raspberry Pi和传感器制作“<b class='flag-5'>可</b>自动营造舒适空间的装置” <b class='flag-5'>第三部分</b>

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

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

    SensorTile.box第三部分:编程模式(Pro mode)介绍

    电子发烧友网站提供《SensorTile.box第三部分:编程模式(Pro mode)介绍.pdf》资料免费下载
    发表于 07-29 16:19 0次下载
    SensorTile.box<b class='flag-5'>第三部分</b>:编程模式(Pro mode)介绍

    用于高频接收器和发射器的锁相环——第三部分

    电子发烧友网站提供《用于高频接收器和发射器的锁相环——第三部分.pdf》资料免费下载
    发表于 11-23 10:18 0次下载
    用于高频接收器和发射器的锁相环——<b class='flag-5'>第三部分</b>