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

Verilog基础:$fopen和$fclose系统函数、任务的使用

相关阅读

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


$fopen$fclose是Verilog中用于打开文件关闭文件的系统函数、系统任务。它们是 Verilog文件I/O的基础接口,在测试激励读取、仿真日志输出、结果保存等场景中都非常常用。其中,$fopen被称为系统函数,是因为它会返回一个文件句柄;而$fclose被称为系统任务,是因为它本身不返回值。

在最初的Verilog-1995标准中,仿真器一次最多只能同时打开32个文件。这时所使用的文件句柄被称为多通道描述符,即MCD(Multi-Channel Descriptor)。MCD的表示方式比较特殊。它使用一个32位整数中的某一位来代表一个已打开的文件,形式上有些类似于“独热码”。也就是说,每打开一个文件,就相当于把某一个比特位置为1,从而用这个32位值来表示对应的文件句柄。MCD的一个特点是:多个句柄可以按位或运算组合在一起。组合后的结果就可以同时表示多个已打开的文件。这样一来,用户只需要用一条输出语句操作这个组合句柄,就能够把相同内容同时写入多个文件。不过,MCD也有明显局限。它主要只支持以下几个系统任务将数据输出到文件中:$fdisplay$fwrite$fstrobefmoniter。也就是说,MCD的能力基本局限于文件输出,并不支持文件输入这类更灵活的操作。

在Verilog-1995标准中,这32个可同时打开的文件中,还包括一个预先打开的标准输出文件STDOUT。也就是说,用户实际可自由分配的文件数量通常还不到32个。这在验证工作中会带来一定限制。因为在一些较复杂的测试环境中,工程师可能需要同时打开多个输入文件、多个日志文件,甚至还要分别记录不同模块的输出结果,这时31个左右的文件数量很容易不够用。除此之外,当时文件输入功能也比较弱。很多情况下,只能通过$readmemb$readmemh之类的方式,把文件内容读入存储器数组中,而不能像后来的标准那样使用更通用、更灵活的文件读写接口。

到了Verilog-2001标准,文件I/O功能得到了明显增强。此时文件句柄被分成了两类:MCD(Multi-Channel Descriptor)和FD(File Descriptor)。这两类句柄都使用32位数值表示,但可以通过最高位进行区分。对于MCD,最高位为0。因此,它只能使用低31位来表示文件句柄,并且仍然主要用于只写方式打开文件。这里面同样包括预先打开的STDOUT。MCD保留了按位组合的优势,也就是说,多个MCD句柄仍然可以进行按位或,从而实现一次操作多个文件的能力。对于FD,最高位为1。其低31位用于标识具体文件。与MCD不同的是,FD不再采用独热码的方式,因此它不具备多个句柄按位组合后同时操作多个文件的能力。但作为交换,FD获得了更强的通用性。由于不再依赖独热码,它理论上可以表示2^31个文件句柄。当然,这里面也包括三个预先打开的标准文件:STDIN、STDOUT和STDERR。FD的优势在于它支持更丰富的打开模式,例如:只读、只写、读写、追加。因此,FD更适合进行通用的文件输入输出操作。这几种标准句柄的典型值如下:MCD的STDOUT句柄:32'h0000_0001;FD的STDIN句柄:32'h8000_0000;FD的STDOUT句柄:32'h8000_0001;FD的STDERR句柄:32'h8000_0002。顺带一提,当文件以写方式打开时,如果目标文件不存在,一般会自动创建该文件。

从语法上看,$fopen用于打开文件,$fclose用于关闭文件。上图是$fopen$fclose的BNF范式语法。其中,$fopen是否返回MCD还是FD,取决于调用时是否指定了打开类型type:不指定type时,通常返回MCD;指定type时,通常返回FD。这里的file_name表示要打开的文件名。文件名既可以写成字符串常量,也可以放在字符串变量中。文件路径既可以使用:绝对路径(从根目录开始,通常以/开头)和相对路径(通常以./或../开头,其中./往往可以省略)。这里所谓的相对路径,是相对于仿真器当前工作目录而言的,而不是相对于源码文件所在目录。

FD打开文件的type如下表所示。

