Verilog初級教程(2)Verilog HDL的初級語法

前言

學習Verilog和學習任何一門編程語言一樣,都需要從語法開始,不會語法去學習設計是幾乎不可能的,當然從另一門類似語言轉來的除外(例如VHDL是你的第一門硬件描述語言)。學會了語法不懂硬件思維也不可以,因爲你不能使用軟件思維來設計硬件電路。

本系列其他博文:

Verilog初級教程(1)認識 Verilog HDL

初學者值得一讀的博文:

FPGA/ASIC初學者應該學習Verilog還是VHDL?

Verilog以及VHDL所倡導的的代碼準則

FPGA基礎知識極簡教程(2)拋卻軟件思維去設計硬件電路

本文以極簡的風格來談談這一篇博文的話題,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

參考:算術運算的RTL代碼規則總結

字符串

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修訂

多年來,Verilog進行了一些修訂,從1995到2001年進行了更多的添加,如下圖:

Verilog修訂對比

寫在最後

參考資料

我的微信公衆號:FPGA LAB

我的知乎二維碼 :
知乎二維碼

我的同行邀請

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章