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

FPGA基础 -- Verilog 系统任务与系统函数

一、系统任务与系统函数定义与区别

特性系统任务(System Tasks)系统函数(System Functions)
调用方式task_name(参数);(带分号)= function_name(参数)(可赋值)
是否返回值❌ 不返回值✅ 返回一个值
使用场景多用于显示、文件IO、调试等用于计算表达式,如数学运算、位操作等
语法关键词无关键字标识,但以 $ 开头同样以 $ 开头
是否可综合🚫 一般不可综合(仅用于仿真)✅ 部分可综合(如 $clog2

二、系统任务详解(System Tasks)

系统任务主要用于仿真阶段的输出显示、仿真控制、文件操作、时间管理等,常见如下:

1. 显示类任务(调试输出)

任务名用途示例
$display打印内容,末尾自动换行$display("count = %d", cnt);
$monitor打印变量变化(全程监控)$monitor("a=%b, b=%b", a, b);
$strobe延迟到当前时间最后打印$strobe("final value = %d", x);
$write类似于 display,但不自动换行$write("cnt = %d", cnt);

🚫 注意:这些语句不可综合,仅用于仿真调试


2. 仿真控制任务

任务名用途
$stop暂停仿真,进入仿真器交互界面
$finish终止仿真
$time返回当前仿真时间(单位为时间步)
$dumpvars保存变量波形(VCD 文件)

3. 文件I/O任务(File I/O)

integer f;
initial beginf = $fopen("output.txt", "w");$fdisplay(f, "data = %d", data);$fclose(f);
end
函数名功能
$fopen打开文件,返回句柄
$fdisplay向文件中写入,自动换行
$fwrite写入但不换行
$fclose关闭文件

三、系统函数详解(System Functions)

系统函数通常用于计算、返回值的语句中,以 $ 开头,可嵌入表达式中使用。

1. 常用函数(用于仿真)

函数名用途示例
$time返回当前仿真时间(实数)t_now = $time;
$random产生一个 32-bit 伪随机数rand_val = $random(seed);
$itorint 转 realr = $itor(5);
$rtoireal 转 inti = $rtoi(3.14);

2. 可综合系统函数

以下函数在 RTL 设计中被广泛使用且通常可综合:

函数名功能说明说明示例
$clog2(x)求 log₂(x) 的上取整,用于总线宽度估算localparam WIDTH = $clog2(DEPTH);
$signed(expr)强制表达式为有符号a = $signed(b + c);
$unsigned(expr)强制表达式为无符号a = $unsigned(b);

四、使用示例(综合应用)

module top;reg [7:0] data;integer f;initial begin$display("Simulation start");f = $fopen("log.txt", "w");for (data = 0; data < 10; data = data + 1) begin$display("data = %d", data);$fdisplay(f, "data = %d", data);#10;end$fclose(f);$finish;end
endmodule

五、注意事项与限制

❌ 不可综合部分

  • 凡是 $display, $monitor, $random, $finish 等仿真相关的任务函数不可综合
  • 可综合函数如 $clog2 在不同综合工具中(Vivado、Quartus)支持略有不同,需查阅综合支持文档。

✅ 可综合函数使用建议

  • 在参数计算中建议使用 $clog2 配合 localparam
  • $signed()$unsigned() 明确表达式符号,有助于逻辑正确性和代码移植性。

六、在项目中的实践建议

场景建议
模块仿真验证使用 $display$monitor$dumpvars 进行调试输出
总线宽度自动估计使用 $clog2 定义参数宽度
Testbench 随机性测试使用 $random 生成激励
多模块波形抓取使用 $dumpfile, $dumpvars 控制仿真波形记录
http://www.lqws.cn/news/443413.html

相关文章:

  • 嘉立创EDA学习笔记4
  • 集合的处理:JDK和Guava孰强孰弱?
  • C#建立与数据库连接(版本问题的解决方案)踩坑总结
  • docker 目录更改,必须做数据迁移才能启动
  • 输入url之后发生了什么
  • Python-循环结构解析
  • Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原
  • oracle通过dblink 连接pg数据库
  • 使用 Prometheus 访问 TDengine ---
  • OpenCV——直方图与匹配
  • Postman 的 Jenkins 管理 - 手动构建
  • OpenCV指定pid和vid通过MSMF打开摄像头
  • Spring AOP @Before (前置通知): 在目标方法执行前做什么?
  • 智能家居HA篇 二、配置Home Assistant并实现外部访问
  • android 省市区联动选择
  • 计算机视觉阶段一:CV入门基础
  • Xsens动作捕捉技术用于研究机器人的运动控制、姿态调整以及人机交互
  • .NET 的配置系统
  • 【Mini-F5265-OB开发板试用测评】2、PWM驱动遥控车RX2接收解码带马达驱动控制IC
  • 华为OD机试_2025 B卷_构成正方形数量(Python,100分)(附详细解题思路)
  • 如何获取Java对象的大小
  • MQTT 消息队列传输协议(Message Queuing Telemetry Transport)
  • 【深度学习】生成对抗网络(GANs)深度解析:从理论到实践的革命性生成模型
  • 优化 Python 爬虫性能:异步爬取新浪财经大数据
  • 46道Jenkins高频题整理(附答案背诵版)
  • Jenkins通过Pipeline流水线方式编译Java项目
  • IP 地理库的使用指南:从基础应用到深度实践​
  • Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)
  • IntersectionObserver API应用场景示例代码详解
  • 医疗低功耗智能AI网络搜索优化策略