【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父目录的子目录 ...
随机推荐
- 微服务统计,分析,图表,监控, 分布式追踪一体化的 HttpReports 在 .Net Core 的应用
前言介绍 HttpReports 是针对.Net Core 开发的轻量级APM系统,基于MIT开源协议, 使用HttpReports可以快速搭建.Net Core环境下统计,分析,图表,监控,分布式追 ...
- JMeter分布式压测-常见问题之( Cannot start. localhost.localdomain is a loopback address)
问题描述: JMeter分布式测试时,以Linux系统作为被测服务器,在其中启动 jmeter-server 服务时出现异常,系统提示如下: [root@localhost bin]# ./jmete ...
- SQLi —— 逗号,空格,字段名过滤突破
前言 出于上海大学生网络安全大赛的一道easysql,促使我积累这篇文章.因为放了大部分时间在Decade和Babyt5上,easysql一点没看,事后看了WP,发现看不懂怎么回事,于是了解了一番. ...
- CVE-2019-0193 Apache solr velocity模块漏洞
Solr简单介绍 Solr是建立在Apache Lucene ™之上的一个流行.快速.开放源代码的企业搜索平台. Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自 ...
- BUUOJ [CISCN2019 华北赛区 Day2 Web1]Hack World
补一下这道题,顺便发篇博客 不知道今年国赛是什么时候,菜鸡还是来刷刷题好了 0X01 考点 SQL注入.盲注.数字型 0X02自己尝试 尝试输入1 赵师傅需要女朋友吗???随便都能有好吧 输入2 ?? ...
- 简单了解下CAP定理与BASE定理
分布式环境下的各种问题 通信异常 网络不可用风险高,消息丢失.消息延迟非常普遍 网络分区(脑裂) 网络发生异常情况,延迟增加,导致所有组成分布式系统的节点中,只有部分节点之间能够正常通信,而另一些 ...
- TensorFlow keras读取图片
from tensorflow.python.keras.preprocessing.image import load_img,img_to_array def main(): #tagert_si ...
- 手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!
一.前言 在当今竞争激烈的市场上一个APP的成功离不开一个可靠的测试工程师.因此,对功能和用户体验有特殊关注的App进行全面测试是必不可少的.如何做到测试用例的百分百覆盖一直是测试用例编写过程中 ...
- Flutter 开发填坑指南
引言 第一次在使用Flutter是在Ubuntu机器上,但是因为Android Studio还有Sdk配置问题,flutter doctor总是在这一步报错...最近又在win10上配了一下环境(真香 ...
- GitHub 如何忽略文件或者文件夹
在我们开发项目的时候,往往会产生一些不必要的文件,我们会选择忽略他们,不提交到版本控制中,那我们该如何做呢? 步骤一:在项目根目录下,右键,git bash,在弹出的命令行输入框中输入命令:touch ...