h

Verilog HDL语言和C语言一样也提供编译预处理的功能。在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应的上键盘字符为"~",这个符号并不是单引号"'".这里简单介绍最常用的`define `include `timescale.

1)宏定义`define

用一个指定的标识符(名字)来代表一个字符串,其的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define  SIGNAL string

其作用是在后面程序中用SIGNAL替代所有的string字符串,在编译预处理时,将程序中该命令后面所有的SIGNAL替换为string。这种替代过程称作宏展开。

说明:

a)宏名可以是大写字母,也可以是小写字母。一般用大写字母,防止与后面的变量名重复。

b)`define可以出现在模块定义里面,也可以出现在外边。其有效范围是从该命令行开始至源文件结束。

c)在引用已定义的宏名时,必须在宏名的前面加上符号`,表示该名字是一个经过宏定义的名字。

d)宏定义是用宏名代替一个字符串,只做简单替换不检查语法。

e)宏定义不是Verilog HDL语句,不必在后面加分号。

f)在进行宏定义时,可以引用已经定义的宏名,可以层层替换。

g)宏名和宏内容必须在同一行进行声明。如果在宏内容中包含有注释行,注释行不会作为被置换的内容。

注意:组成宏内容的字符串不能够被以下的语句记号分隔开。注释行+数字+字符串+确认符+关键词+双目或三目运算符

如下面的宏定义声明和引用就是非法的:

`define first_half "start of string

$display(`first_half end of string")

2)文件包含处理`include

所谓文件包含是指处理一个源文件可以将另一个源文件的全部内容包含进来,即将另外文件包含到本文件之中。一般格式为: `include"文件名"

在执行命令时,将被包含文件的全部内容复制插入到`include命令出现的地方,然后继续进行下一步的编译。关于文件包含的几点说明:

1)一个文件包含命令只能制定一个被包含的文件,如果需要包含n个文件,要用n个`include命令。

2)`include命令可以出现在Verilog程序的任何位置。被包含文件名可以是相对路径名,也可以是绝对路径名。

3)可以将多个包含命令卸载同一行,可以出现空格和注释行。

4)如果文件1 包含文件2,文件2需要用到文件3的内容,可以在文件一种用两个`include命令分别将文件2和文件3包含进去,而且文件3要在文件2之前。

5)在一个被包含文件中又可以包含其他的文件,即文件的包含是可以嵌套的。

3)时间尺度`timescale

`timescale命令用来说明跟在该命令后面的模块的时间单位和精度。使用`timescale命令可以在同一个设计中包含不同的时间单位的模块。一般的命令格式如下:`timescale<时间单位>/<时间精度>

在这条命令中,时间单位参量是用来定义模块中的仿真时间和延迟时间的基准单位的。时间精度是用来声明该模块的仿真时间的精确程度的,该参量被用来对延迟时间值进行取证操作,因此又可以称作是取整精度。如果在同一个程序设计里,存在多个`timescale一样的命令,则用最小的时间精度值来决定仿真的时间单位。另外时间精度不能大于时间单位值。

使用`timescale时应该注意,`timescale的有效区域为`timescale语句处直至下一个`timescale命令或者`resetall语句为止。当有多个`timescale命令时,只有最后一个才起作用,多以在同一个源文件中`timescale定义的不同的多个模块最好分开编译,不要包含在一起以免出错。

`timescale 1ns/1ps         //时间值都为1ns的整数倍,时间精度为1ps,因此延迟时间可以表达为带三位小数的实型数。

`timescale 10μs/100ns   //时间单位为10μs的整数倍,时间精度位100ns,因此延迟时间可以表达为带两位小数的实型数。

 `timescale 10ns/1ns
module test;
reg =set;
parameter p=1.55;
initial
begin
$monitor($time,,"set=",set);
#p set=;
#p set=;
end
endmodule

时间尺度

1)根据时间精度,参数p的值从1.55取整为1.6;

2)因为时间单位是10ns,时间精度为1ns,所以延迟时间#p作为事件单位的整数倍为16ns;

3)可以用$printtimescale函数来输出显示一个模块的时间单位和时间精度。

4)条件编译命令`ifdef `else `endif

一般情况下,Verilog HDL源程序中所有的航都参加编译。但是有时希望对其中的部分内容只有在满足编译条件时才进行编译。也就是对一部分内容指定编译条件,即条件编译。

条件编译命令有以下几种形式:

`ifdef 宏名 (标识符)

程序段1

`else

程序段2

`endif

它的作用是当宏名已经被定义过(`define定义),则对程序1进行编译,程序段2被忽略。其中else部分可以没有。注意:忽略掉的程序段也要符合语法规则。

Verilog学习笔记基本语法篇(十二)········ 编译预处理的更多相关文章

  1. Verilog学习笔记基本语法篇(二)·········运算符

    Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类: (1)算术运算符 +,-,*,/,% 优先顺序 !~ *  /   % +    - <<    > ...

  2. Verilog学习笔记基本语法篇(十)········ 常用系统函数

    $display 和 $write 任务 格式: $display (p1,p2,...,pn); $write (p1,p2,..,pn); 这两个函数和系统的任务作用是用来输出信息,即将参数p2到 ...

  3. Verilog学习笔记基本语法篇(九)········ 任务和函数

    task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...

  4. Verilog学习笔记基本语法篇(八)········ 结构说明语句

    Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序 ...

  5. Verilog学习笔记基本语法篇(一)·········数据类型

    Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...

  6. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  7. Verilog学习笔记基本语法篇(十三)...............Gate门

    Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...

  8. Verilog学习笔记基本语法篇(七)········ 生成块

    生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...

  9. Verilog学习笔记基本语法篇(六)········ 循环语句

    在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语 ...

随机推荐

  1. Git 进阶指南

    转自: https://github.com/kaiye/kaiye.github.com/issues/7 在掌握了基础的 Git 使用 之后,可能会遇到一些问题.以下是猫哥筛选总结的部分常见问题, ...

  2. 解决微信公众号OAuth出现40029(invalid code,不合法的oauth_code)的错误

    关于OAuth 官方教程:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&la ...

  3. Java异常内容总结

    在程序开发中,可能存在各种错误,有些错误是可以避免的,而有些错误却是意想不到的,在Java中把这些可能发生的错误称为异常. Throwable类是所有异常类的超类,该类的两个直接子类是Error和Ex ...

  4. Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义

    Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...

  5. C#实现哥德巴赫猜想

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Goet ...

  6. jQuery 自带的动画效果

    1.方法: show:显示选中元素. hide:隐藏选中元素. toggle:显示或隐藏选中元素. fadeIn:将选中元素的不透明度逐步提升到100%. fadeOut:将选中元素的不透明度逐步降为 ...

  7. aud$定位错误用户密码登陆数据库的具体信息

    环境:Oracle 11.2.0.3 客户端使用错误的用户密码登陆数据库 查询最近1天由于密码错误登陆失败的信息 查询当前审计中有哪些returncode值 1. 客户端使用错误的用户密码登陆数据库 ...

  8. JavaWeb路径问题打包总结--小心出门右转404

    话说,培训和自学就不是一个回事,两周讲完java基础,两天讲完jsp,两节课讲完servlet,还真不是一般人能受得了的,这两天学习jsp和servlet频繁被路径问题困扰,倒不是出错,只是各种act ...

  9. WebSocket 学习(三)--用nodejs搭建服务器

    前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...

  10. JS实现动态显示当前时间

    效果图: 代码实现: <script language="JavaScript"> var timerID = null; var timerRunning = fal ...