FPGA第 11 篇,Verilog 系统函数( Verilog 中的系统函数)

news2024/11/18 14:25:42

前言

Verilog 作为一种强大的硬件描述语言,不仅提供了用于设计和仿真数字电路的基础语法,还包含了丰富的系统函数,帮助我们高效地完成复杂的硬件操作。系统函数是 Verilog 语言中预定义的特殊函数,通常以 $ 开头,它们涵盖了多种用途,如仿真控制、数据转换、数学运算、时间获取和显示信息等。

系统函数在硬件设计和验证过程中发挥了不可或缺的作用。例如,我们可以通过系统函数方便地输出仿真信息、执行复杂的数学运算或获取仿真时间。常见的 Verilog 系统函数包括 $display 用于信息输出,$monitor 用于实时监控信号变化,$time 获取仿真时间,以及 $random 生成随机数。

通过灵活应用这些系统函数,我们能够简化代码,增强可读性,并提高调试效率。在硬件开发和验证过程中,充分利用 Verilog 提供的系统函数将大大提升设计的效率和可靠性。掌握这些开发技巧,我们可以高效地设计和验证 FPGA 电路,从而实现所需的数字系统功能。之前介绍了 Verilog 中的运算符和分支语句,请看,

Verilog 中的运算符和分支语句icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/141829820?spm=1001.2014.3001.5502

这里我们来分享一下 Verilog 中的系统函数,记录一下


一. 分类介绍

1. Verilog 系统函数分类

        Verilog 系统函数(System Functions)通常以 $ 开头,并用于执行各种标准操作,例如格式化输出、仿真控制、时间管理等。Verilog-2001 标准定义了几十个系统函数,这些函数大致可分为以下几类:

  1. 显示相关函数
  2. 仿真时间相关函数
  3. 文件输入输出相关函数
  4. 数学函数
  5. 随机函数
  6. 仿真控制函数


二. 分类详细

1. 显示(Display)相关函数

(1)函数介绍

这些函数用于在仿真过程中输出信息,类似于 C 语言中的 printf

函数名功能用法
$display输出一行文字并自动换行$display(格式字符串, 参数1, 参数2, ...)
$write输出一行文字但不换行$write(格式字符串, 参数1, 参数2, ...)
$strobe输出信号值,在当前时间步之后再显示$strobe(格式字符串, 参数1, 参数2, ...)
$monitor监控变量值的变化并输出$monitor(格式字符串, 参数1, 参数2, ...)
$stop停止仿真$stop
$finish结束仿真$finish

(2)代码示例

module display_example;
    reg [7:0] a = 8'd15;
    reg [7:0] b = 8'd25;

    initial begin
        // 输出一行文字并自动换行
        $display("a=%0d, b=%0d", a, b);  // 输出: a=15, b=25

        // 输出一行文字但不换行
        $write("a=%0d", a);  // 输出: a=15
        $write(", b=%0d", b);  // 输出: , b=25

        // 输出信号值,在当前时间步之后再显示
        $strobe("a=%0d, b=%0d", a, b);  // 输出: a=15, b=25 (在当前时间步之后)

        // 监控变量值的变化并输出
        $monitor("a=%0d, b=%0d", a, b);  // 每次 a 或 b 变化时都会输出
    end
endmodule

2. 仿真时间相关函数

(1)函数介绍

这些函数用于获取仿真时间和延迟操作。

函数名功能用法
$time返回当前仿真时间,单位为 timescale 设定$time
$stime返回当前仿真时间(32位整型)$stime
$realtime返回当前仿真时间,精度为实数$realtime
$realtobits实数转换为位模式$realtobits(实数)
$bitstoreal位模式转换为实数$bitstoreal(位模式)

(2)代码示例

module time_example;
    reg [7:0] a = 8'd15;

    initial begin
        #10;  // 延迟 10 时间单位
        // 输出当前仿真时间
        $display("Current simulation time: %0t", $time);  
// 输出: Current simulation time: 10

        // 输出当前仿真时间(32位整型)
        $display("Current simulation time (32-bit): %0d", $stime);  
