news 2026/6/15 19:39:50

systemverilog中的virtual function

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
systemverilog中的virtual function

virtual类型的函数在extern声明了之后,展开声明时还需要写virtual吗?

这是一个非常经典且容易产生困惑的 SystemVerilog 语法问题。

核心结论

在类体外(extern)展开声明时,不需要(也不建议)再写virtual关键字。

一旦你在类内部声明该函数为virtual,这个属性就自动伴随该函数,无论是在类外定义还是在子类中重写,它永远都是虚函数。

1. 代码对比

正确写法:
class my_driver extends uvm_driver; // 1. 类内声明:必须写 virtual extern virtual function void build_phase(uvm_phase phase); endclass // 2. 类外展开:不要写 virtual function void my_driver::build_phase(uvm_phase phase); super.build_phase(phase); // ... 逻辑内容 endfunction
错误(或冗余)写法:

如果在类外写成virtual function void my_driver::build_phase...,编译器通常会报错,或者至少会给出一个警告。因为virtual是成员的属性修饰符,而类外定义只是内容的填充


2. 为什么会有这种规定?

这主要源于底层语言的设计逻辑(类似于 C++):

  • 属性在“户口本”上:类内部的声明(Declaration)就像是函数的“户口本”,它定义了函数的名称、参数、返回值以及属性(是否为 virtual、是否为 local 等)。

  • 类外只是“施工现场”:类外的定义(Implementation)只是告诉编译器函数具体怎么执行。此时编译器已经通过类内的声明知道了它是virtual,因此不需要重复。

3. 相关规则扩展

关键字类内声明 (Inside)类外展开 (Outside)说明
virtual必须写不能写虚函数属性在声明时确定。
static必须写不能写静态成员函数的定义不带 static。
local / protected必须写不能写访问权限仅由类内声明决定。
default 参数写在声明处不能写参数默认值(如int a=5)只能出现在类内。

4. 总结

你只需要记住:关键字(virtual, static, local)只在“类体内部”这个地盘生效,一旦出了类的大门(extern 展开),这些修饰符统统脱掉。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:34:35

动态二次特征筛选算法

动态二次特征筛选算法(Dynamic Secondary Feature Filtering Algorithm) 在 HY-Ego 系统中,由于动态二次特征采用穷举法生成,数量会快速增长(轻易达到数百甚至上千)。大部分在实际运行中很快变得无意义&…

作者头像 李华
网站建设 2026/6/15 13:35:56

Java-RPG-Maker-MV-Decrypter:终极游戏资源解密神器

Java-RPG-Maker-MV-Decrypter:终极游戏资源解密神器 【免费下载链接】Java-RPG-Maker-MV-Decrypter You can decrypt whole RPG-Maker MV Directories with this Program, it also has a GUI. 项目地址: https://gitcode.com/gh_mirrors/ja/Java-RPG-Maker-MV-Dec…

作者头像 李华
网站建设 2026/6/15 13:38:43

n8n浏览器自动化终极指南:5分钟掌握Puppeteer节点完整教程

n8n浏览器自动化终极指南:5分钟掌握Puppeteer节点完整教程 【免费下载链接】n8n-nodes-puppeteer n8n node for requesting webpages using Puppeteer 项目地址: https://gitcode.com/gh_mirrors/n8/n8n-nodes-puppeteer n8n-nodes-puppeteer是n8n工作流自动…

作者头像 李华
网站建设 2026/6/15 19:21:16

pyecharts-assets:打造企业级离线可视化解决方案

在数据驱动的时代,图表可视化已成为业务决策的重要支撑。然而,依赖外部CDN资源的传统方案往往面临加载延迟、网络不稳定等痛点。今天,我们将探索如何通过pyecharts-assets项目,构建一套完全自主可控的本地资源体系。 【免费下载链…

作者头像 李华
网站建设 2026/6/15 14:32:27

LuaDec51:5分钟掌握Lua 5.1反编译核心技巧

LuaDec51:5分钟掌握Lua 5.1反编译核心技巧 【免费下载链接】luadec51 luadec51: luadec51 是一个用于 Lua 版本 5.1 的 Lua 反编译器,可以将 Lua 字节码反编译回源代码。 项目地址: https://gitcode.com/gh_mirrors/lu/luadec51 LuaDec51是专门针…

作者头像 李华
网站建设 2026/6/15 13:36:39

5分钟快速上手:Dxf-Parser让CAD数据解析变得简单高效

5分钟快速上手:Dxf-Parser让CAD数据解析变得简单高效 【免费下载链接】dxf-parser A javascript parser for DXF files. It reads DXF file strings into one large javascript object with more readable properties and a more logical structure. 项目地址: ht…

作者头像 李华