【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父目录的子目录 ...
随机推荐
- threejs 鼠标移动控制模型旋转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- python成功安装torch模块
最近项目要使用到torch模块,但是在安装的过程中发现torch直接使用pip install安装是安装不成功的.然后就百度,发现并没有什么卵用,所以就google一番,不禁感叹,这种新的东西,还是外 ...
- 前后端分离下用jwt做用户认证
0 前后端分离下的用户信息认证 前端使用Vue+axios,后端使用SpringBoot+SpringSecurity. 为了解决http无状态的问题,我采用jwt(json web token)保存 ...
- IN612 IN612L蓝牙5.0 SoC芯片替换NRF52832/NRF52840
IN612L是美国公司INPLAY的SOC产品系列之一,具有多模协同2.4G无线协议栈,支持2.4G私有协议栈以及蓝牙5.0全协议栈的SOC芯片.如2mbps高数据速率模式,125kbps/500kb ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- ISWC 2018概览:知识图谱与机器学习
语义网的愿景活跃且良好,广泛应用于行业 语义网的愿景是「对计算机有意义」的数据网络(正如 Tim Berners Lee.James Hendler 和 Ora Lassila 在<科学美国人& ...
- PHP反序列化漏洞总结(二)
写在前边 之前介绍了什么是序列化和反序列化,顺便演示了一个简单的反序列化漏洞,现在结合实战,开始填坑 前篇:https://www.cnblogs.com/Lee-404/p/12771032.htm ...
- iOS重构项目之路
iOS重构项目之路 1.整理目录 按照功能模块对整个工程的目录进行分类,比如 2.整理资源文件 删除多余的图片文件,资源文件 图片资源尽量添加到Assets.xcassets中 删除项目中未引用的图片 ...
- Linux必须会的命令---也是以前记录的,ctrl+z fg 啥的 jobs 比较实用
fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令 ...
- Spring Cloud 系列之 Sleuth 链路追踪(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Sleuth 链路追踪(一) 本篇文章讲解 Sleuth 基于 Zipkin 存储链路追踪数据至 MySQL,Elas ...