当前位置: 首页 > 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.lryc.cn/news/572140.html

相关文章:

  • angular 图斑点击,列表选中并滚动到中间位置
  • 探索算法秘境:量子随机游走算法及其在图论问题中的创新应用
  • Python 自动化运维与DevOps实践
  • JVM(7)——详解标记-整理算法
  • 基于YOLOv10算法的交通信号灯检测与识别
  • RTSP播放器低延迟实践:一次对毫秒级响应的技术探索
  • 从零开始的云计算生活——第二十天,脚踏实地,SSH与Rsync服务
  • ThinkPHP结合使用PHPConsole向Chrome 控制台输出SQL
  • 计算机网络 网络层:数据平面(一)
  • ​ CATIA V5与3DEXPERIENCE协同设计:引领无人机行业新纪元
  • 【无人机实时拼图框架(正射影像)论文翻译】OpenREALM: Real-time Mapping for Unmanned Aerial Vehicles
  • 14.8 AI写作核心技术解析:四阶段分层提示工程如何实现从大纲到风格的全流程优化
  • RPC - Response模块
  • 2025年通信安全员考试题库及答案
  • JVM(6)——详解标记-清除算法
  • 安卓vscodeAI开发实例
  • 安卓JetPack篇——Livadata
  • 无人机电机模块技术分析
  • Vue-11-前端框架Vue之应用基础父组件传值到子组件props的使用
  • 破局基建困局:国有平台公司数字化转型的生态重构
  • Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)
  • 华为网路设备学习-25(路由器OSPF - 特性专题 二)
  • CSS语法中的选择器与属性详解
  • day42-硬件学习之温度传感器及(ARM体系架构)
  • AR/VR显示为何视场受限?OAS对标波导案例来解决
  • 【跨界新视野】信号处理遇上VR/AR:下一代沉浸体验的核心技术与您的发表蓝海
  • C++实现异步(重叠)管道通信
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • ③-1实现 FastAdmin 默认开启通用搜索功能的方法
  • 教学的新革命!大模型生成讲解,Manim 打造动画视频