当使用FD打开文件时,可以通过type指定文件打开方式。常见模式包括:r(只读)、w(只写)、a(追加)、r+(读写)、w+(读写,通常会覆盖原内容)、a+(读写追加)。此外,还可能看到带b的形式,例如:rb、wb、ab、r+b、rb+。这里的b用于区分二进制文件和文本文件。不过,需要注意的是,并不是所有操作系统都会严格区分文本文件和二进制文件。例如在很多UNIX系统中,b往往会被忽略;但在某些系统中,例如Windows平台,二进制模式和文本模式在读写时可能存在差异,因此b仍然有实际意义。

当以读模式打开文件时,例如r、rb、r+、r+b、rb+等,如果出现以下情况:

  • 文件不存在
  • 当前权限不允许打开
  • 文件路径错误
  • 其他文件系统错误

那么$fopen会返回0,无论调用期望得到的是MCD还是FD,失败时都返回0。当出现这类错误时,可以配合使用$ferror来获取最近一次文件操作的错误信息,从而方便定位问题。

$fclose用于关闭一个已经打开的MCD或FD。一旦文件被$fclose关闭,就不能再继续通过这个句柄对文件进行输入或输出操作。换句话说,被关闭的文件句柄将失效,后续若仍然使用它进行读写,通常会导致错误或无效操作。此外,$fclose还有一个容易被忽略的作用:如果之前对某个文件句柄或多通道描述符使用了$fmonitor$fstrobe之类的监控输出,那么在执行$fclose后,这些监控行为也会被隐式取消。同时,关闭文件以后,对应通道资源会被释放,之后$fopen可以重新使用这些已经关闭的通道。

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

相关文章:

  • 鸿蒙游戏 UI 怎么设计才不乱?
  • RepDistiller核心原理深度解析:对比表示蒸馏(CRD)如何超越传统方法
  • 从天气预报接口到RESTful API测试:手把手用C# HttpClient造一个‘万能’HTTP调试工具
  • 7.【UPF】UPF Power Shutoff(UPF电源关断)
  • 别再死记硬背公式了!用Python的PuLP库手把手教你推导线性规划对偶问题
  • 去标签化无感定位技术突破,黎阳之光重构空间定位技术路径
  • 从构建到编译:CMake、Make、MinGW、Clang、LLVM、GCC、MSVC的生态位与协作全景
  • Tmux:终端复用器的基本使用(三)
  • 如何解决Blender相机动画的僵硬感?Camera Shakify插件深度解析
  • PX4结合YOLO实现仿真环境下的动态目标检测
  • 手把手教你用Python实现简易视线追踪系统(基于MPIIGaze数据集)
  • WechatBakTool:微信聊天记录备份恢复的终极解决方案
  • 最新感知算法论文分析:RaCFormer 如何提升雷达相机 3D 目标检测性能?
  • 从数据到发现:如何利用Materials Project数据库加速你的新材料研究?
  • Innovus实战:从Tap Cell到Spare Cell,手把手教你搞定数字后端那些‘不起眼’的物理单元
  • 如何使用Poem框架MCP服务器构建高效AI工具集成平台
  • STM32 HAL库实战:1.3寸OLED屏驱动全解析(附软件IIC避坑指南)
  • Android数据管理终极教程:Coursera-android教你5种存储方案
  • 从一次通话失败说起:深入排查CSFB信令中的那些‘隐藏’配置项(附参数详解)
  • 如何永久保存微信聊天记录:WeChatMsg完整备份指南让你的珍贵记忆永不丢失
  • 三步解锁QQ音乐加密音频:qmcdump让你的音乐随处可听
  • 深入解析PowerPC P2040的启动机制与DPAA架构优化
  • 告别Keil破解!用STM32CubeIDE + HAL库点亮你的第一颗LED(STM32F103C8T6保姆级教程)
  • ESP32开发实战:Vscode+PlatformIO与Arduino第三方库管理机制深度对比
  • 融合混沌初始化与自适应权重的PSO算法在机械臂时间最优轨迹规划中的应用
  • 告别版本冲突:基于Python3.9虚拟环境精准部署numpy、tensorflow与matplotlib兼容组合
  • 【STM32H743IIT6】引脚复用全解析:从数据手册图表到实战配置
  • 【ADRC自适应模糊控制】移动机器人轨迹跟踪 MATLAB源码
  • OpenIPC固件在君正T31ZX平台上的烧录问题深度解析
  • 【2026年最新600套毕设项目分享】智慧旅游平台开发微信小程序(30073)