Verilog基础语法(16)之编译预处理

宏定义`define

用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:

`define 标识符(宏名) 字符串(宏内容) 
如:`define signal string 

它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。
例子:

`define WORDSIZE 8 
module 
reg[1:`WORDSIZE] data; //这相当于定义 reg[1:8] data; 

在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏
定义的名字。

宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置
换。

宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置
换。

  • 注释行
  • 数字
  • 字符串
  • 确认符
  • 关键词
  • 双目和三目字符运算符

条件编译`ifdef

语法

// Style #1: Only single `ifdef
`ifdef <FLAG>
	// Statements
`endif

// Style #2: `ifdef with `else part
`ifdef <FLAG>
	// Statements
`else
	// Statements
`endif

// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
	// Statements
`elsif <FLAG2>
	// Statements
`elsif <FLAG3>
	// Statements
`else
	// Statements
`endif

它的作用是当宏名已经被定义过(用define命令定义),则对程序段1进行编译,程序段2将被忽略; 否则编译程序段2,程序段1被忽略。其中else部分可以没有

**注意:被忽略掉不进行编译的程序段部分也要符合Verilog HDL程序的语法规则。 **

通常在Verilog HDL程序中用到ifdef、else、`endif编译命令的情况有以下几种:

  • 选择一个模块的不同代表部分。
  • 选择不同的时序或结构信息。
  • 对不同的EDA工具,选择不同的激励。

请注意, 默认情况下, rstn 不会在编译设计时被包含, 因此它不会出现在 port 列表中。但是, 如果在任何属于编译文件列表的 Verilog 文件中定义了名为 INCLUDE_RSTN 的宏, 或者通过命令行传递给编译器, rstn 就会在编译过程中被包括在内, 设计也将拥有它。

时间尺度`timescale

`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。
使用timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。例如,一个设计中包含了两个模块,其中一个模块的时间延迟单位为ns,另一个模块的时间延迟单位为ps。EDA工具仍然可以对这个设计进行仿真测试。

`timescale 命令的格式如下: 
`timescale<时间单位>/<时间精度> 

在`timescale命令中,用于说明时间单位和时间精度参量值的数字必须是整数,其有效数字为1、10、100,单位为秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、毫皮秒(fs)。这几种单位的意义说明见下表。
在这里插入图片描述
例子:

`timescale 1ns/1ps

在这个命令之后,模块中所有的时间值都表示是1ns的整数倍。这是因为在timescale命令中,定义了时间单位是1ns。模块中的延迟时间可表达为带三位小数的实型数,因为 timescale命令定义时间精度为1ps.

 `timescale 10us/100ns

在这个例子中,timescale命令定义后,模块中时间值均为10us的整数倍。因为timesacle 命令定义的时间单位是10us。延迟时间的最小分辨度为十分之一微秒(100ns),即延迟时间可表达为带一位小数的实型数。

`timescale 10ns/1ns 
module test; 
	reg set; 
	parameter d=1.55; 
initial 
	begin 
		#d set=0; 
		#d set=1; 
	end 
endmodule 

在这个例子中,`timescale命令定义了模块test的时间单位为10ns、时间精度为1ns。因此在模块test中,所有的时间值应为10ns的整数倍,且以1ns为时间精度。这样经过取整操作,存在参数d中的延迟时间实际是16ns(即1.6×10ns),这意味着在仿真时刻为16ns时寄存器set被赋值0,在仿真时刻为32ns时寄存器set被赋值1。仿真时刻值是按照以下的步骤来计算的。

  • 根据时间精度,参数d值被从1.55取整为1.6。
  • 因为时间单位是10ns,时间精度是1ns,所以延迟时间#d作为 时间单位的整数倍为16ns。
  • EDA工具预定在仿真时刻为16ns的时候给寄存器set赋值0 (即语句 #d set=0;执行时刻),在仿真时刻为32ns的时候给
    寄存器set赋值1(即语句 #d set=1;执行时刻)

**注意:如果在同一个设计里,多个模块中用到的时间单位不同,需要用到以下的时间结构。 **

  • 用`timescale命令来声明本模块中所用到的时间单位和时间精度。

  • 用系统任务$printtimescale来输出显示一个模块的时间单位和时间精度。

  • 用系统函数$ time和$ realtime及%t格式声明来输出显示EDA工具记录的时间信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值