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