Verilog語法的基本概念
一、Verilog HDL
Verilog HDL是一種用于數(shù)字系統(tǒng)設(shè)計的語言。用Verilog HDL描述的電路設(shè)計就是該電路的Verilog HDL模型也稱為模塊。Verilog HDL既是一種行為描述的語言也是一種結(jié)構(gòu)描述的語言。這也就是說,無論描述電路功能行為的模塊或描述元器件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。如果按照一定的規(guī)矩編寫,功能行為模塊可以通過工具自動地轉(zhuǎn)換為門級互連模塊。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種:
1.1 系統(tǒng)級(system): 用語言提供的高級結(jié)構(gòu)實現(xiàn)設(shè)計模塊外部性能的模型。
1.2 算法級(algorithm): 用語言提供的高級結(jié)構(gòu)實現(xiàn)算法運行的模型。
1.3 RTL級(Register Transfer Level):描述數(shù)據(jù)在寄存器之間流動和如何處理和控制這些數(shù)據(jù)流動的模型。
1.4 門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。
1.5 開關(guān)級(switch-level):描述器件中三極管和儲存節(jié)點以及它們之間連接的模型。
二、Verilog HDL模塊
一個復雜電路系統(tǒng)的完整Verilog HDL模型是由若干個Verilog HDL模塊構(gòu)成的,每一個模塊又可以由若干個子模塊構(gòu)成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設(shè)計的模塊有交互聯(lián)系的現(xiàn)存電路或激勵信號源。利用Verilog HDL語言結(jié)構(gòu)所提供的這種功能就可以構(gòu)造一個模塊間的清晰層次結(jié)構(gòu)來描述極其復雜的大型設(shè)計,并對所作設(shè)計的邏輯電路進行嚴格的驗證。
Verilog HDL行為描述語言作為一種結(jié)構(gòu)化和過程性的語言,其語法結(jié)構(gòu)非常適合于算法級和RTL級的模型設(shè)計。這種行為描述語言具有以下功能:
(1) 可描述順序執(zhí)行或并行執(zhí)行的程序結(jié)構(gòu)。
(2) 用延遲表達式或事件表達式來明確地控制過程的啟動時間。
(3) 通過命名的事件來觸發(fā)其它過程里的激活行為或停止行為。
(4) 提供了條件、if-else、case、循環(huán)程序結(jié)構(gòu)。
(5) 提供了可帶參數(shù)且非零延續(xù)時間的任務(wù)(task)程序結(jié)構(gòu)。
(6) 提供了可定義新的操作符的函數(shù)結(jié)構(gòu)(function)。
(7) 提供了用于建立表達式的算術(shù)運算符、邏輯運算符、位運算符。
Verilog HDL作為一種高級的硬件描述編程語言,與C語言的風格有許多類似之處。其中有許多語句如:if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經(jīng)掌握C語言編程的基礎(chǔ),那么學習Verilog HDL并不困難。我們只要對Verilog HDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,就能利用它的強大功能來設(shè)計復雜的數(shù)字邏輯電路系統(tǒng)。
2.1 簡單的Verilog HDL模塊
2.1.1 Verilog 語法簡介
下面先介紹一個個簡單的Verilog HDL程序,從中了解Verilog模塊的特性。
module test_project_top( //模塊名
input clk, // 時鐘輸入
input resetn, // 復位
input[7:0] a, //信號輸入,信號a 位寬為8 bit
input[7:0] b, //信號輸入,信號b 位寬為8 bit
input en, // 信號是能輸入 信號en 位寬為1 bit
output reg [8:0] c, // 寄存器類型定義,信號輸出 c為9bit
output reg [15:0] d // 寄存器類型定義,信號輸出 d 為16bit
);
/ ........ / //.........表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。
/*一個 .v文件中主要由 一個或多個 module ... endmodule塊組成
每個module塊內(nèi)包括:模塊名,輸入端口,輸出端口,以及多個時序電路,組合電路等組成
*/
// 簡單的時序電路組成
always@(posedge clk or negedge resetn)
begin
if(~resetn) // 或者 if(!resetn) 取 resetn 反
begin
d<=16'h0;
end
else
begin
if(en) // if en ==1 那么 d等于a*b+a/b;否則d<=0
d<=ab+a/b; // + , - , ,/ 加減乘除
else
d<=0;
end
end
// 簡單的組合電路
always@(a or b) // 只要其中a或b一個變化就執(zhí)行always塊內(nèi)語句
begin
if(en) // verilog 語法 if ... else ...,在組合電路中一個if對應一個else,不能缺else,防止產(chǎn)生鎖存器
c<=a*b+a/b;
else
c<=0;
end
wire[8:0] sum; // 常見變量定義類型:wire-線網(wǎng)型,reg-寄存器
assign sum =a+b; // 組合電路賦值,關(guān)鍵字 assign
wire[15:0] multy;
assign multy = (en ) ? ab :0;// 如果 en ==1,那么 multy =ab,否則multy =0;
wire e;
assign e =&a; // & 按位與
wire f;
assign f =|b;// | 按位或
wire [8:0] c_sum;
// 實例化模塊
my_add u_add_top( // my_add 模塊名 ,u_add_top 實例化名
.clk(clk), //端口連接輸入
.resetn(resetn),//端口連接輸入
.a(a),//端口連接輸入
.b(b),//端口連接輸入
.c(c_sum)//端口連接輸出
);
endmodule
這個小程序表述了一個.v文件包含了常用的verilog語法,變量的定義類型包括:wire,reg等,常見的運算符號跟C語言中相同,理解較容易。在這個例子中存在著兩個模塊。模塊test_project_top引用由模塊my_add定義的實例部件u_add_top。模塊test_project_top是頂層模塊。模塊my_add則被稱為子模塊。在實例部件u_add_top中,帶 “.”的表示被引用模塊的端口,名稱必須與被引用模塊my_add的端口定義一致,小括號中表示在本模塊中與之連接的線路。
2.1.2 Verilog用于模塊的測試
Verilog 還可以用來描述變化的測試信號。描述測試信號的變化和測試過程的模塊也叫做測試平臺(Testbench 或Testfixture),它可以對上面介紹的電路模塊(無論是行為的或結(jié)構(gòu)的)進行動態(tài)的全面測試。通過觀測被測試模塊的輸出信號是否符合要求,可以調(diào)試和驗證邏輯系統(tǒng)的設(shè)計和結(jié)構(gòu)正確與否,發(fā)現(xiàn)問題及時修改。
下面我們來看一個Verilog的測試模塊,
// 測試激勵產(chǎn)生
`timescale 1ns / 1ps
module test_project_top_tb; // 測試文件模塊名
// 信號測試激勵,輸入變量聲明
reg clk ;
reg reset;
reg [7:0] a;
reg [7:0] b;
reg en;
// 輸出變量聲明
wire[8:0] c;
wire [15:0] d;
// 信號變量初始化 ,關(guān)鍵字 initial
initial
begin
clk =0;
reset =0;
a =0;
b =0;
en =0;
#1000; // 在1000 ns后 reset拉高
reset =1;
end
// 時鐘生成
always #5 clk =~clk; //時鐘周期 10ns ,每隔5ns 取反一次
always @(posedge clk)
begin // {$random} 為系統(tǒng)任務(wù),它會產(chǎn)生一個隨機數(shù)
#1 a= {$random}%256; // 產(chǎn)生隨機的位信號流a和b ,%256為做模256運算
#3 b = {$random}%256; // 分別延遲1和3個時間單位后產(chǎn)生隨機的位信號流a 和b
end
always #10000 en = !en; //產(chǎn)生周期為10000個單位時間的選通信號變化
// 實例化 被測試模塊
test_project_top u_top(
.clk(clk), // 時鐘輸入
.resetn(reset), // 復位
.a(a), //信號輸入,信號a 位寬為8 bit
.b(b), //信號輸入,信號b 位寬為8 bit
.en(en), // 信號是能輸入 信號en 位寬為1 bit
.c(c), // 寄存器類型定義,信號輸出 c為9bit
.d(d) // 寄存器類型定義,信號輸出 d 為16bit
);
endmodule
本測試例程是對2.1.1中的小程序的測試,屬于RTL級功能仿真,主要調(diào)試語法及時序信號是否跟設(shè)計時一致。對于初學者來說,這是最基本的技能,必須熟練掌握。
圖1 仿真時序圖
2.1.3 總結(jié):
通過上面這些的例子可以看到以下幾點:
(1) Verilog HDL程序是由模塊構(gòu)成的。每個模塊的內(nèi)容都是位于module和endmodule兩個語句之間,每個模塊實現(xiàn)特定的功能。
(2) 模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數(shù)字電路設(shè)計分割成不同的小模塊來實現(xiàn)特定的功能。
(3) 每個模塊都是可以綜合的,通過綜合工具可以把它們的功能描述全都轉(zhuǎn)換為最基本的邏輯單元描述,最后可以用一個上層模塊通過實例引用把這些模塊連接起來,把它們整合成一個很大的邏輯系統(tǒng)。
(4) Verilog 模塊可以分為兩種類型:一種是為了讓模塊最終能生成電路結(jié)構(gòu),另一種只是為了測試所設(shè)計的電路其邏輯功能是否正確。
(5) 每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行 描述。
(6) Verilog HDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。
(7) 除了endmodule語句外,每個語句和數(shù)據(jù)定義的最后必須有分號。
(8) 可以用/ ..... /和//.......對Verilog HDL程序的任何部分作注釋。一個好的,有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。
-
元器件
+關(guān)注
關(guān)注
113文章
4782瀏覽量
93659 -
Verilog
+關(guān)注
關(guān)注
28文章
1362瀏覽量
111281 -
HDL
+關(guān)注
關(guān)注
8文章
330瀏覽量
47684 -
數(shù)字系統(tǒng)
+關(guān)注
關(guān)注
0文章
147瀏覽量
21069
發(fā)布評論請先 登錄
相關(guān)推薦
Verilog HDL語言編程基礎(chǔ)與FPGA常用開發(fā)工具
FPGA視頻教程之Verilog語法基礎(chǔ)的詳細資料說明

FPGA之硬件語法篇:Verilog關(guān)鍵問題解惑

fpga用什么編程語言_fpga的作用
Verilog是編程語言嗎
FPGA編程語言之verilog語法2

評論