0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从零开始学FPGA-Verilog语法基础(下)

电子工程师 来源:FPGA设计论坛 作者:FPG设计论坛 2021-03-14 10:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

零基础FPGA-Verilog语法下

9、关于任务和函数的小结,挑几点重要的说一下吧

(1)任务具有多个输入、输入/输出和输出变量,在任务重可以使用延迟、事件和时序控制结构,在任务重可以调用其它任务和函数。与任务不同,函数具有返回值,而且至少要有一个输入变量,而且在函数中不能使用延迟、事件和时序控制结构,函数可以条用函数,但是不能调用任务。

(2)在声明函数时,系统会自动的生成一个寄存器变量,函数的返回值通过这个寄存器返回到调用处。

(3)函数和任务都包含在设计层次中,可以通过层次名对他们实行调用。这句话什么意思啊? 10、系统任务 (1)$diplay和$write任务 $display任务相当于C语言里的printf,用于输出信息,他的基本格式$display (p0,p1,p2);意思就是把p1、p2以p1的格式输出,至于具体格式,C语言里面讲的很清楚,下面用一张图帮大家回忆一下

a01bac10-8434-11eb-8b86-12bb97331649.jpg

a05666c0-8434-11eb-8b86-12bb97331649.jpg

此外,在display中,输出列表中的数据的现实宽度总是按照自动输出格式进行调整的。因此,我们通常在%和表示进制的符号之间加一个0来确保总是用最少的位数来表示表达式的当前值。 例如 begin r1=10; $display(“size=%d=%h”,r1,r1); $display(“size=%0d=%0h”,r1,r1); 输出结果分别为 10,00a和10,a 所以在以后写程序时,为了养成良好习惯,应该注意加上0来保证代码的可读性。

如果输出的列表中含有不定值或者高阻态时,要遵循下列情况

(1)如果按10进制输出 如果输出列表全部为不定值,则输出为小写x;

如果输出列表部分为不定值,则输出为大写X;

如果输出列表全部为高阻态,则输出为小写的z;

如果输出列表部分为高阻态,则输出为大写的Z;

(2)如果按十六进制或者8进制输出

那么十六进制对应的四位或者8进制对应的3位中,如果部分是高阻态或者是不定值,那么输出结果为大写的Z或者X否则就输出小写的z或者x; 例如

a064f898-8434-11eb-8b86-12bb97331649.jpg

(2)$monitor

系统任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能,其参数列表中输出控制格式字符串和输出列表的规则和$display一样,当启动一个带有一个或者多个的$monitor任务时,仿真器则创立一个仿真机制,使得每当参数列表中的表达式或值发生变化时,整个参数列表中的变量或者表达式的值都将输出显示,如果在同一时刻,两个或者多个参数的值发生变化,则在这时刻只输出显示一次,但在$monitor任务中,参数可以是$time系统函数,这样参数列表中变量或者表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出来显示。例如

a0b651ca-8434-11eb-8b86-12bb97331649.jpg

$monitoron和$monitoroff的功能就是通过打开或者关闭监控标志来控制监控任务$monitor的启动和停止。这样可以使得程序员很容易的控制$monitor什么时候执行了。

(3)时间度量系统函数$time 在verilog hdl语法中有两种时间度量系统函数,分别是$time和$realtime,用这两个系统函数可以得到当前的仿真时刻。$time可以返回一个64位的值来记录当前的仿真时刻。 (4)$finish 系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。格式是 $finish或者$finish(1);如果不带参数,则默认参数为1,下面是具体参数下系统输出的特征信息。

0 不输出任何信息

1 输出当前仿真时刻和位置

2 输出当前仿真时刻、位置和在仿真过程中所用memory及CPU时间的统计。

(4)系统任务$stop $stop任务作用是把EDA工具置成暂停模式,在仿真环境下给出一个交互式的命令操作符,将控制权交给用户。这个任务可以带有参数表达式,根据参数值(0、1、2)的不同,输出不同的信息,参数值越大,输出信息越多。

(5)系统任务$random

这个系统函数提供了一个产生随机数的手段,当函数被占用时返回一个32位的随机数,它是一个带符号的整形数。

下面是一个产生随机数的例子

reg[23:0] rand;

