欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章

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编译向导:详解编译预处理功能的更多相关文章

  1. 《FPGA设计技巧与案例开发详解-第二版》全套资料包

    本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...

  2. 第十六章 IIC协议详解+UART串口读写EEPROM

    十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...

  3. Android编译过程详解(一)

    Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...

  4. cegui-0.8.2编译过程详解

    cegui 编译过程详解(cegui-0.8.2) cegui配置整了好长时间了,在一位大牛帮助下终于搞定了,网上的教程大多是老版本的,cegui-0.8.2版的配置寥寥无几,现在总结一下,献给正在纠 ...

  5. [转]PostgreSQL教程(十六):系统视图详解

    这篇文章主要介绍了PostgreSQL教程(十六):系统视图详解,本文讲解了pg_tables.pg_indexes.pg_views.pg_user.pg_roles.pg_rules.pg_set ...

  6. “全栈2019”Java异常第十六章:Throwable详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. uboot配置和编译过程详解

    根据朱有鹏老师讲解整理 一.uboot主Makefile分析 1.uboot version确定(Makefile的24-29行) include/version_autogenerated.h文件是 ...

  8. SpringBoot系列(六)集成thymeleaf详解版

    SpringBoot系列(六)集成thymeleaf详解版 1. thymeleaf简介  1. Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎.  2. Thymeleaf ...

  9. GCC 概述:C 语言编译过程详解

    Tags: C Description: 关于 GCC 的个人笔记 GCC 概述 对于 GCC 6.1 以及之后的版本,默认使用的 C++ 标准是 C++ 14:使用 -std=c++11 来指定使用 ...

  10. Docker学习(六)——Dockerfile文件详解

    Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...

随机推荐

  1. 百度智能云虚拟主机 Typecho 分类功能失效 | 开启伪静态地址

    出现的问题 $this->is() 方法失效,无法正确判断 archive.category.tags 页面类型. 点击分类页面.归档页面时,虽然 URL 是正确的,但网页内容却是 index. ...

  2. 初探Redis-基础类型String

    Redis存在五种基础类型:字符串(String).队列(List).哈希(Hash).集合(Set).有序集合(Sorted Set).String的出镜率算是最高的.本次列举出String的常用操 ...

  3. 移动(appium)自动化测试-爬虫的另一种手段

    appium自动化测试环境搭建: 1.Python环境(推荐2.7)和jdk. 2.Adb工具的下载:自己单独下载adb.夜神模拟器自带和Android sdk 3.Apk安装介质:真机.Androi ...

  4. .NET Core 3 WPF MVVM框架 Prism系列文章索引

    .NET Core 3 WPF MVVM框架 Prism系列之数据绑定 .NET Core 3 WPF MVVM框架 Prism系列之命令 .NET Core 3 WPF MVVM框架 Prism系列 ...

  5. python学习笔记(四)---用户输入与while循环

    用户输入 函数input demo1: message = input("all you input is chars:") print(message) demo2: 由inpu ...

  6. SourceTree for Windows跳过登录解决方法

    来源:https://blog.csdn.net/t_332741160/article/details/79611303 SourceTree 是一个强大的git管理客户端,但是在使用最新版需要登录 ...

  7. phpstorm破解版

    查看下载:https://www.7down.com/soft/229568.html 破解:https://www.7down.com/article/305640.html 主题更换和下载:htt ...

  8. DEDE Fatal error: Maximum execution time of 30 seconds exceeded 致命 错误: 最大的 执行 时间 为 30 秒

    刚安的DEDE    5.7 -SP1-GBK的  为何一登录后台点任何链接都显示超过30秒  后台假死 网上搜的方法一般都是更改执行时间上限,其目的是为了解决一些大的数据,真的需要30秒以上的执行时 ...

  9. 前端JS—显示赋值(一)

    一:js代码必须位于<script>js代码</script> 把js代码放到<body>元素的地步,可以改善显示速度 二:js显示数据 使用 window.ale ...

  10. DMTF 关于 CIM-XML 的幻灯片介绍

    https://members.dmtf.org/data/presentations/devcon02/JimDavis-IntroductiontoCIM-XML.pdf