路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

导入SystemVerilog程序包意味着什么?

已有 1178 次阅读| 2020-12-10 11:10 |系统分类:芯片设计| IC验证

 

在上次网络研讨会中,我解释了在SystemVerilog中导入程序包时会发生什么情况。不过,仍然有很多问题,所以这里给出了书面版本。

 

请在你自己的系统或EDA工具上尝试这些示例。将代码剪切并粘贴到SystemVerilog文件中,进行编译和调试。犯些错误,搞得一团乱,然后从中学习(即不断试错,入坑又出坑)。如果你只是听或读了这篇,但从未运行过代码,那么这些概念将从你的脑中消失的速度比Neowise彗星更快。

 

 

另一盒糖

想象你正在做晚餐,需要一些糖。你会怎么做?把手伸到冰箱旁边的柜子里,抓住盒子。糟糕,糖昨晚已经用完了,所以没有盒子。因此,你需要去杂货店再买一些。

 

SystemVerilog程序包就像杂货店一样,是一个存放了很多东西,每当你在家里找不到东西时就会去的地方。

一个美国的杂货店

 

 

什么是程序包?

程序包中涵盖了你想在模块之间共享的定义。可以包括参数,枚举类型,结构,类型定义(typedef),类,甚至是任务或函数。

 

这里有一个程序包,其中定义了数据类型和参数。

// chip_pkg.sv package chip_pkg;   typedef logic [3:0] data_t;   parameter LIFE = 9; endpackage

 

 

编译一个程序包

当你使用Questa进行编译时,代码将在工作库中转换为二进制形式。相较于原始代码,编译器可以更快地读取二进制版本,这就是为什么我们要导入程序包而不是包含它们的原因。 UVM程序包有70,000行,但是编译版本几乎是即时导入的。

 

 

导入程序包

模块通过导入来访问已编译的程序包代码。这里给了一个声明一些参数和变量并显示参数的芯片模块。

// chip.sv module chip;   import chip_pkg::*;            // Wildcard import   parameter INIT_VALUE = 'hFF;   // Initial value   data_t my_data = INIT_VALUE;   // What are data_t and INIT_VALUE?   initial $display("my_data = 'h%x / 'b%b", my_data, my_data);   parameter LIFE = 42;           // Ask Douglas Adams   initial $display("The meaning of life is %0d", LIFE); endmodul

 

 

程序包商店

SystemVerilog编译器在本地查找名称。如果找不到它们,则转到“杂货店”-即程序包。

 

当你编译此模块时,通配符import语句会告诉编译器该包是查找定义的地方。编译器不会从包中引入所有名称,否则那就是像把整个杂货店带回家!

 

模块定义参数INIT_VALUE。对于“my_data”的声明,编译器需要弄清楚“data_t”和“INIT_VALUE”的含义。编译器始终从搜索本地范围(即芯片模块)开始,并成功在这里找到INIT_VALUE。但是,这里没有data_t。只有这样编译器才会查看程序包。编译器成功在芯片程序包中找到data_t的定义!

 

你可以证明在本地范围之后程序包也被搜索了。下一个代码块定义了一个参数LIFE并进行打印。在$display()语句中,编译器需要知道什么是“ LIFE”。由于你只是在本地声明了它,因此即使其中有一个具有相同名称的参数,编译器也不会在chip_pkg中查找。本地定义与包中的参数不冲突,因为从未导入chip_pkg :: LIFE。

 

 

最低限度

只有在本地作用域中找不到新定义时,SystemVerilog才会从包中引入新定义。这是为什么呢?如果包中的每个名称都被立即导入,则很有可能其中一个包中的名称也许与本地范围内的一个名称冲突,例如芯片模块。最好是只引入最少的名称,而不要太多。

                                         

该模块定义了一个叫LIFE的参数。在你最喜欢的模拟器中运行此代码,找出LIFE的意义。如果你是猫的话,假如是9,这会是重要的数字吗?还是说有更深的东西?

 

如果模块将data_t类型定义为8chip_pkg显式获取LIFE的值?如果在chip_pkg和chop_pkg中都定义了一个新参数,并且都导入了该参数,该怎么办?会发生什么?如果我告诉您答案,您将永远不会记住它。请您自己尝试,花时间,发现真相。

 

 

原文链接:https://blogs.mentor.com/verificationhorizons/blog/author/cspear/

 

扫描上图二维码可直达课程页面,马上试听

 

往期精彩:

路科发布| 稳中带涨!25w成芯片校招薪资平均底!2020应届秋招数据全面分析!

相约今晚8点 2020 IC秋招经验分享与数据分析

V2Pro 2020秋M1 我对你的迷惑和选择都深以为然

V2Pro春季班普遍学撑了,秋季班7月报名你还敢来么

UVM RAL模型:用法和应用

我们准备做第二期线下培训,依旧认真且严肃

如果你突然被裁员了,你的Plan B是什么?

[彩虹糖带你入门UVM]

理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 02:58 , Processed in 0.016510 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部