可綜合的語(yǔ)法是指硬件能夠?qū)崿F(xiàn)的一些語(yǔ)法,這些語(yǔ)法能夠被EDA工具支持,能夠通過(guò)編譯最終生成用于燒錄到FPGA器件中的配置數(shù)據(jù)流。
一、模塊聲明類(lèi)語(yǔ)法:module...endmodule
每個(gè)verilog文件中都會(huì)出現(xiàn)模塊聲明類(lèi)語(yǔ)法,它是一個(gè)固定的用法,所有的功能實(shí)現(xiàn)都應(yīng)該包含在...之中。示例如下:
module my_first_prj(<端口信號(hào)列表>...)
<邏輯代碼>...
endmodule
二、端口聲明:input,output,inout
每一個(gè)module都會(huì)有輸入/輸出的信號(hào)用于和外部器件或其它module通信銜接。對(duì)于本地module而言,這些信號(hào)可以歸為三類(lèi),即輸入(input)信號(hào)、輸出(output)信號(hào)和雙向(inout)信號(hào)。示例如下:
input sys_clk;
input wite rst_n;
input[7:0] data_in;
三、參數(shù)定義:parameter
Parameter用于申明一些常量,主要是便于模塊的移植或升級(jí)時(shí)的修改。示例如下:
module<模塊命名>(<端口命名1>,<端口命名2>,...);
//輸入端口申明
input<端口命名1>;
input wire<端口命名2>;
input[<最高位>:<最低位>]<端口命名3>;
...
//輸出端口申明
output<端口命名4>;
output[<最高位>:<最低位>]<端口命名5>;
output reg[<最高位>:<最低位>]<端口命名6>;
...
//參數(shù)定義
parameter<參數(shù)命名1>=<默認(rèn)值1>;
parameter[<最高位>:<最低位>]<參數(shù)命名2>=<默認(rèn)值2>;
...
//具體功能邏輯代碼
...
endmodule
四、信號(hào)類(lèi)型:wite,reg等
在下圖所示的簡(jiǎn)單電路中,分別定義兩個(gè)寄存器(reg)鎖存當(dāng)前的輸入din。每個(gè)時(shí)鐘clk上升沿到來(lái)時(shí),reg都會(huì)鎖存到新的輸入數(shù)據(jù),而wire就是這兩個(gè)reg之間直接的連線(xiàn)。 //圖 作為input或inout的信號(hào)端口只能是wire型,而作為output的信號(hào)端口則可以是wire或reg。示例如下:
//定義一個(gè)wire信號(hào)
wire;變量名>
//給一個(gè)定義的wire信號(hào)直接連接賦值
//該定義等同于分別定義一個(gè)wire信號(hào)和使用assign語(yǔ)句進(jìn)行賦值
wire=<常量或變量賦值>;變量名>
//定義一個(gè)多bit的wire信號(hào)
wire[<最高位>:<最低位>];變量名>
//定義一個(gè)reg信號(hào)
reg;變量名>
//定義一個(gè)賦初值的reg信號(hào)
reg=<初始值>;變量名>
//定義一個(gè)多bit的reg信號(hào)
reg[<最高位>:<最低位>];變量名>
//定義一個(gè)賦初值的多bit的reg信號(hào)
reg[<最高位>:<最低位>]=<初始值>;變量名>
//定義一個(gè)二維的多bit的reg信號(hào)
reg[<最高位>:<最低位>][<最高位>:<最低位>];變量名>
多語(yǔ)句定義:begin...end
//含有命名的begin語(yǔ)句
begin:<塊名>
//可選申明部分
//具體邏輯
end
//基本的begin語(yǔ)句
begin
//可選申明部分
//具體邏輯
end
五、比較判斷:if...else,case...default...endcase
示例如下:
//if判斷語(yǔ)句
if(<判斷條件>)
begin
//具體邏輯
end
//if...else判斷語(yǔ)句
if(<判斷條件>)
begin
//具體邏輯1
end
else
begin
//具體邏輯2
end
//if...else if ...else判斷語(yǔ)句
if(<判斷條件1>)
begin
//具體邏輯1
end
else if(<判斷條件2>)
begin
//具體邏輯2
end
else
begin
//具體邏輯3
end
//case語(yǔ)句
case(<判斷變量>);
<取值1>:<具體邏輯1>
<取值2>:<具體邏輯2>
<取值3>:<具體邏輯3>
default:<具體邏輯4>
endcase
六、循環(huán)語(yǔ)句:for
使用較少,示例如下:
//for語(yǔ)句
for(<變量名>=<初值>;<判斷表達(dá)式>;<變量名>=<新值>)
begin
//具體邏輯
end
七、任務(wù)定義:task...endtask
task類(lèi)似于C的子函數(shù),可以有input、output和inout端口作為輸入口參數(shù),可以用來(lái)實(shí)現(xiàn)單時(shí)序控制,無(wú)返回值,不可用于表達(dá)式之中。示例如下:
task;命名>
//可選申明部分,如本地變量申明
begin
//具體邏輯
end
endtask
八、連續(xù)賦值:assign,問(wèn)號(hào)表達(dá)式(?:)
Assign用于直接互連不同的信號(hào)或者直接給wire變量賦值。其基本用法如下: assign=<變量或常量>;變量名>
?:表達(dá)式就是簡(jiǎn)單的if...else語(yǔ)句,示例如下:
(判斷條件)?(判斷條件為真時(shí)的邏輯處理):(判斷條件為假時(shí)的邏輯處理)
九、always模塊
敏感表可以為電平、沿信號(hào)posedge/negedge,通常和@連用。組合邏輯的用法如下:
always@(*)
begin
//具體邏輯
end
always之后若有沿信號(hào)(上升沿posedge,下降沿negedge)申明,則多為時(shí)序邏輯,用法如下:
//單個(gè)沿觸發(fā)的時(shí)序邏輯
always@(<沿變化>)
begin
//具體邏輯
end
always@(<沿變化1> or <沿變化2>)
begin
//具體邏輯
end
十、運(yùn)算操作符
包括邏輯操作符、移位操作符、算術(shù)操作符大多可以進(jìn)行綜合,列表如下:
+ //加
- //減
! //邏輯非
~ //取反
& //與
~& //與非
| //或
~| //或非
^ //異或
^~ //同或
~^ //同或
* //乘,是否可綜合看綜合工具
/ //除,是否可綜合看綜合工具
% //取模
<< //邏輯左移
>> //邏輯右移
< //小于
<= //小于等于
< //大于
= //大于等于
== //邏輯相等
!= //邏輯不相等
&& //邏輯與
|| //邏輯或
十一、賦值符號(hào):=和<=
分別為阻塞賦值和非阻塞賦值,后續(xù)博客詳細(xì)介紹。
以上便是Verilog基礎(chǔ)語(yǔ)法,在RTL設(shè)計(jì)中,需要掌握。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1626文章
21678瀏覽量
602037 -
Verilog
+關(guān)注
關(guān)注
28文章
1345瀏覽量
109996 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59710 -
編譯
+關(guān)注
關(guān)注
0文章
654瀏覽量
32813
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論