【学习笔记】Verilog之五:任务、函数及其他

简介: 在Verilog HDL中,任务(tasks)和函数(functions)增强了代码的可读性和重用性。任务是仅在仿真环境中使用的可封装代码,不可综合为硬件电路。任务定义包括标识符、输入/输出声明和实现代码,调用时需提供参数列表。函数与任务类似,但返回单个值,不包含时序控制,并且可以互相调用。函数定义包括返回值范围、输入声明、变量声明和执行代码。系统任务和函数如 `$display` 和 `$fopen` 提供了显示信息、文件I/O等便利功能,用于仿真控制和调试。禁止语句和命名事件则帮助控制代码执行和事件同步。

5.1 任务

在Verilog HDL编程中,任务和函数的使用极大地提升了代码的可读性和可重用性,同时也提供了更高级的抽象能力。本章节将详细介绍Verilog中的任务定义、调用及相关语法概念。

任务是在Verilog中定义的一段可封装的代码,用于执行特定功能,通常只在仿真环境中使用,不可综合为硬件电路。

5.1.1 任务定义

任务的基本定义格式如下:

Verilog

task <task_name>;
    [input/output declarations]
    procedural_statements;
endtask

其中,是任务的标识符;input/output declarations用于声明任务的输入输出端口,以及可能使用的局部变量;procedural_statements则是实现任务功能的具体代码。

5.1.2 任务调用

任务的调用发生在initialalways语句中,调用格式为:

Verilog

<task_name>(<expr1>, <expr2>, ..., <exprN>);

这里,是被调用的任务名称,而, , ..., 是传递给任务的参数列表,参数的顺序和类型必须与任务定义中的端口声明一致。

示例:

Verilog

module TaskModule;

    parameter MAXBITS = 8;

    // 定义任务
    task Reverse_Bits;
        input [MAXBITS-1:0] Din;
        output [MAXBITS-1:0] Dout;

        integer K;
        begin
            for(K=0; K<MAXBITS; K=K+1)
                Dout[MAXBITS-K] = Din[K];
        end
    endtask

    // 使用任务
    reg [MAXBITS-1:0] Reg_X, New_Reg;

    initial begin
        Reverse_Bits(Reg_X, New_Reg);
    end

endmodule

在这个例子中,Reverse_Bits任务接收一个MAXBITS位的输入向量Din,并将它反转后输出到Dout。在initial语句中,Reg_X作为输入传递给任务,而任务的输出则保存在New_Reg中。

注意事项:

  • 任务的输出值只能在任务完全执行完毕后返回。
  • 任务调用中接收返回数据的变量必须是寄存器类型(reg)。
  • 调用任务时,可以访问任务所在模块中定义的任何变量。

通过上述内容,我们了解到Verilog中任务的定义与调用机制,以及如何利用任务来增强代码的模块化和可维护性。接下来的章节将进一步探讨Verilog中的函数定义及其它高级特性。




5.2 函数

函数在Verilog中扮演着关键角色,用于执行特定计算并返回单个值,与任务相比,它具有以下显著差异:

  • 函数仅能返回一个值,而任务可以有多重输出。
  • 函数调用时必须立即执行,不允许包含时序控制,而任务可以包含时序控制。
  • 函数可以调用其他函数,但不能调用任务,而任务可以调用其他任务或函数。
  • 函数至少需要一个输入参数,而任务可以没有输入。
5.2.1 函数定义

函数的定义格式如下:

Verilog

function [range] function_name;
    input input_declarations;
    other_declarations;
    procedural_statements;
endfunction

其中,range定义了函数返回值的取值范围,是可选的;function_name是函数的标识符;input_declarations声明函数的输入参数;other_declarations用于声明函数内部可能需要的变量;procedural_statements是函数执行的具体代码。

示例:

Verilog

module FunctionExample;
    parameter MAXBITS = 8;
    function [MAXBITS-1:0] ReverseBits;
        input [MAXBITS-1:0] din;
        integer k;
        begin
            for(k=0; k<MAXBITS; k=k+1)
                ReverseBits[MAXBITS-k] = din[k];
        end
    endfunction

endmodule

