前面的學習筆記是在看程序時遇到什么問題就記下來然后去查資料整理的,后續的學習筆記會更加系統的整理verilog相關的內容。
Verilog作為硬件電路語言,將電路抽象為程序,用代碼去控制電路的運行。我們可以使用verilog語言去實現各種各樣的功能。當需要去完成一個復雜的工程時,我們需要將工程分解為多層次的任務,在將工程分解為任務后,我們要用硬件語言去實現這些任務,verilog在實現功能時將抽象為以下五個級別。
抽象級別:
系統級:用語言提供的高級結構實現模塊外部性能
算法級:實現算法運行
RTL級:數據在寄存器之間流動和處理,控制這些數據流動的模型
上面3個都是行為描述,下面兩個與邏輯電路有明確對應
門級:邏輯門的描述
開關級:三極管和儲存節點
下面介紹構成verilog程序的幾個主要部分
verilog程序主要由模塊組成,由不同的模塊可以建立一個結構復雜的大型工程。
首先是always語句
always @(s or a or b)
out=a;
s,a,b三者任意一個出現變化就執行后續的語句
沒有always的模塊會一直響應和電路一樣
下面添加的延遲是在模塊輸入到輸出的延遲
And #1 U1();
And #1 U2();
Assign 賦值語句,用reg類型的變量對wire類型的變量賦值,要用到assign
module add(a,b,c,d) input[2:0] a,b; output[2:0] c; output d;
assign{d,c}=a+b; endmodule
輸入量一般是reg型,輸出一般是wire型,上面的程序實現的是2位帶進位的加法。
其中d是進位,c是a和b的和。通過這樣的語法,我們就用verilog語言實現了電路的功能。
一個模塊可以實現的功能是有限的,特別是像verilog這樣的硬件語言,我們為了實現復雜的功能一般需要多個模塊互相調用。
調用verilog內部模塊bufif1,其中bufif1是模塊,mybuf是實例名。verilog自帶了很多的模塊,這些模塊是已經成熟的電路結構,平時直接調用即可。
bufif1 mybuf(out, in,enable);
當我們需要調用其他v文件時,和c語言類似,在v文件的開頭進行引用即可。
`include”muxtwo.v”
verilog程序由模塊構成。模塊主要分為端口和邏輯功能實現,而模塊之間是通過端口來交互數據的,當引用模塊時要嚴格按聲明順序輸入端口變量。
端口變量主要分為3種:
input輸入變量
output輸出變量
inout輸入輸出變量
邏輯功能主要分為3個部分:
1 Assign聲明語句,最常用的組合邏輯聲明。
2 實例引用,調用其他的模塊
3 Always內部順序執行,多個always間並行,稱為過程塊,只有上面兩個可以獨立於過程塊存在,其他的語句要在過程塊內。既可以描述組合邏輯,也可以描述時序邏輯。
三者是並發運行的,沒有添加時延的話就是同時運行。
verilog中的數字表示:
z代表高阻態
?也代表高阻太態
x代表不定值
_下划線分隔數的表達,提高可讀性,只能用在確定的數
當常量不說明位數,默認位寬為32位
Parameter常數定義
可以通過引用實例改變模塊內部的parameter
module a(A,F): parameter w=1.p=1;
... endmodule module top: A #(4,0) D1(A,F); //將wp改為4,0 A #(3) D2(A,F); //將w改為3 endmodule