【FPGA篇章六】FPGA编译向导:详解编译预处理功能
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章

Verilog HDL语言和C语言一样也提供了编译预处理功能。
Verilog HDL允许在程序中使用特殊的编译预处理语句。
在编译时,通常先对这些特殊语句进行“预处理”,然后再将预处理的结果和源程序一起进行编译。
预处理命令以符号“`”开头(注意,“`”不是单引号,叫反单引号,在键盘左上角数字1的左边),以区别于其他语句。
1 宏定义 `define
`define语句用来将一个简单的名字或标志符(或称为宏名)来代表一个复杂的名字或字符串,其一般形式为:
define 标志符(宏名) 字符串
在程序中,引用宏的方法是在宏名前面加上符号“`”。
宏定义主要可以起到两个作用:
(1)用一个有意义的标识符取代程序中反复出现的含义不明显的字符串。例如:
`define WORDSIZE
reg[ `WORDSIZE : ] data;
//这相当于定义 reg[8:1] data;
(2)用一个较短的标识符代替反复出现的较长的字符串。例如:
`define sum1 ina+inb+inc+ind module calculate( out1,out2,ina,inb,inc,ind,ine);
input ina,inb,inc,ind,ine;
output[:]out1,out2;
wire ina,inb,inc,ind,ine;
reg[:]out1,out2; always@(ina or inb or inc or ine)
begin
out1=`sum1+ine;
out2=`sum1-ine;
end
endmodule
2 文件包含语句 `include
使用Verilog HDL设计数字系统时,一个设计可能包含很多模块,而每个模块都单独存为一个文件。
当顶层模块调用子模块时,就需要到相应的文件中寻找,文件包含的作用就是指明这些文件的位置。
也可以将宏定义、任务或者函数等语句写在单独的文件中,通过文件包含供其他模块调用。
`include是文件包含语句,它可将一个文件全部包含到另一个文件中。其一般形式为:
`include “文件名”`
例用 `include 语句设计的16位加法器:
//addr.v文件的代码为:
module addr(cout,sum,a,b,cin);
parameter size =;
output cout;
output[size-:] sum;
input cin;
input[size-:] a, b; assign {cout,sum} = a+b+cin; endmodule //调用文件addr.v中模块addr完成16位加法器
`include "addr.v"
module addr16(cout,sum,a,b,cin);
parameter MySize =;
output cout;
output[MySize-:] sum;
input[MySize-:] a, b;
input cin; addr #(MySize) myAddr(cout,sum,a,b,cin); endmodule
3 条件编译指令 `ifdef `else `endif
根据环境需要对一部分代码有选择地进行编译。
条件编译有两种表达形式:
// 第一种形式:
`ifdef 宏名
程序段
`endif //第二种形式
`ifdef 宏名
程序段1
`else
程序段2
`endif
`define sum a+b
module condition_compile(out,a,b,c);
output[:] out;
input a,b,c; `ifdef sum
assign out=sum+c;
`else
assign out=a+c;
`endif endmodule //在上面的例子中,因为定义了“`define sum”,
//所以程序执行“assign out=a+b+c;”
4 时间尺度 `timescale
`timescale语句用于定义模块的时间单位和时间精度,其使用格式如下:
`timescale 时间单位/时间精度
用于时间单位和时间精度的数字只能是1、10和100。 其中用来表示时间度量的符号有:
s、ms、μs 、ns、ps和fs 。
时间精度是指模块仿真时间和延时的精确程度,比如定义时间精度为10ns,那么程序中所有的延时至多能精确到10ns。
`timescale 100ns/10ns
…………
always @(din)
fork
# dout1 = din; //延时300ns
#3.1 dout2 = din; //延时310ns
#3.14 dout3 = din; //延时310ns
join
小结
宏定义字符串引用时,不要忘记要用“`”引导。这与C语言不同。
include等编译预处理也必须用“`”引导,而不是与C语言一样用“#”引导或不需要引导符。
合理地使用条件编译和条件执行预处理可以使测试程序适应不同的编译环境,也可以把不同的测试过程编写到一个统一的测试程序中去,简化测试的过程,对于复杂设计的验证模块的编写很有实用价值。
【FPGA篇章六】FPGA编译向导:详解编译预处理功能的更多相关文章
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- Android编译过程详解(一)
Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...
- cegui-0.8.2编译过程详解
cegui 编译过程详解(cegui-0.8.2) cegui配置整了好长时间了,在一位大牛帮助下终于搞定了,网上的教程大多是老版本的,cegui-0.8.2版的配置寥寥无几,现在总结一下,献给正在纠 ...
- [转]PostgreSQL教程(十六):系统视图详解
这篇文章主要介绍了PostgreSQL教程(十六):系统视图详解,本文讲解了pg_tables.pg_indexes.pg_views.pg_user.pg_roles.pg_rules.pg_set ...
- “全栈2019”Java异常第十六章:Throwable详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- uboot配置和编译过程详解
根据朱有鹏老师讲解整理 一.uboot主Makefile分析 1.uboot version确定(Makefile的24-29行) include/version_autogenerated.h文件是 ...
- SpringBoot系列(六)集成thymeleaf详解版
SpringBoot系列(六)集成thymeleaf详解版 1. thymeleaf简介 1. Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎. 2. Thymeleaf ...
- GCC 概述:C 语言编译过程详解
Tags: C Description: 关于 GCC 的个人笔记 GCC 概述 对于 GCC 6.1 以及之后的版本,默认使用的 C++ 标准是 C++ 14:使用 -std=c++11 来指定使用 ...
- Docker学习(六)——Dockerfile文件详解
Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...
随机推荐
- Leetcode802-找到最终的安全状态(Python3)
刚开始没思路,还以为是利用二维矩阵直接标记节点间的有向路径,最后循环遍历就能得到结果,结果最后发现方向是错的,之后看了大佬们写的代码,发现原来是用出度来实现节点是否安全的. 照着大佬们的思路重新写了一 ...
- CodeForces - 876B H - 差异的可分割性
现在有n个整数,在这n个数中找出k个数,保证这k个数中任意两个数差的绝对值可以被m整除. Input第一行输入三个整数n,k,m(2<=k<=n<=100000,1<=m< ...
- vs 类型定义及语句,随机数
1 类型定义: 1)小数: 类型 变量名 赋值 decimal d : d=1.2m float ...
- 二进制部署kubernetes集群_kube-apiserver提示"watch chan error: etcdserver: mvcc: required revision has been compacted'
查看kube-apiserver状态 [root@yxz-cluster01 ~]# systemctl status kube-apiserver -l ● kube-apiserver.servi ...
- Python 七步捉虫法
了解一些技巧助你减少代码查错时间. -- Maria Mckinley 在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误.在有了初 ...
- Pytorch实现的语义分割器
使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例 从Detectron输出的相关示例 使用Detectron预训练权重输出 *e2e_keypoi ...
- 关于log4j、jul、jcl、slf4j等等日志组件的理解
日志组件: 我们经常在开发项目的时候,需要打印记录项目过程中的一些日志.那我们经常大概会用到 log4j.jul.jcl.slf4j.simple.nop.logback 等等,那我们就详细介绍下这些 ...
- thinkPHP--关于域名指向的问题
一般项目的域名指向都是可以直接配置的,在默认的情况下.一般都是指向index.php文件.我就直接上图吧,这里是用我的公司项目名称www.xcj.com为域名. 一般的进入项目,调用默认的控制器: h ...
- Linux 字符串处理函数
1 strchr 函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符. ...
- 快速部署一个Kubernetes集群
官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...