前言
學習Verilog和學習任何一門編程語言一樣,都需要從語法開始,不會語法去學習設計是幾乎不可能的,當然從另一門類似語言轉來的除外(例如VHDL是你的第一門硬件描述語言)。學會了語法不懂硬件思維也不可以,因爲你不能使用軟件思維來設計硬件電路。
本系列其他博文:
初學者值得一讀的博文:
FPGA/ASIC初學者應該學習Verilog還是VHDL?
本文以極簡的風格來談談這一篇博文的話題,verilog中的初級語法。
正文
註釋
Verilog提供了兩種註釋的方式,分別爲:
- 單行註釋
//This is a single line comment
當然,你這樣寫也可以:
/////////////////// This is Okay!
這是因爲雙斜槓後面的都是註釋!
- 多行註釋
/* this is a
multiple line
comments!
*/
空格
verilog中的空格是起到縮進的作用,基本沒有什麼要求,你可以使用TAB鍵,空格鍵,回車鍵在代碼中的任何位置,它幾乎會被語法忽略,但是爲了代碼的可讀性,還是建議遵守一定的規則。
注:空格在字符串中不會被忽略!
例如:
always@(*) begin
//--------
c = a + b;
adder inst_adder(
.i_a(i_a),
.i_b(i_b),
.o_dout(o_dout),
.o_sum(o_sum)
);
end
以美觀易讀爲準,或者和公司標準保持一致,做個正常人。
操作符
操作符分爲三種,本文不詳細展開:
- 一元運算符應顯示在其操作數的左側
- 二進制運算符應出現在其操作數之間
- 條件運算符有兩個單獨的運算符,它們將三個操作數分開
例如:
//一元操作符
b = ~a;
//二元操作符
assign c = a & b;
//條件操作符
assign z = en ? a : b;
數字格式
我們最常見的數字表示爲十進制,然而,數字還可以表示爲二進制,八進制,以及十六進制等,其中二進制和十六進制較爲常見。
默認情況下,Verilog仿真器會把數字默認爲十進制,除非你使用特定的格式告訴它,你使用的是二進制,八進制或者十六進制。
例如:
3'b001;
3表示的是這個數字有多少位;b表示的是進制,這裏表示的是二進制,八進制用o來表示,十六進制用h,十進制用d,當然如果不寫進制,而默認爲十進制。
例如:
reg [3:0] b = 10;
則b被初始化爲十進制10;
如下分別爲二進制,十六進制,八進制以及十進制的表示方法:
```c
3'b001; // this is binary
8'ha0; // this is hexadecimal
6'o12; // this is octal
4'd15; // this is decimal
Verilog 2001標準更新了一些用法,例如可以省去位寬也可以:
initial begin
a = 'b001; // this is binary
b = 'ha0; // this is hexadecimal
c = 'o12; // this is octal
d = 'd15; // this is decimal
end
這時,編譯器會根據左邊變量的位寬來自動擴展右邊數值或者截位後賦值給左邊。
還有需要注意的是,如果需要給一個有符號reg型變量賦值一個負數值,如何表達呢?
如下:
reg signed [7:0] a = -8'd21;
也就是說,負號必須放在位數的前面,如下這種寫法就是錯誤的:
8'd-4; // Illegal
字符串
Verilog中的字符串使用場景大多數是在仿真時使用,它由雙引號包裹着(位於雙引號之間)。字符串中的一個字符使用一個字節來存儲。
"Hello World!" // String with 12 characters -> require 12 bytes
"x + z" // String with 5 characters
字符串中的字符不能分割成多行來寫,如下是不合規的:
"How are you
feeling today ?" // Illegal for a string to be split into multiple lines
標識符
標識符就是變量的名字以及模塊的名字,它們可以有大小寫字母,數字,美元符號,下劃線構成,但是美元符號$以及數字不能作爲標識符的開頭,如下:
integer var_a; // Identifier contains alphabets and underscore -> Valid
integer $var_a; // Identifier starts with $ -> Invalid
integer v$ar_a; // Identifier contains alphabets and $ -> Valid
integer 2var; // Identifier starts with a digit -> Invalid
integer var23_g; // Identifier contains alphanumeric characters and underscore -> Valid
integer 23; // Identifier contains only numbers -> Invalid
關鍵字
關鍵字是保留用於定義語言結構的特殊表示符,用小寫字母表示,每一種語法都有其關鍵字,Verilog語法也不例外,你在給模塊以及變量命名的時候應該避開這些關鍵字:
verilog修訂
多年來,Verilog進行了一些修訂,從1995到2001年進行了更多的添加,如下圖:
寫在最後
我的微信公衆號:FPGA LAB
我的知乎二維碼 :