在这个例子中,ReverseBits函数接收一个MAXBITS位的输入向量din,并通过内部循环将输入向量的位进行反转,最终结果通过与函数同名的寄存器返回。

5.2.2 函数调用

函数调用的格式如下:

Verilog

1result = function_name(expr1, expr2, ..., exprN);

其中,function_name是被调用的函数名,expr1, expr2, ..., exprN是传递给函数的输入参数,参数顺序必须与函数定义中的输入声明相匹配。

示例:

Verilog

module FunctionCall;

    reg [7:0] new_reg, reg_x;

    initial begin
        new_reg = ReverseBits(reg_x);
    end

endmodule

FunctionCall模块中,new_reg接收了ReverseBits函数对reg_x进行位反转后的结果。

通过以上内容,我们深入了解了Verilog中的函数定义与调用机制,以及如何利用函数来实现数据处理和算法计算。函数与任务相结合,为Verilog设计提供了强大的模块化编程能力。





5.3 系统任务和函数

Verilog提供了丰富的预定义系统任务和函数,旨在简化仿真过程中的各种操作,涵盖显示、文件I/O、时间管理等多个方面。这些内置功能独立于硬件模型,主要用于仿真控制和调试。

5.3.1 显示任务

显示任务用于在仿真过程中输出信息,分为显示和写入任务、探测任务和监控任务三类。

  • 显示和写入任务:包括$display, $displayb, $displayo, $displayh用于显示信息,以及$write, $writeb, $writeo, $writeh用于写入信息而不换行。
    语法:task_name(format_specification, argument_list);
  • 探测任务$strobe, $strobeb, $strobeh, $strobeo用于在指定时间点输出信息,延迟到当前仿真周期结束时执行。
  • 监控任务$monitor, $monitorb, $monitorh, $monitroo用于连续监控信号变化,一旦检测到变化即输出当前值。
    语法:$monitor("At %t, D = %d, Clk = %d", $time, D, Clk);
    举例:initial $monitor("At %t, D = %d, Clk = %d", $time, D, Clk);
5.3.2 文件输入/输出任务

文件I/O任务允许与外部文件交互,包括文件的打开、关闭、读取和写入。

  • 文件的打开和关闭:使用$fopen$fclose
    语法:integer file_pointer = $fopen("file_name");
  • 输出到文件:所有显示、写入、探测和监控任务均有对应版本用于文件输出。
  • 从文件读取数据$readmemb用于读取二进制数据,$readmemh用于读取十六进制数据。
    语法:$readmemb("file_name", mem_name [,start_addr, finish_addr]);
5.3.3 时间标度任务

时间标度任务用于控制和获取仿真时间。

5.3.4 仿真控制任务
  • 仿真控制任务$finish$stop用于终止仿真进程。
5.3.5 时序验证任务

用于时序分析和验证。

5.3.6 仿真时间函数
  • 仿真时间函数$time, $stime, $realtime用于获取仿真时间信息。
5.3.7 实数变换函数

用于实数转换操作。

5.3.8 随机函数

用于生成随机数。

5.4 其他重要概念

5.4.1 禁止语句

用于控制代码的执行流程,防止特定语句执行。

5.4.2 命名事件

用于定义和引用事件,便于事件控制和同步。

通过上述内容,我们深入探讨了Verilog中系统任务和函数的丰富功能,以及它们在仿真和调试过程中的应用。这些工具不仅简化了开发流程,还提高了代码的可读性和可维护性。

