一、基本概念
-大小寫:相關,關鍵字均爲小寫;
-註釋:同C語言,
//爲單行註釋
/* 多行
註釋
不允許再嵌套多行註釋*/
-操作符:同C,分單目、雙目、三目;
-數字聲明:
-指明位數:
<size>'<base format><number>
-<size>表示數字位寬度,表示位寬的數字前面加“-“(減號)表示其是一個負數,減號不能放於基數與數字之間。
-基數格式有:十六進制('h或'H)、十進制('d或'D)、八進制('o或'O)、二進制('b或'B)
-數字包含:0-9、a-f
-不指明位數:
沒有指定基數,默認爲十進制數;沒有指定位寬度,默認與仿真器和使用的計算機相關
-X與Z:
x或X:不確定值
z或Z:高阻值,“?”是z的另一種表示
e.g.:12'h13x 12位十六進制數,四位低位不確定;
-數值表示:左邊爲最高有效位,右邊爲最低有效位;
-實數:十進制表示或指數表示均合法;
-數擴展:若某數的最高位爲0、x、z,則分別用其進行擴展,填充其餘更高位;若某數最高位爲1,則用0來進行擴展;
-下劃線:可以出現在數字中,編譯階段會被忽略,"12'b1111_0011_0000"是合法的。
-字符串:雙引號括起來,不能多行書寫;Verilog中字符串當作一個單字節的ASCII字符隊列。轉移標識符同C。
-邏輯狀態:
0:邏輯0、邏輯非、低電平
1:邏輯1、邏輯真、高電平
x:不確定的邏輯狀態
z:高阻態
-強度值:
-線網(net):硬件單元之間的連接。包含一系列數據類型。線網由其連接器件的輸出端連續驅動。
-寄存器(register):用來表示存儲元件,保持原有數值直到被改寫。僅表示一個保存數值的變量。不需要驅動源或時鐘信號。使用關鍵字reg聲明,默認值爲x。也可以聲明爲帶符號(signed)類型的變量。
e.g.:reg signed [63:0] m;//聲明64位帶符號值
-向量:通過[high#:low#]或[low#:high#]說明,括號中左邊數總是表示向量的最高有效位。可以指定向量的某一位或若干個相鄰位。
e.g.:wire [7:0] bus;
reg [0:40] virtual_addr;//最高有效位是第0位
Bus[2:0]//最低三位
virtual_addr[0:1]//兩個最高位
-可變的向量域選擇:
[<starting_bit>+:width]:從起始位置開始遞增,位寬爲width
[<starting_bit>-:width]:從起始位置開始遞減,位寬爲width
起始位可以是變量,但位寬必須是常量。
-整數:integer
-實數:real
-時間寄存器:time,通過調用系統函數$time可以得到當前仿真時間。
-數組:<數組名>[<下標>]
e.g.:integer count[0:7];
reg [4:0] port_id[0:7];
integer matrix[4:0][0:255];//二維數組
-存儲器:使用寄存器的一位數組來表示存儲器。
-參數:使用關鍵字parameter在模塊內定義常數,不能像變量那樣賦值,可以在編譯階段被重載,可以通過模塊實例化或使用defparam語句改變參數值。使用localparam來定義局部參數,值不能改變,不能通過參數重載語句或通過有序參數列表或命名參數賦值來直接修改。
-通過模塊實例化修改:
在模塊實例化時可以改變參數值,#(5)只修改Width的值。
-通過defparam修改:
-系統任務(系統函數):常用的有:
顯示信息:$display(p1,p2,p3,……);
格式類似printf
監視信息:$monitor(p1,p2,p3,……);
$monitoron;
$monitoroff;
格式類似printf,進行不間斷監視,當發生變化時顯示所有參數數值。
暫停結束仿真:$stop $finish
-編譯指令: `<keyboard>(撇號是鍵盤左上角的波浪線的撇號`,不是單引號')
`define:用於定義文本宏;如定義全局變量,調用全局變量時也要加`撇號。
`include:用於將內含全局或公用定義的頭文件包含在設計文件中。
二、層次建模
模塊 (module):基本功能單元
Verilog使用模塊的概念(module)來代表一個基本的功能塊。模塊通過接口(輸入和輸出)被高層的模塊調用,但隱藏了內部的實現細節。
在每個模塊內部可以在四個抽象層次中進行描述,而對外顯示的功能都是一樣的,僅與外部環境有關:
-允許在一個模塊中有=混合使用多個抽象層級。
-RTL(寄存器傳輸級Register transfer level)描述在很多情況下是指能夠被邏輯綜合工具接受的行爲級和數據流級的混合描述。
-一般來說抽象的層次越高,設計的靈活性和工藝無關性越強。
-不允許在模塊聲明中嵌套模塊。
-在設計數字電路時採用自頂向下方法與自底向上方法的結合的方式。
當一個模塊被調用時Verilog會根據模板創建一個唯一的模塊對象。
-從模板創建對象的過程稱爲實例化,創建的對象稱爲實例。
邏輯仿真
完成測試功能的塊稱爲激勵塊,一般均稱做測試臺,同樣可以使用Verilog來描述。有兩種模式:
一種模式是在激勵塊中調用實例應用並直接驅動設計塊:
一種是在虛擬的頂層模塊中調用實例應用激勵塊和設計塊,塊之間通過接口進行交互: