当前位置: 首页 > news >正文

SystemVerilog 中 import 和 include 的区别与联系

这是初学 SV/UVM 很容易混淆的两个概念。它们都是"引入外部内容",但机制完全不同——include文本替换import引入 package 的符号


一、`include(预处理,文本替换)

本质

`include编译预处理指令(注意前面有反引号`),在编译前把指定文件的内容原封不动地复制粘贴到当前位置。

用法

`include "uvm_macros.svh" `include "my_driver.sv"

特点

  • 纯文本插入,等同于把那个文件的代码手动抄进来
  • 处理的是文件
  • 常用于包含:宏定义(`define)、.svh头文件、宏文件(如uvm_macros.svh
  • 谁 include,代码就出现在谁那里

二、import(编译语义,引入符号)

本质

import语言级语句,把某个package(包)里已经编译好的类、类型、函数、变量等符号引入到当前作用域,让你能直接使用。

用法

import uvm_pkg::*; // 引入 uvm_pkg 里的所有符号 import my_pkg::trans; // 只引入 my_pkg 里的 trans 类

特点

  • 处理的是package(包),不是文件
  • 引入的是符号(名字),不是文本
  • package 必须先被编译过,import 只是"让这些名字可见"
  • ::*表示引入包里所有公开符号;::具体名表示只引入某一个

三、核心区别对比

对比项`includeimport
类别预处理指令(有反引号)语言语句
处理对象文件(内容)package(符号)
机制文本复制粘贴引入已编译的符号名
发生时机编译前(预处理)编译时(语义解析)
内容会不会重复会(复制多次可能重定义)不会(只是引用同一份)
典型用途宏文件、头文件使用 package 里的类/类型/函数
是否需要 package不需要必须有 package

四、它们的联系(经常一起出现)

在 UVM 里你几乎总能看到这两句配对出现

import uvm_pkg::*; // 引入 uvm 的所有类、类型 `include "uvm_macros.svh" // 引入 uvm 的宏(如 `uvm_info、`uvm_component_utils)

为什么要一起用?

  • 类、函数、类型→ 放在package里 → 用import引入
  • 宏(`define不能放进 package(宏是预处理层面的,package 是语义层面的)→ 只能用`include引入

所以:

  • import uvm_pkg::*;让你能用uvm_componentuvm_test
  • `include "uvm_macros.svh"让你能用`uvm_info`uvm_component_utils

两者互补,缺一不可。


五、典型的 package 组织方式

一个常见做法:在 package 内部用 include 把源文件拼进来,外部再 import 这个 package:

// ---------- my_pkg.sv ---------- package my_pkg; import uvm_pkg::*; `include "uvm_macros.svh" `include "my_trans.sv" // 把类的定义文本包含进包里 `include "my_driver.sv" `include "my_env.sv" endpackage // ---------- tb.sv ---------- module tb; import uvm_pkg::*; `include "uvm_macros.svh" import my_pkg::*; // 引入 my_pkg 里所有类 ... endmodule
  • 包内部:用`include把各个类的源码"拼装"进 package
  • 包外部:用import引入这个 package 的符号

六、易错点

  1. 宏不能靠 import 传递:即使你import了某个 package,那个包里用`define定义的宏在外面也用不了——宏必须靠`include
  2. 重复 include 会重定义:同一个含类定义的文件被 include 两次会报"重复定义",所以头文件常用`ifndef / `define / `endif保护
  3. 反引号别漏`include前面是反引号`,不是普通引号
  4. import::*的可见性::*是"通配导入",只有真正用到时才解析,不会强制引入所有名字造成冲突

一句话总结

`include是"文本复制",把文件内容粘过来,主要用于宏/头文件;import是"引入符号",把 package 里编译好的类/类型/函数拿来用。UVM 里两者配对使用——import uvm_pkg::*拿类,`include "uvm_macros.svh"拿宏,互补缺一不可。

http://www.jsqmd.com/news/1112622/

相关文章:

  • 强力解锁浏览器画中画功能:告别视频观看的割裂体验
  • Android安全分析实战:3分钟快速上手工具链与自动化响应
  • 从个人用AI到企业用AI,如何为企业部署一套私有化Agent智能体运行时,将AI变成企业的基础设施
  • Obsidian Jupyter插件完整指南:在笔记中直接运行Python代码的终极教程
  • CI/CD 回滚演练:能发布,也要能撤回来
  • 贝叶斯优化:用高斯过程与采集函数实现智能超参数调优
  • RAG评估实战:用MLFlow构建可复现、可归因的工程化指标体系
  • 如何快速配置PotPlayer百度翻译插件:新手完全指南
  • VMware 软件(虚拟机)安装Centos
  • Spring Boot项目JAR包加密实战:使用xjar保护代码防反编译
  • 统一多模态Agent编排:用单一模型驱动多感官任务的可行性与边界
  • openEuler Compiler-docs技术白皮书解读:LLVM构建openEuler的完整技术方案
  • 离线运行的 3D 模型处理工具,保密项目的稳妥选择
  • 企业级AI集成实战:Agent、RAG与MCP架构深度解析
  • Claude Code 国内安装与实战指南:AI 编程助手从零到项目集成
  • FanControl终极指南:3步搞定Windows风扇控制,告别噪音与高温
  • Missing Semester Class1:course overview and introduction of shell
  • AI效率工具产品化:用户访谈驱动的PMF验证方法
  • Three.js 本地模型加载教程
  • 基于HuggingFace生态的Zero_NLP项目实战指南:从Transformer模型微调到中文文本分类与NER任务的深度解析
  • 一个类,一次注册,搞定 2 个工具 + 1 个 Skill + 1 个 Sub-Agent
  • 如何3分钟快速上手开源炉石传说脚本:Hearthstone-Script终极指南
  • 批处理策略的数学建模:从静态 Batching 到 Continuous Batching 的吞吐分析
  • 【会员专享数据】1979—2025年中国5km分辨率逐年土壤湿度指数栅格数据
  • 音乐文件NCM怎么改成MP3?网易云歌曲ncm格式转换mp3方法
  • 设计 Token 自动同步:别让颜色停在设计稿里
  • 机器学习数据预处理:标签编码与连续变量处理实战
  • 大数据毕业设计选题指南:技术前沿与实战要点
  • 代价函数:业务价值的数学编码与实战设计指南
  • 用 AI 工具提升刷题效率:实验要有指标,别只看爽感