rand=$random %60;

上面的例子产生一个-59到59之间的随机数,所以$random的用法是产生一个(-b+1)到(b-1)之间的随机数。

下面的例子通过并位产生一个值在0—59之间的随机数

reg[23:0 rand];

rand = {$random} %60; 利用这个系统函数可以产生随机脉冲序列或宽度随机的脉冲序列,用于电路的测试。

下面是个产生随机脉冲序列的例子

a3efb43a-8434-11eb-8b86-12bb97331649.jpg

a42a94d8-8434-11eb-8b86-12bb97331649.jpg

(6)关于编译预处理 编译预处理这部分和C语言差不多,主要用到的是`define、`include、和时间尺度`timescale `define 就是宏定义,在C语言了用的也比较多,在verilog中灵活的使用宏定义可以增加程序的可读性,又方便修改。例如在声明一个8位寄存器时用宏定义 `define WINDOWS 8 module reg [1:`WINDOWS] date; …… 习惯上一般宏定义的内容用大写字母表示,这里的WINDOWS就代表数字8,在下面的程序中调用WINDOWS时加个 `,表示调用,这样宏定义的好处就是,在大的程序中如果想改变寄存器的大小,可以直接改数字8为16,这样,所有的WINDOWS都变成了16,这样改一个就可以改变所有的,给程序员带来了方便。 对于`include,C语言里用的比较多这里就不在多提,主要是模块化编程思想的应用,这个很重要,练好模块化编程,可以大大提高程序的可读性和可移植性,也使修改程序变得更加方便。 对于`timescale,就是一个时间尺度,C语言里面没有,这里说一下。 `timescale 包括两部分,一部分是时间单位,一部分是时间精度,下面举个例子

a45d56b6-8434-11eb-8b86-12bb97331649.jpg

在这个例子中,时间单位是10ns,时间精度是1ns,这里d=1.55,也就是说d等于1.55乘10纳秒,也就是15.5纳秒,再看时间精度是一纳秒,四舍五入就是16纳秒,所以在16纳秒时,set置零,32纳秒时set置一。

小结 (1)、在多模块调试的情况下,$monitor需配合$monitoron和$monitoroff来使用。

(2)、$monitor和$diplay的区别在于$monitor是连续监视数据的变化,因而往往只要在测试模块的initial块中调用一次就可以监控被测模块中所有感兴趣的信号不需要,也不能在always块中调用$monitor.

(3)、$time常在$monitor中作时间标记

(4)、$stop 和 $finish 常用在测试模块的initial块中,配合时间延迟用来控制仿真的持续时间。

(5)、$random在编写程序是非常有用的,可以用来产生边沿不稳定的波形和随机出现的脉冲。正确的使用它能有效的发现设计中出现的问题。

(6)、$readman在编写测试程序时很有用,可以用来生成给定的复杂数据流。复杂数据可以用C语言产生,存在文件中。用$readman取出存入存储器,再按节拍输出这在验证算法逻辑电路中特别有用。

(7)、在用`timescale时要注意当多个带不同`timescale定义的模块包含在一起时,只有最后一个才起作用,所以属于一个项目,但`timescale定义不同的多个模块最好分开编译,以免把时间单位搞混。

(8)、宏定义字符串和include引用时,不要忘记用“`”这个标号。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22283

    浏览量

    630183
  • 寄存器
    +关注

    关注

    31

    文章

    5588

    浏览量

    129051
  • 仿真器
    +关注

    关注

    14

    文章

    1048

    浏览量

    86757