// 输出: Current simulation time (32-bit): 10

        // 输出当前仿真时间,精度为实数
        $display("Current simulation time (real): %0f", $realtime);  
// 输出: Current simulation time (real): 10.000000

        // 实数转换为位模式
        real real_val = 3.14;
        reg [31:0] bits;
        bits = $realtobits(real_val);
        $display("Bits representation of real value: %h", bits);  
// 输出: Bits representation of real value: 4048f5c3

        // 位模式转换为实数
        real new_val;
        new_val = $bitstoreal(bits);
        $display("Real value from bits: %0f", new_val);  
// 输出: Real value from bits: 3.140000
    end
endmodule

3. 文件输入输出相关函数

(1)函数介绍

用于从文件中读取或向文件中写入数据。

函数名功能用法
$fopen打开文件,返回文件句柄integer file = $fopen("filename", "mode");
$fclose关闭文件$fclose(文件句柄);
$fdisplay向文件写入数据并换行$fdisplay(文件句柄, 格式字符串, 参数1, 参数2)
$fwrite向文件写入数据不换行$fwrite(文件句柄, 格式字符串, 参数1, 参数2)
$fscanf从文件中读取格式化数据$fscanf(文件句柄, 格式字符串, 参数1, 参数2)

(2)代码示例

module file_io_example;
    reg [7:0] a = 8'd15;
    integer file;

    initial begin
        // 打开文件以写入模式
        file = $fopen("output.txt", "w");

        // 向文件写入数据并换行
        $fdisplay(file, "a=%0d", a);  
// 将 "a=15" 写入 "output.txt"

        // 向文件写入数据不换行
        $fwrite(file, "Value of a is %0d", a);  
// 将 "Value of a is 15" 写入 "output.txt"

        // 关闭文件
        $fclose(file);
    end
endmodule

4. 数学函数

(1)函数介绍

用于执行一些常见的数学运算。

函数名功能用法
$clog2返回大于等于输入值的最小对数2值$clog2(值)
$ln自然对数$ln(值)
$log1010为底的对数$log10(值)
$exp指数函数,返回 e 的 x 次幂$exp(值)
$sqrt返回平方根$sqrt(值)
$pow幂运算,返回 x 的 y 次幂$pow(基数, 指数)

(2)代码示例

module math_functions_example;
    real num = 4.0;
    real result;

    initial begin
        // 计算对数2
        $display("clog2 of 16: %0d", $clog2(16));  
// 输出: clog2 of 16: 4

        // 计算自然对数
        $display("Natural log of 2.718: %0f", $ln(2.718));  
// 输出: Natural log of 2.718: 0.999

        // 计算10为底的对数
        $display("Log base 10 of 1000: %0f", $log10(1000));  
// 输出: Log base 10 of 1000: 3.000

        // 计算指数
        $display("Exp of 1: %0f", $exp(1));  
// 输出: Exp of 1: 2.718

        // 计算平方根
        $display("Square root of 16: %0f", $sqrt(16));  
// 输出: Square root of 16: 4.000

        // 计算幂运算
        result = $pow(2, 3);
        $display("2^3: %0f", result);  // 输出: 2^3: 8.000
    end
endmodule

5. 随机函数

(1)函数介绍

用于生成随机数,常用于测试仿真。

函数名功能用法
$random返回一个随机数integer r = $random;
$urandom返回一个无符号随机数integer ur = $urandom;
$urandom_range返回一个在指定范围内的无符号随机数integer ur = $urandom_range(下限, 上限);

(2)代码示例

module random_functions_example;
    integer r;
    integer ur;
    integer ur_range;

    initial begin
        // 生成一个随机数
        r = $random;
        $display("Random number: %0d", r);  
// 输出: Random number: <随机值>

        // 生成一个无符号随机数
        ur = $urandom;
        $display("Unsigned random number: %0d", ur);  
// 输出: Unsigned random number: <随机值>

        // 生成一个在指定范围内的无符号随机数
        ur_range = $urandom_range(1, 10);
        $display("Random number between 1 and 10: %0d", ur_range);  
