“ 此小节中介绍verilog hdl中提供的常用预编译命令:`define ;`timescale ;`include ;`ifdef 、`elsif、`endif 。”
01、时间尺度`timescale
`timescale命令用于在文件中指明时间单位和时间精度,通常在对文件进行仿真时体现。eda工具可以支持在一个设计中可根据仿真需要在不同模块里面指定不同的时间单位。如模块a仿真的时间单位为皮秒(ps),模块b仿真的时间单位为纳秒(ns)。使用`timescale命令语句格式如下:
`timescale 《时间单位》 / 《时间精度》
使用时注意《时间单位》和《时间精度》必须是整数,且时间精度不能大于时间单位值。
其中时间单位是定义仿真时间和延迟时间的基准单位;时间精度是定义模块仿真时间的精确程度的,又被称为取整精度(在仿真前,被用来对延迟的时间值进行取整操作,例程中会对此进行介绍)。如果在同一个设计中,出现多个`timescale命令,工具会采用最小的时间精度值来决定仿真的时间单位。
下面举例说明`timescale用法。
`timescale 1ns / 1ps:此命令已定义模块中的时间单位为1ns,即仿真模块中所有的延迟时间单位都是1ns的整数倍;定义了模块的时间精度为1ps,即仿真模块中延迟单位可以指定到小数点后3位,小数超过3位会进行取小数点后3位的操作。
02、宏定义`define
在设计中,为了提高程序可读性和简化程序描述,可以使用指定的标识符来代替一个长的字符串,或者使用一个简单的名字来代替没有含义的数字或者符号,此时需使用到宏定义命令`define。它的使用形式如下:
`define signal(宏名) string(宏内容)
在设计中进行了以上声明后,在与编译处理时,在此命令后程序中所有的signal都替换成string,此过程称为“宏展开”。具体使用方法如下:
例1 :`define length 16
reg [ `length–1 : 0 ] writedata; //即定义reg[15:0] writedata;
例2 :`define expression a+b+c
assign data = `expression + d ; // 经宏展开之后assign //add_data = a+b+c+d;
例3 :`define a a+b
`define b c+`a
assign data = `b ; // 即data = c + a + b;
03、文件包含指令`includ
和c语言中声明头文件很类似。其一般形式为:`include “文件名”
例:
文件para.v中有一个宏定义 `define a 2+3
在test.v文件中可以直接调用
`timescale 1ns / 1ps`include para.v`include para2.vmodule test( input wire clk, output reg [7:0] result ); always@(posedge clk) begin result <= `a + 10; endendmodule 仿真结果如下:
关于“文件包含的几点说明”:
一个`include只能指定一个包含文件;
`include中的文件名可以是相对路径,也可以是绝对路径(ise中调用modelsim仿真的时候得用绝对路径,否则modelsim会报错);
如果文件1包含文件2,而文件2要用到文件3的内容,那么在文件1中用`include命令分别包含文件2和文件3(文件3在文件2的前面)
例:
para.v 中 : `define a 2+3
para2.v 中 : `define b `a+2
test.v中:
`timescale 1ns / 1ps`include para.v`include para2.vmodule test( input wire clk, output reg [7:0] result ); always@(posedge clk) begin result <= `b+ 10; endendmodule 仿真结果如下所示:
04、 条件编译指令(`ifdef、`elsif、`endif)
条件预编译指令有如下几种形式:
1. `ifdef 宏名
程序段1
`elsif
程序段2
`endif
当宏名被定义,则对程序段1进行编译,程序段2被忽略;否则编译程序段2,程序段1倍忽略。
`ifdef 宏名
程序段1
`endif
其中程序段可以是语句组也可以是命令行
例:
`timescale 1ns / 1ps`define mode_add`define mode_enablemodule test_add( input clk, input rst_n, output reg [ 15 : 00 ] data_cal, output reg [ 15 : 00 ] data_cal2 ); wire [15:0] data; `ifdef mode_add always@(posedge clk or negedge rst_n) begin if(!rst_n) data_cal <= 1'b0; else data_cal <= data_cal + 16'd100; end `elsif mode_add2 always@(posedge clk or negedge rst_n) begin if(!rst_n) data_cal <= 1'b0; else data_cal <= data_cal + 16'd200; end `endif `ifdef mode_enable `define m 10 `elsif mode_enable2 `define m 20 `endif always@(posedge clk or negedge rst_n) begin if(!rst_n) data_cal2 <= 1'b0; else data_cal2 <= `m; end assign data = `m; endmodule 仿真结果如下:
如果将:
`define mode_add`define mode_enable改成`define mode_add2`define mode_enable2 仿真结果如下:
什么是Rxjs Rxjs和Promise在处理异步问题有何差异
SDWAN设备监控的五大方法
垂直行业应用为什么需要网络切片
皮尔斯振荡器与 RC 反馈振荡器的使用差异
433超强拷贝滚动码遥控器解决方案
Verilog HDL中常用预编译命令介绍
人工智能需要什么基础
同样人工智能,腾讯、百度 为何不一样
虚拟数字资产交易所开发公司,数字资产抵押平台开发公司
芯华章高性能FPGA原型验证系统实现设计原型自动综合、布线和调试
导电滑环发烫的状况都包括着哪些层面
济南携手华为加速产业数字化转型升级
百思买与美国运营商终止了所有华为手机的销售
MQTT的概述与MQTT的代码编程理解
MAX3710限幅放大器/突发模式激光驱动器
三种串行接口标准的性能对比和应用研究
PNI磁传感器的精度为什么会这么高
Arduino键盘的制作教程
迅为IMX8MM开发板Andaoid9 获取root 权限
OLED 屏笔记本今年有望迎来普及:120% DCI-P3 色域,10 倍 LCD 响应速度