【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父目录的子目录 ...
随机推荐
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(六)之Initialization & Cleanup
Two of these safety issues are initialization and cleanup. initialization -> bug cleanup -> ru ...
- Git应用详解第十讲:Git子库:submodule与subtree.md
前言 前情提要:Git应用详解第九讲:Git cherry-pick与Git rebase 一个中大型项目往往会依赖几个模块,git提供了子库的概念.可以将这些子模块存放在不同的仓库中,通过submo ...
- python脚本如何同时运行多个
当我们想一次运行多个py脚本的时候你想到了什么应用场景了吗?当你想同时并行的处理一些对象时你有什么好方法吗?下面我就简单的总结一些这方面的小技巧,方便大家根据情况灵活处理. 1 用一个py脚本运行多个 ...
- cheat sheet 简介
cheat sheet 速查表 /小抄 如果期末考试老师只让你让带一张A4纸,合法"作弊",纸上能写多少全凭自己本事,你会写什么?大部分人应该把整个课程的知识重点梳理一遍,方便记忆 ...
- D - Catch That Cow BFS
农夫知道一头牛的位置,想要抓住它.农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) .农夫有两种移动方式: 1. ...
- GNU的make命令、makefile编写
makefile简介 makefile可实现工程的自动化编译,只需一个make命令即可一键完成.makefile定义了一些规则,指定哪些文件需要先编译.后编译.重新编译等. 一般的C或者C++程序,都 ...
- mysql数据库深入学习
mysql 数据库 一.数据库介绍 1.关系型数据库的特点 二维表 典型产品Oracle传统企业,MySQL是互联网企业 数据存取是通过SQL 最大特点,数据安全性方面强(ACID) 2.NoSQ ...
- [RCTF2015]EasySQL
[RCTF2015]EasySQL EasySQL github 打开靶机,是如下界面 到注册页面,试了一下,username 和 email 处有过滤,直接 fuzz 一下哪些字符被禁了 注册成功之 ...
- [YII2] 增删改查2
一.新增 使用model::save()操作进行新增数据 $user= new User; $user->username =$username; $user->password =$pa ...
- 初始化 RESTful API 风格的博客系统
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在 HelloDjango 全栈系列教程的第一步--Django博客教程(第二版)中 ...