“ 此小節(jié)中介紹Verilog HDL中提供的常用預(yù)編譯命令:`define ;`timescale ;`include ;`ifdef 、`elsif、`endif 。”
01、時(shí)間尺度`timescale
`timescale命令用于在文件中指明時(shí)間單位和時(shí)間精度,通常在對(duì)文件進(jìn)行仿真時(shí)體現(xiàn)。EDA工具可以支持在一個(gè)設(shè)計(jì)中可根據(jù)仿真需要在不同模塊里面指定不同的時(shí)間單位。如模塊A仿真的時(shí)間單位為皮秒(ps),模塊B仿真的時(shí)間單位為納秒(ns)。使用`timescale命令語(yǔ)句格式如下:
`timescale 《時(shí)間單位》 / 《時(shí)間精度》
使用時(shí)注意《時(shí)間單位》和《時(shí)間精度》必須是整數(shù),且時(shí)間精度不能大于時(shí)間單位值。
其中時(shí)間單位是定義仿真時(shí)間和延遲時(shí)間的基準(zhǔn)單位;時(shí)間精度是定義模塊仿真時(shí)間的精確程度的,又被稱為取整精度(在仿真前,被用來(lái)對(duì)延遲的時(shí)間值進(jìn)行取整操作,例程中會(huì)對(duì)此進(jìn)行介紹)。如果在同一個(gè)設(shè)計(jì)中,出現(xiàn)多個(gè)`timescale命令,工具會(huì)采用最小的時(shí)間精度值來(lái)決定仿真的時(shí)間單位。
下面舉例說(shuō)明`timescale用法。
`timescale 1ns / 1ps:此命令已定義模塊中的時(shí)間單位為1ns,即仿真模塊中所有的延遲時(shí)間單位都是1ns的整數(shù)倍;定義了模塊的時(shí)間精度為1ps,即仿真模塊中延遲單位可以指定到小數(shù)點(diǎn)后3位,小數(shù)超過(guò)3位會(huì)進(jìn)行取小數(shù)點(diǎn)后3位的操作。
02、宏定義`define
在設(shè)計(jì)中,為了提高程序可讀性和簡(jiǎn)化程序描述,可以使用指定的標(biāo)識(shí)符來(lái)代替一個(gè)長(zhǎng)的字符串,或者使用一個(gè)簡(jiǎn)單的名字來(lái)代替沒(méi)有含義的數(shù)字或者符號(hào),此時(shí)需使用到宏定義命令`define。它的使用形式如下:
`define signal(宏名) string(宏內(nèi)容)
在設(shè)計(jì)中進(jìn)行了以上聲明后,在與編譯處理時(shí),在此命令后程序中所有的signal都替換成string,此過(guò)程稱為“宏展開(kāi)”。具體使用方法如下:
例1 :`define LENGTH 16
reg[ `LENGTH–1 : 0 ] writedata;//即定義reg[15:0]writedata;
例2 :`define expression a+b+c
assign data = `expression + d ; // 經(jīng)宏展開(kāi)之后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語(yǔ)言中聲明頭文件很類似。其一般形式為:`include “文件名”
例:
文件para.v中有一個(gè)宏定義 `defineA 2+3
在test.v文件中可以直接調(diào)用
`timescale1ns/1ps`include"para.v"`include"para2.v"module test(input wire clk,outputreg[7:0]result);always@(posedge clk)beginresult<=?`A+10;endendmodule
仿真結(jié)果如下:

關(guān)于“文件包含的幾點(diǎn)說(shuō)明”:
-
一個(gè)`include只能指定一個(gè)包含文件;
-
`include中的文件名可以是相對(duì)路徑,也可以是絕對(duì)路徑(ISE中調(diào)用Modelsim仿真的時(shí)候得用絕對(duì)路徑,否則Modelsim會(huì)報(bào)錯(cuò));
-
如果文件1包含文件2,而文件2要用到文件3的內(nèi)容,那么在文件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.v"module test(input wire clk,output reg [7:0] result);always@(posedge clk)beginresult<=?`B+10;endendmodule
仿真結(jié)果如下所示:

04、 條件編譯指令(`ifdef、`elsif、`endif)
條件預(yù)編譯指令有如下幾種形式:
1. `ifdef宏名
程序段1
`elsif
程序段2
`endif
當(dāng)宏名被定義,則對(duì)程序段1進(jìn)行編譯,程序段2被忽略;否則編譯程序段2,程序段1倍忽略。
`ifdef宏名
程序段1
`endif
其中程序段可以是語(yǔ)句組也可以是命令行
例:
`timescale1ns/1ps`defineMODE_ADD`defineMODE_ENABLEmodule test_add(input clk,rst_n,output reg [ 15 : 00 ] data_cal,output reg [ 15 : 00 ] data_cal2);:0]data;MODE_ADDclk or negedge rst_n) beginif(!rst_n)data_cal <= 1'b0;elsedata_cal <= data_cal + 16'd100;endMODE_ADD2clk or negedge rst_n) beginif(!rst_n)data_cal <= 1'b0;elsedata_cal <= data_cal + 16'd200;end`endifMODE_ENABLEM 10MODE_ENABLE2M 20`endifclk or negedge rst_n) beginif(!rst_n)data_cal2 <= 1'b0;elsedata_cal2 <= `M;end=`M;endmodule
仿真結(jié)果如下:

如果將:
`defineMODE_ADD`defineMODE_ENABLE改成`defineMODE_ADD2`defineMODE_ENABLE2
仿真結(jié)果如下:

審核編輯:郭婷
-
仿真
+關(guān)注
關(guān)注
52文章
4363瀏覽量
137407 -
Verilog
+關(guān)注
關(guān)注
30文章
1369瀏覽量
113791 -
eda
+關(guān)注
關(guān)注
72文章
3007瀏覽量
180920
原文標(biāo)題:Verilog基礎(chǔ)知識(shí)學(xué)習(xí)筆記(五)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
未能獲得預(yù)編譯的模擬庫(kù)信息
Verilog-HDL實(shí)踐與應(yīng)用系統(tǒng)設(shè)計(jì)
Verilog HDL華為入門教程
Verilog HDL程序設(shè)計(jì)與實(shí)踐
Verilog HDL硬件描述語(yǔ)言_Verilog語(yǔ)言要素
Verilog HDL入門教程
Verilog HDL入門教程之Verilog HDL數(shù)字系統(tǒng)設(shè)計(jì)教程
如何設(shè)計(jì)常用模塊的Verilog HDL?
Verilog教程之Verilog的命令格式資料說(shuō)明
Verilog HDL入門教程
Verilog HDL 編譯器指令說(shuō)明
Verilog HDL入門教程-Verilog HDL的基本語(yǔ)法
什么是預(yù)編譯
FPGA Verilog HDL語(yǔ)法之編譯預(yù)處理

Verilog HDL中常用預(yù)編譯命令介紹
評(píng)論