// 输出: Random number between 1 and 10: <随机值>
    end
endmodule

6. 仿真控制函数

(1)函数介绍

用于控制仿真的执行。

函数名功能用法
$stop暂停仿真,进入交互式调试模式$stop;
$finish结束仿真并关闭模拟器$finish;

(2)代码示例

module simulation_control_example;
    initial begin
        // 暂停仿真,进入交互式调试模式
        $stop;  // 仿真将暂停,用户可以检查当前状态

        // 结束仿真并关闭模拟器
        $finish;  // 仿真将结束
    end
endmodule

这些只是 Verilog 中的一些常见系统函数,还存在其它一些更高级的系统任务或函数。学习编程语言还得多写多练,下面持续分享记录。

创作不易,感觉有用,就一键三连,感谢(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】(7)--神经网络之保存最优模型

文章目录 保存最优模型一、两种保存方法1. 保存模型参数2. 保存完整模型 二、迭代模型 总结 保存最优模型 我们在迭代模型训练时&#xff0c;随着次数初始的增多&#xff0c;模型的准确率会逐渐的上升&#xff0c;但是同时也随着迭代次数越来越多&#xff0c;由于模型会开始学…

今日不错的讲企业架构的好图

今日不错的讲企业架构的好图&#xff0c;来源B站不错的UP主&#xff1a;企业架构知识体系-业务技术管理的知识框架_哔哩哔哩_bilibili

grafana频繁DataSourceError问题

背景 随着 Grafana 数据量的不断增加&#xff0c;逐渐暴露出以下问题&#xff1a; Grafana 页面加载缓慢&#xff1b;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题&#xff0c;大家可以参考这篇文章&#xff1a;Grafana 加载缓慢的解决方案。 不过&#xf…

【Unity踩坑】Textmesh Pro是否需要加入Version Control?

问题&#xff1a;如果Unity 项目中用到了Textmesh pro&#xff0c;相关的文件是否也需要签入呢&#xff1f; 回答&#xff1a; 在使用 Unity 的 Version Control&#xff08;例如 Plastic SCM 或 Git&#xff09;时&#xff0c;如果你的项目中使用了 TextMesh Pro&#xff0c…

条件字段有索引,为什么查询也这么慢?

如果我们想在某一本书中找到特定的主题&#xff0c;一般最快的方法是先看索引&#xff0c;找到对应的主题在哪个页码。 而对于 MySQL 而言&#xff0c;如果需要查找某一行的值&#xff0c;可以先通过索引找到对应的值&#xff0c;然后根据索引匹配的记录找到需要查询的数据行。…

家政服务预约系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;客户管理&#xff0c;员工管理&#xff0c;家政服务管理&#xff0c;服务预约管理&#xff0c;员工风采管理&#xff0c;客户需求管理&#xff0c;接单信息管理 微信端账号功能包括&#xff1a;系统首…

Java | Leetcode Java题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution {public Node flatten(Node head) {dfs(head);return head;}public Node dfs(Node node) {Node cur node;// 记录链表的最后一个节点Node last null;while (cur ! null) {Node next cur.next;// 如果有子节点&#xff0…

后端(实例)08

设计一个前端在数据库调取数据的表格&#xff0c;并完成基础点击增删改查的功能&#xff1a; 1.首先写一个前端样式&#xff08;空壳&#xff09; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here&l…

VUE条件树查询

看如下图所示的功能&#xff0c;是不是可高级了&#xff1f;什么&#xff0c;你没看懂&#xff1f;拜托双击放大看&#xff01; 是的&#xff0c;我最近消失了一段时间就是在研究这个玩意的实现&#xff0c;通过不懈努力与钻研并参考其他人员实现并加以改造&#xff0c;很好&am…

人工智能时代的网络空间战略稳定及其挑战

文章目录 前言一、人工智能时代的网络空间战略稳定及其挑战(一)国内政治与官僚主义二、大国竞争与溯源政治三、国际法规与治理限制总结前言 人工智能的武器化应用在短期内将同时强化网络空间中进攻方和防御方的能力,但从长期看将有利于防御方。这种态势将令传统威慑逻辑重新…

[数据库实验三]安全性

目录 一、实验目的与要求&#xff1a; 二、实验内容&#xff1a; 三、实验小结 一、实验目的与要求&#xff1a; 1、设计用户子模式 2、根据实际需要创建用户角色及用户&#xff0c;并授权 3、针对不同级别的用户定义不同的视图&#xff0c;以保证系统的安全性 二、实验内…

Springboot jPA+thymeleaf实现增删改查

项目结构 pom文件 配置相关依赖&#xff1a; 2.thymeleaf有点类似于jstlel th:href"{url}表示这是一个链接 th:each"user : ${users}"相当于foreach&#xff0c;对user进行循环遍历 th:if进行if条件判断 {变量} 与 ${变量}的区别: 4.配置好application.ym…

【SemeDrive】【X9H】如何修改 SAFETY_FAULT 输出 PWM 频率

前言&#xff1a; SAFETY_FAULT 也是 SEM_FAULT&#xff0c;在原理图上会有不同的标注&#xff0c;但意义一样。 默认的 SAFETY_FAULT 正常时输出 PWM 频率为 100 MHz&#xff0c;过高的频率有时会导致无法通过 EMI 测试&#xff0c;需要降低频率。以下描述如何将正常时的 S…

ssh 命令详解

一、命令简介 ​ssh ​命令用于安全登录远程主机&#xff0c;以便在远程机上执行命令或传输数据。 ‍ 例如登录远程主机 169.10.222.23 ​上的 soulio ​用户&#xff1a; ssh soulio169.10.222.23更多示例参考第三章。 ‍ 了解背景知识&#xff1a;ssh 加密 1. 加密类型…

C++之Person类中调用Date类

main.cpp #include <iostream> #include "Person.h" using namespace std;int main() {Person myPerson;// Person myPerson("S.M.Wang", 070145, "莲花路200号");cout << "请输入姓名:" ;string name;cin >> name…

【文档智能 RAG】浅看开源的同质化的文档解析框架-Docling

前言 RAG的兴起&#xff0c;越来越多的人开始关注文档结构化解析的效果&#xff0c;这个赛道变得非常的同质化。 关于文档智能解析过程中的每个技术环节的技术点&#xff0c;前期文章详细介绍了很多内容&#xff1a; 下面我们简单的看看Docling这个PDF文档解析框架里面都有什…

尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)

目录&#xff1a; 自动化持续集成 &#xff08;1&#xff09;环境准备 &#xff08;2&#xff09;初始化 Jenkins 插件和管理员用户 &#xff08;3&#xff09;工作流程 &#xff08;4&#xff09;配置 Jenkins 构建工具 自动化持续集成 互联网软件的开发和发布&#xf…

AI:颠覆式创新 vs. 持续性创新

随着有关生成式人工智能 (GenAI) 的新闻不断出现在社交媒体上&#xff0c;包括 ChatGPT 4o 如何帮助你与朋友玩石头、剪刀、布&#xff0c;关于 GenAI 的“颠覆性”影响的惊人声明并不难找到。 事实证明&#xff0c;将 GenAI 本身称为“颠覆性”并没有多大意义。 它能成为颠覆…

libvirt中的qemu与kvm

在 libvirt 虚拟机管理中&#xff0c;domain_type 的设置决定了虚拟机使用的虚拟化技术。在 domain_type 中&#xff0c;qemu 和 kvm 是两种不同的虚拟化模式&#xff0c;它们的区别主要在于是否使用硬件虚拟化加速。 qemu 模式 定义&#xff1a;qemu 是一种完全软件模拟的虚…

Recorder录音插件使用日记

目录 一、安装插件 二、导入文件 1.app-xxx-support.js支持文件 2.RecordApp 三 功能的使用 3.1 请求录音权限 3.2 开始录音 3.3 停止录音 3.4 其他接口 四 、使用 4.1 开始录音实例 4.2 请求录音权限 4.3 停止录音——文件的下载与上传 一、安装插件 npm install…