当前位置:网站首页>SystemVerilog: 验证知识点点滴滴
SystemVerilog: 验证知识点点滴滴
2022-08-11 00:36:00 【笨牛慢耕】
目录
3. import pkg::*是将pkg的所有都导入进来吗?
1. 软件世界和硬件世界
Class代表软件世界,Module代表硬件世界,Interface是连接软件世界和硬件世界的桥梁,但是更加偏硬件一些。
Package也是软件世界的,相当于是SV中用于定义namescope的东西。Interface和Module(由于含有硬件世界的成分)不能包含在(属于软件世界的)Package中。
类中的成员(数据、函数、任务)缺省地都是automatic类型。如果需要static类型成员的话,需要用static显式地指定。Module中的所有变量、函数、任务都缺省为static。如果需要automatic类型成员的话,需要用automatic显式地指定。
Module的例化都是静态的。Class的对象的创建是动态的。这里所谓的静态是指在编译后就已经生成了。而动态则是指要到仿真实际开始后执行new()创建。
Module一经例化,模块的实例自始自终一直存在。而SV中关于对象生命期管理是采用自动回收机制,如果一个对象已经没有任何一个handle指向它,它就被自动回收了。
由于Module和Interface是硬件世界的,它们的例化是静态的,所以在编译后它们就已经被创建了。但是对象的创建是动态的,必须在仿真真正开始后才会被创建。以QuestaSim仿真为例,即便在执行了vsim命令后,对象其实还没有被创建,直到执行了“run 0ns”以后(那些应该在一开始就创建的)对象才真正被创建。
2. 什么是package
Ref: SystemVerilog Package (chipverify.com)
SystemVerilog中的package提供了保存和共享数据、参数和方法的机制,可以在多个module、class、program和interface中重用。
package中声明的内容都属于这个package作用域(scope)。
如果要想使用package中的东西,就需要先import这个package,然后通过package引用。SV中的import与python中的import是相同的功能。
package my_pkg;
typedefenumbit [1:0] { RED,YELLOW, GREEN, RSVD } e_signal;
typedefstruct { bit [3:0]signal_id;
bit active;
bit [1:0] timeout;
} e_sig_param;
function my_func();
$display ("mypkg::my_func is called...");
endfunction
endpackage
import的时候可以逐个import想要使用的东西,或者一锅端将package中的所有东西都import进来,如以下例子所示:
//import my_pkg::* ; // Import all things defined in my_pkg
import my_pkg::my_func ;// Import my_func only from my_pkg
module tb_top;
initial begin
my_func();
end
如果在package中定义的一个变量或者函数名与外部其它定义的变量或函数名冲突的时候,需要用pkg_name::var的形式进行引用以示区分。
import my_pkg::* ; // Import all things defined in my_pkg
typedef enum bit [1:0] { RED,YELLOW,GREEN} e_pixel;
module tb_top;
initial begin
e_signal signal = RED;
e_pixel pixel = RED;
my_func();
end
endmodule
以上例子中,用到了两个RED,会发生冲突。这是需要加package名前缀用于区分,如下所示
...
e_signal signal = my_pkg::RED;
...
3. import pkg::*是将pkg的所有都导入进来吗?
一个常见的误解是使用“import pkg::*”会将一个package的所有的东西一股脑儿都导入进来。因此有人会担心这样做会不会使得编译产生的库会不适当地变得巨大因而导致仿真内存紧张?
其实不会。
“import pkg::*”这条语句的效果是告诉仿真器,当在当前namescope中没有找到某个类、变量或者函数、任务等的声明时可以到该pkg中去找。而且仿真器在寻找某个类、变量、函数、任务等时是遵循所谓的“就近原则”。
当有多个packge中都包含某个待搜索的{ 类、变量、函数、任务}名,而且它们都以“import pkg::*”的形式被导入时,此时会发生name collision,最明智的做法是如上节所述一样以pkg::name的显式的形式进行引用。
4. import vs include
如上所述,import是用于package的导入。
`include将文件中所有文本原样插入包含的文件中。这是一个预处理语句,`include在import之前执行。
import不会复制文本内容。但是import可package中内容引入import语句所在的作用域。
To put it simply, include is equivalent to copy/paste or insertion of whatever is present in that file to wherever you include; import is used to make all/select variables from a package visible.
边栏推荐
- NOR FLASH闪存芯片ID应用之软件保护场景
- YOLOv5的Tricks | 【Trick13】YOLOv5的detect.py脚本的解析与简化
- 从0开始设计JVM ,忘记名词跟上思路一次搞懂
- networkmanager无法打开
- Distributed. Performance optimization
- 【js】获取当前时间的前后n天或前后n个月(时分秒年月日都可)
- I caught a 10-year-old Ali test developer, and after talking about it, I made a lot of money...
- Ali P7 bask in January payroll: hard to fill the, really sweet...
- 鲲鹏编译调试及原生开发工具基础知识
- rhel7.0解决yum无法使用(system is not registered to Red Hat Subscription Management)
猜你喜欢
Word set before the title page
BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection Paper Notes
C#-委托的详细用法
Design and implementation of flower online sales management system
rhel7.0解决yum无法使用(system is not registered to Red Hat Subscription Management)
只会懒汉式和饿汉式 你还不懂单例模式!
地下管廊可视化管理系统搭建
两个链表的第一个公共节点——LeetCode
J9数字论:DAO治理更像一种生态过程:治理原生于网络,不断演变
YOLOv5的Tricks | 【Trick13】YOLOv5的detect.py脚本的解析与简化
随机推荐
22/8/9 贪心问题合集
分布式.性能优化
什么是“门”电路(电子硬件)
【21天学习挑战赛】折半插入排序
[Excel知识技能] 将“假“日期转为“真“日期格式
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 2 DGHJKL Problem Solution
Some Experiences of Embedded Software Logging
leetcode 前K个高频单词
微信小程序获取当前页面的url和参数
Shell Text Three Musketeers Sed
什么是数组
word 设置标题前分页
力扣每日一题-第52天-387. 字符串中的第一个唯一字符
C# using timer
② 关系数据库标准语言SQL 数据定义(创建、修改基本表)、数据更新(增删改)
nodejs项目连接mysql数据库
微信小程序通过URL Scheme动态的渲染数据
C#-委托的详细用法
[Excel knowledge and skills] Convert text numbers to numeric format
使用 BeanUtils 做属性拷贝,性能有点拉胯!