原文标题:零基础学FPGA-Verilog语法下

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    直播预约 |开源芯片系列讲座第30期:“一生一芯”计划——从零开始设计自己的RISC-V处理器芯片

    鹭岛论坛开源芯片系列讲座第30期「“一生一芯”计划从零开始设计自己的RISC-V处理器芯片」11月17日(周三)20:00精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目“一生一芯”计划
    的头像 发表于 11-10 12:03 406次阅读
    直播预约 |开源芯片系列讲座第30期:“一生一芯”计划——<b class='flag-5'>从零开始</b>设计自己的RISC-V处理器芯片

    从零开始了解智慧教室(一):智慧教室核心设备

    在教育数字化转型的浪潮中,智慧教室已成为现代教育的标配。但对于初次接触智慧教室的学校来说,"智慧教室"到底包含哪些设备?今天将从零开始,全面介绍智慧教室的常见智能设备。
    的头像 发表于 11-03 17:58 1258次阅读
    <b class='flag-5'>从零开始</b>了解智慧教室(一):智慧教室核心设备

    语法纠错和testbench的自动生成

    在编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程中不可避免的会有一些语法的错误
    发表于 10-27 07:07

    如何解决将e203的rtl导入vivado后报语法错误的问题

    主要内容是介绍一如何解决将e203的rtl导入vivado后,报语法错误的问题。 二、分享内容 如图所示,导入源码后跑仿真,会报语法错误。 这是因为这些文件里面有用system veri
    发表于 10-24 09:49

    从零开始电子元器件识别与检测技术

    获取完整文档资料可下载附件哦!!!! 如果内容有帮助可以关注、点赞、评论支持一哦~
    发表于 07-18 17:39

    电商API集成入门:从零开始搭建高效接口

    ​ 在当今数字化电商时代,API(应用程序接口)集成已成为企业提升效率、实现系统互联的关键技术。无论是同步商品信息、处理订单,还是整合支付系统,一个高效的API接口能显著优化业务流程。本文将从零开始
    的头像 发表于 07-10 14:23 413次阅读
    电商API集成入门:<b class='flag-5'>从零开始</b>搭建高效接口

    从零开始IP地址

    IP地址是一种网络编码,用来唯一标识网络中的设备,以确保主机间正常通信。IP地址由32位二进制(32-bit)组成。
    的头像 发表于 07-08 09:29 1402次阅读
    <b class='flag-5'>从零开始</b><b class='flag-5'>学</b>IP地址

    为什么我选择VHDL入门

    篇。 从长期来看,两个语言大概率都要;但是从初学角度而言,总要选择一个入门语言。 根据网上的信息,总结对比结论: Verilog 的优势: 1. Verilog
    的头像 发表于 06-25 11:18 879次阅读
    为什么我选择VHDL入门

    以太网入门:从零开始,掌握以太网基础知识!

    以太网作为现代通信技术的基石,其重要性不言而喻。无论是日常网络应用,还是AI对高速大带宽网络的需求,以太网都扮演着不可或缺的角色。本文将从零开始,带您了解以太网的基础知识,帮助您快速入门。什么是以
    的头像 发表于 06-09 14:00 4117次阅读
    以太网入门:<b class='flag-5'>从零开始</b>,掌握以太网基础知识!

    从零开始之电机FOC控制

    我们将撕开FOC神秘而虚伪的面纱,以说人话的方式讲述它。真正的做到从零开始,小白一看就会,一就废。如果觉得有用的话,就点个赞呗,纯手码。一、什么是FOC?FOC
    的头像 发表于 04-23 19:34 4104次阅读
    <b class='flag-5'>从零开始</b>之电机FOC控制

    从零开始电源

    从零开始电源···内部篇 从零开始电源---------内部篇 (写这篇文的着眼点就在“从零开始”上,所以涉及到一些词汇和技术的时候,我
    发表于 04-07 15:30

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言和C语言一样也提供了编译预处理的功能。“编译预处理”是Verilog HDL编译系统的一个组成部分。Verilog HDL语言允许在程序中使用几种特殊的命令(它们不是一般
    的头像 发表于 03-27 13:30 1086次阅读
    <b class='flag-5'>FPGA</b> <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>语法</b>之编译预处理

    从零开始电路仿真Multisim与电路设计Protel技术——完整版

    资料介绍为读者从零开始,快速掌握EDA(电子设计自动化)领域中最常用、最流行的两个功能强大的应用软件Multisim、Protel而编写的。 本书首先介绍了EDA技术的发展与应用,并对常用EDA软件
    发表于 03-25 14:37

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog测试平台设计方法是Verilog FPGA开发中的重要环节,它用于验证Verilog设计的正确性和性能。以下是一个详细的Verilog
    的头像 发表于 12-17 09:50 1558次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog语法更接近于 C 语言,对于有 C 语言背景的工程
    的头像 发表于 12-17 09:44 2685次阅读