相关文章
|
SQL 算法 前端开发
技术分享-动态脱敏
数据脱敏(Data Masking),又称数据混淆、数据漂白、数据去隐私化。用虚假的数据掩饰真实数据,以达到防止数据泄漏的目的。
1067 21
|
3月前
|
数据采集 Web App开发 文字识别
基于 Python 的反爬虫策略突破与逆向技巧总结
本文介绍四大常见反爬策略及Python应对方案:User-Agent伪装、代理IP绕过IP限制、Tesseract识别验证码、Selenium模拟浏览器获取动态数据,助你合法、高效采集网页信息。
287 22
|
3月前
|
监控 安全 数据可视化
人员定位软件系统从核心架构、关键功能、主流技术、典型应用与选型要点详解
人员定位软件系统以定位引擎与管理平台为核心,融合终端与网络,实现人员实时定位、安全管控及智能管理,适用于工厂、矿山、工地等场景,支持高精度定位、电子围栏、应急报警、考勤管理,并可集成视频监控等系统,提升安全与运营效率。如果您想进一步了解人员定位的案例,欢迎关注、评论留言~也可搜索lbs智能定位。
|
机器学习/深度学习 计算机视觉 知识图谱
YOLOv11改进策略【Conv和Transformer】| 上下文转换器CoT 结合静态和动态上下文信息的注意力机制 (含二次创新C3k2)
YOLOv11改进策略【Conv和Transformer】| 上下文转换器CoT 结合静态和动态上下文信息的注意力机制 (含二次创新C3k2)
459 10
YOLOv11改进策略【Conv和Transformer】| 上下文转换器CoT 结合静态和动态上下文信息的注意力机制 (含二次创新C3k2)
|
传感器 安全 自动驾驶
汽车智能网联时代如何解决用户隐私问题?
随着科技的飞速发展,伴随着汽车行业的数字化转型,智能网联已经成为了当前汽车发展的重要趋势。新时代的智能网联车辆不仅具备了传统汽车的功能,还配备了各种传感器、通信设备和计算能力,使它们能够实现自动驾驶、实时交通信息获取、远程诊断等功能。然而,随着智能网联汽车的普及以及智能化程度的提高,用户的隐私问题也逐渐凸显,引起广泛关注。那么,就让我们一起讨论一下智能网联汽车隐私保护的问题:
363 21
|
监控 前端开发 JavaScript
楼层导视软件
楼层导视软件通过直观的3D地图和精准的实时定位功能,帮助用户快速找到目的地,大大节省了时间和精力。
505 2
楼层导视软件
|
物联网 智能硬件
物联卡如何选择
选择物联卡需综合考量设备类型与数量、流量需求及卡种特性。明确设备属性后,挑选适宜流量套餐,并了解普通物联网卡、语音卡、NB-IoT卡及陶瓷卡等不同类型的应用场景。同时考虑网络覆盖、服务质量及成本预算,优选性价比高且售后服务完善的运营商,确保物联卡兼容设备并顺利完成实名认证。
物联卡如何选择
|
存储 JavaScript 前端开发
HarmonyOS 3.1/4.0应用升级到HarmonyOS NEXT改动点
在 “2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”(<https://coding.imooc.com/class/843.html>)视频课程中,因为讲师在该课程授课时是使用的HarmonyOS 3.1/4.0应用(API 9),如果部分学员采用了最新的HarmonyOS NEXT API,此时就会遇到API兼容性的问题。
679 1
HarmonyOS 3.1/4.0应用升级到HarmonyOS NEXT改动点
|
搜索推荐 数据可视化 数据挖掘
会展中心定位导航:精准展位指引,提升用户参馆体验,增加企业成交机会!
在数字化时代,会展中心借助物联网、大数据与AI技术,推出了智能定位导航系统,革新参会体验。展前通过线上展位预约和可视化招商地图,简化招商流程,提高展位分配效率。展会期间,利用精准定位技术,实现一键导航,同时提供个性化展位推荐,增强参观效率与满意度。系统还支持位置分享、车位检索等功能,并通过数据分析为决策提供支持,全面提升会展品牌形象与竞争力。
578 2
会展中心定位导航:精准展位指引,提升用户参馆体验,增加企业成交机会!
|
监控 安全 算法
室内定位导航技术:数字化时代的智能寻路解决方案
室内定位导航技术融合Wi-Fi、蓝牙信标及超宽带等技术,克服了GPS在室内的局限性。蓝牙信标作为关键组件,通过信号强度分析估算距离,结合三角定位算法确定位置。该技术不仅部署简便、成本低,还能提供准确稳定的定位服务。应用场景包括商场导航、医院科室指引、厂区资产管理、园区安全监控以及智能停车场等,极大提升了用户体验和管理效率。
1157 1
室内定位导航技术:数字化时代的智能寻路解决方案