Verilog学习笔记基本语法篇(十二)········ 编译预处理

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,因此延迟时间可以表达为带两位小数的实型数。

 1 `timescale 10ns/1ns
 2 module test;
 3   reg =set;
 4   parameter p=1.55;
 5   initial
 6     begin
 7       $monitor($time,,"set=",set);
 8       #p set=0;
 9       #p set=1;
10      end
11 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部分可以没有。注意:忽略掉的程序段也要符合语法规则。

时间: 2024-08-04 19:21:35

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

Verilog学习笔记基本语法篇(二)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;运算符

Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类: (1)算术运算符 +,-,*,/,% 优先顺序 !~ *  /   % +    - <<    >> <    <=  >   >= ==  !==  === !=== & ^  ^~ | && || ?: 最高优先级别 ↓ ↓ ↓ ↓ 最低优先级别 (2)赋值运算符 =,<= (3)关系运算符> ,<,>=,<= (4)

Verilog学习笔记基本语法篇(八)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 结构说明语句

Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序中的 initial 和 always 的次数是不受限制的,他们都是在仿真的一开始同时开始运行的.initial 只执行一次,而 always语句则是不断地重复活动,直到仿真活动结束.但是always 后面的过程快是否运行,则要看他的触发条件是否满足,满足则运行一次,再满足再运行,直至仿真结束. 格

Verilog学习笔记基本语法篇(六)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 循环语句

在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语句,直至某个条件不满足. 4)for 语句:      三个部分,尽量少用或者不用for循环. 各语句的格式与注意事项: 1)forever格式: forever   语句: 或:forever   begin 多条语句 end 常用于产生周期性的波形,用来作为仿真测试信号.它与always的不同之

Verilog学习笔记基本语法篇(七)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 生成块

生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例引用进行全面的控制.在编程时,应用关键字generate_endgenerate来说明生成的实例范围. 生成实例可以是一下的以下一种或多种类型: 1)模块 :  2)用户定语原语 : 3)门级原语 :  4)连续赋值语句:   5)initial 和 always 块. 生成实例中语序的数据类型:

jqGrid 学习笔记整理——进阶篇(二)

jqGrid 学习笔记整理--进阶篇(二 ) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2.创建表 双击打开上步创建数据库--右击T

Swift学习笔记(语法篇)-- String与Character类型

一: String概述 不同于Objective-C中的NSString与NSMutableString,在Swift中,存储String类型的数据能否改变,取决于定义数据是var还是let,var是变量,能改变String的长度,增加,修改,删除其中的每一个字符等操作,而let是常量,一旦定义后就不能再修改其内容. Swift的String类型是值类型,如果你创建了一个新的String类型的数据,当它被赋值传递时会进行值拷贝,产生一个副本. 二:Character概述 String其实是作为一

Java学习笔记之基础篇(二)

一.多态性 1.多态性的体现 方法的重载与重写 对象的转型 2.对象的多态性 向上转型:自动完成 父类    父类对象=子类实例: 向下转型:强制类型转换 子类    子类对象=(子类)父类实例: 二.内部类 1.内部类的共性 (1).内部类仍是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前冠以外部类的类名和$符号: (2).内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . (3).内部类声明成

jqGrid 学习笔记整理——终极篇(一)

jqGrid 学习笔记整理--终极篇(一) 本篇开始实现利用jqGrid框架实现 主从表 的显示效果及与后台交互的实例,使用的平台和上篇博文[jqGrid 学习笔记整理--进阶篇(二)](http://blog.csdn.net/dfs4df5/article/details/51108798)一致 也将使用上篇中的数据库和代码进行添加和修改,如果未看上篇的请先去看上篇,本篇不再重复贴出上篇出现的源码. 一.数据库部分 为了检索方便,这里建立了一个视图 关联两个表,设置为外键 最后如果有什么不清

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多