12 verilog基础语法-编译预处理语句

虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
应用工具:VCS(verilog compiled simulator,编译型代码仿真器)



一、学习内容

在这里插入图片描述


二、编译预处理语句

  § “编译预处理”是Verilog HDL编译系统的一个组成部分,编译预处理语句以西文符号“‵ ”开头而不是单引号“’”!
  § 在编译时,编译系统先对编译预处理语句进行预处理,然后将处理结果和源程序一起进行编译。

(1)`define语句

在这里插入图片描述

  宏定义语句——用一个指定的标志符(即宏名)来代表一个字符串(即宏内容)。【例】‵ define IN ina+inb+inc+ind。宏展开——在编译预处理时将宏名替换为字符串的过程。

  宏定义的作用:以一个简单的名字代替一个长的字符串或复杂表达式;以一个有含义的名字代替没有含义的数字和符号 。

//宏定义不是Verilog HDL语句,不必在行末加分号! 如果加了分号,会连分号一起置换。
module test;
	reg a,b,c,d,e,out;
	`define expression a + b + c + d;
	//上面如果加了分号,经过宏展开后,assign语句为:assign out = a + b + c + d; + e; 就出现了语法错误
	assign out = `expression + e;
	...
  • 宏名可以用大写字母,也可用小写字母表示;但建议用大写字母,以与变量名相区别;
  • ‵define语句可以写在模块定义的外面或里面,宏名的有效范围为定义命令之后到源文件结束;
  • 在引用已定义的宏名时,必须在其前面加上符号“ ‵ ” ;
//在进行宏定义时,可引用已定义的宏名,实现层层置换。
module test;
	reg a,b,c;
	wire out;
	`define aa a + b
	`define cc c +‵ aa //引用宏名‵ aa 来定义宏cc
	assign out = ‵ cc;
	...
//经过宏展开后, assign语句为:assign out = c + a + b;
  • 预处理时只是将程序中的宏名替换为字符串,不管含义是否正确。只有在编译宏展开后的源程序时才报错;
  • 使用宏名代替一个字符串,可简化书写,宏名和宏内容必须在同一行中进行声明;

(2)`include语句

  文件包含语句——一个源文件可将另一个源文件的全部内容包含进来。
在这里插入图片描述

  • 如:将file2.v中全部内容复制插入到‵include “file2.v”命令出现的地方
    在这里插入图片描述
      `include语句可以避免做重复劳动!不必将源代码复制到自己的另一源文件中,使源文件显得简洁。还可以将一些常用的宏定义命令或任务(task)组成一个文件,然后用‵include语句将该文件包含到自己的另一源文件中,相当于将工业上的标准元件拿来使用;当某几个源文件经常需要被其他源文件调用时,则在其他源文件中用‵include语句将所需源文件包含进来。
    【例 1】 用‵ include语句设计16位加法器
    在这里插入图片描述
    在这里插入图片描述
//一个‵ include语句只能指定一个被包含的文件;若要包含n个文件,需用n个‵ include语句。
	`include “aaa.v” “bbb.v” //非法!
	`include “aaa.v”
	`include “bbb.v” //合法
	
//include语句可出现在源程序的任何地方。被包含的文件若与包含文件不在同一子目录下,必须指明其路径!
	`include “parts/count.v” //合法!
  • 文件包含允许嵌套
    在这里插入图片描述

(3)timescale语句

  时间尺度语句——用于定义跟在该命令后模块的时间单位和时间精度。时间单位 ——用于定义模块中仿真时间和延迟时间的基准单位;时间精度——用来声明该模块的仿真时间和延迟时间的精确程度。在同一程序设计里,可以包含采用不同时间单位的模块,此时用最小的时间精度值决定仿真的时间单位。
在这里插入图片描述

//时间精度至少要和时间单位一样精确,时间精度值不能大于时间单位值!
	`timescale 1ps / 1ns // 非法!
	`timescale 1ns / 1ps // 合法!
	
//在`timescale语句中,用来说明时间单位和时间精度参量值的数字必须是整数。
//其有效数字为110100//单位为秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、毫皮秒(fs)

【例】‵ timescale语句应用举例。

//timescale 10ns / 1ns //时间单位为10ns,时间精度为1ns
	...
	reg sel;
initiaL begin
	#10 sel = 0; // 在10ns10时刻,sel变量被赋值为0
	#10 sel = 1; // 在10ns20时刻,sel变量被赋值为1
end
	...

三、思考和小结

(1)思考

  1. timescale编译预处理的作用是什么?

(2)小结

在这里插入图片描述


作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xlinxdu

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值