当前位置:首页 > 新闻资讯 > FPGA之家动态 >

【从0开始学FPGA-13】Verilog:调试用系统任务和常用编译预处理语句

时间:2024-08-01      来源:网络搜集 关于我们 0

 一个多年老硬件攻城狮,开始从0学FPGA......

小编通过Vivado学习了几个例程,基本把软件环境搞通了,最大的体会是回到Verlilo的学习,只有把Verilog这门语言学会了,才能在实际的开发中得心应手。需求是输入,算法是核心、语言和开发环境是工具,真所谓“巧妇难为无米之炊”。

01

$monitor

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

$monitor和%display的区别:

从格式化显示上看$display与$monitor函数非常类似,但也有重要的区别。

(1)$display 表现函数或任务,而$monitor表现为过程,虽然这里统称为函数。

(2)$display 只在调用时显示,而$monitor监测参数列表,一旦参数列表中任何一个参数发生变化,$monitor将会被自动执行,这也是为什么称$monitor为过程的原因。特别像always过程的敏感表,一旦敏感量发生变化,always过程就会自动执行一样。(3)$monitor过程更适合打印列表输出,而$display更适合观察细节。在仿真时可以用$monitor列表观察总体运行结果,一旦发现异常,$monitor 可以粗略定位,然后用$display一步一步的追踪,直到找出错误原因。

02

时间度量系统函数$time

在 Verilog HDL,中有两种类型的时间系统函数:$time$realtime。用这两个时间系统函数可以得到当前的仿真时刻。系统函数$time$time可以返回一个64位的整数来表示的当前仿真时刻值。该时刻是以模块的仿真时间尺度为基准的。

例:

        `timescale 10 ns/l ns         module test;            reg set;            parameter p=l.6;            initial                begin                    $ monitor( $ time, ,"set=".set);                    #p set=0;                    #p set=l;                end        endmodule输出结果为            0 set=x            2 set=0            3 set=1在这个例子中,模块 test 在时间为 16 ns 时设置寄存器 set 为0,在时间为 32 ns 时设置寄存器 set 为 1。但是由$time 记录的 set 变化时刻却和预想的不一样。这是由下面两个原因引起的:(1)$time显示时刻受时间尺度比例的影响。在例中,时间尺度是10 ns,因为$time 输出的时刻总是时间尺度的倍数,这样将16ns和32ns输出为1.6 和3.2。(2)因为$time总是输出整数,所以,在将经过尺度比例变换的数字输出时,要先进行取整。在例中,1.6和3.2经取整后为2和3输出。

系统函数$realtime

$realtime $time 的作用是一样的,只是$realtime 返回的时间数字是一个实型数,该数字也是以时间尺度为基准的。还是以上面的例子为例,只是把time替换成realtime

例:

        `timescale 10 ns/l ns         module test;            reg set;            parameter p=l.6;            initial                begin                    $ monitor$ realtime, ,"set=".set);                    #p set=0;                    #p set=l;                end        endmodule输出结果为            0 set=x            1.6 set=0            3.2 set=1

03

系统任务$finish

格式:

        $finish;        $finish(n);系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务$finish 可以带参数,根据参数的值输出不同的特征信息。如果不带参数,默认$finish 的参数值为1。下面给出了对于不同的参数值,系统输出的特征信息:

    0:不输出任何信息;

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

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

04

系统任务$stop

格式:    $stop;    $ stop(n);$stop任务的作用是把EDA工具(例如仿真器)置成暂停模式,在仿真环境下给出一个交互式的命令提示符,将控制权交给用户。这个任务可以带有参数表达式。根据参数值(0.1或2)的不同,输出不同的信息。参数值越大,输出的信息越多。

05

系统任务$readmemb和$readmemh

在 Verilog HDL,程序中有两个系统任务$readmemb$readmemh,并用来从文件中读取数据到存储器中。这两个系统任务可以在仿真的任何时刻被执行使用,其使用格式共有以下6种:

(1)$readmemb("<数据文件名>",<存储器名>);

(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);

(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);

(4)$readmemh("<数据文件名>",<存储器名>);

(5)$readmemh("<数据文件名>",<存储器名>,<起始地址>);

(6)$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>)。

对于$readmemb系统任务,每个数字必须是二进制数字,对于$readmemh系统任务,每个数字必须是十六进制数字。

06

系统任务$random

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

$random一般的用法是:

    $ramdom %b,其中 b>0。它给出了一个范围在(-b+1):(b-1)中的随机数。

下面给出一个产生随机数的例子:

            reg[23:0]rand;            rand= $random %60;        上面的例子给出了一个范围在-59~59之间的随机数。

07

宏定义`define

宏定义`define

用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:

        define 标识符(宏名) 字符串(宏内容)例:`define abc stinrg     // 用abc来代替stinrg

08

文件包含`include

文件包含处理`include

    所谓“文件包含”处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。Verilog HDL,语言提供了 include 命令用来实现“文件包含”的操作。其一般形式为:include"文件名"      `include "文件名"例:    文件 aaa.v            module aaa(a,b.out);                input a, b;                output out;                wire out:                assign out=a^b;            endmodule(2)文件 bbb.v    `include  "aaa.v"        module bbb(c.d,e,out);            input c.d.e;            output out;            wire  out_a;            wire  out;            aaa(.a(c),.b(d)..out(out_a));assign out=e&out_a;        endmodule

    在中,文件 bbb.v用到了文件 aaa.v中的模块 aaa 的实例器件,通过“文件包含”处理来调用。模块 aaa实际上是作为模块 bbb 的子模块来被调用的。在经过编译预处理后,文件 bbb.v实际相当于下面的程序文件 bbb.v:

09时间尺度`timesacle文件包含处理`include   ` timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。使用timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。例如,一个设计中包含了两个模块,其中一个模块的时间延迟单位为纳秒(ns),另一个模块的时间延迟单位为皮秒(ps)。EDA 工具仍然可以对这个设计进行仿真测试。timescale 命令的格式如下:      `timescale<时间单位>/<时间精度>10条件预编译命令

条件编译命令ifdef、`else、`endif

一般情况下,Verilog HDL,源程序中所有的行都将参加编译。但是有时希望对其中的一部分内容只有在满足条件时才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足条件时对一组语句进行编译,而当条件不满足时则编译另一部分。这个用法和C语言中的用法是相似的。----------------------------------------------------------

参考书籍:【《FPGA原理和结构》(日) 天野英晴】

----------------------------------------------------------高清HDMI 2.0线】推荐淘宝店铺“电子eStore

"所卖的这款,多种线材规格可供选择。

   【淘宝】https://m.tb.cn/h.gZ7bXRf?tk=rDGhWr2rQ96 MF1643 「绿联hdmi线2.0清线4k视频传输线黄黑头黑色工程HDMI线」点击链接直接打开 或者 淘宝搜索直接打开

----------------------------------------------------------------

----------------------------------------------------------------

关注小编一起学FPGA......


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言