盲盒小程序搭建網(wǎng)站優(yōu)化平臺(tái)
一、概述
Verilog
是一種用于數(shù)字邏輯電路設(shè)計(jì)的硬件描述語言,可以用來進(jìn)行數(shù)字電路的仿真驗(yàn)證、時(shí)序分析、邏輯綜合。
既是一種 行為級(jí)(可用于電路的功能描述) 描述語言又是一種 結(jié)構(gòu)性(可用于元器件及其之間的連接) 描述語言。
二、Verilog模塊基本概念
模塊(block)是Verilog的基本單位,除了編譯指令,其他的所有的設(shè)計(jì)代碼都必須放在一個(gè)或多個(gè)模塊中。
一個(gè)模塊內(nèi)部可以使用其他模塊,稱為實(shí)例。上層模塊可以引用底層任意層次模塊的變量,模塊內(nèi)部可以包含若干個(gè) “塊”。
三、Verilog模塊總結(jié)
-
Verilog
中的標(biāo)示符可以是任意一組字母、數(shù)字、$符號(hào)和下劃線符號(hào)的組合,但標(biāo)示符的第一個(gè)字符必須是字母或者下劃線。標(biāo)示符區(qū)分大小寫 -
Verilog
程序是有模塊組成的,每個(gè)模塊嵌套在module和endmodule聲明語句中。模塊是可以進(jìn)行層次嵌套的 -
每個(gè)
Verilog
源文件中只準(zhǔn)有一個(gè)頂層模塊,其他為子模塊 -
每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸出端口,然后對(duì)模塊的功能進(jìn)行行為邏輯描述
-
程序書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句可以分幾行寫
-
除了endmodule語句,begin…end語句,fork…join語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號(hào)
-
可用
/*...*/
和//...
對(duì)程序的任何部分做注釋 ,加上必要的注釋,以增強(qiáng)程序的可度性和可維護(hù)性。
四、Verilog用于模塊的測試
檢查程序的功能是否正確要求:
-
需要有測試激勵(lì)信號(hào)輸入到被測模塊
-
需要記錄被測模塊的輸出信號(hào)
-
需要把用功能和行為描述的Verilog模塊轉(zhuǎn)換為門級(jí)電路互連的電路結(jié)構(gòu)(綜合)
-
需要對(duì)已經(jīng)轉(zhuǎn)換為門級(jí)電路結(jié)構(gòu)的邏輯進(jìn)行測試(門級(jí)電路仿真)
-
需要對(duì)布局布線后的電路結(jié)構(gòu)進(jìn)行測試 (布局布線后仿真)
何為仿真?為何要仿真?
仿真是對(duì)電路模塊進(jìn)行動(dòng)態(tài)的全面測試,通過觀測被測試模塊的輸出信號(hào)是否符合要求可以調(diào)試和驗(yàn)證邏輯系統(tǒng)的設(shè)計(jì)和結(jié)構(gòu)是否準(zhǔn)確,并發(fā)現(xiàn)問題及時(shí)修改。
仿真可以在幾個(gè)層面上進(jìn)行?每個(gè)層面的仿真有什么意義?
-
仿真有:前(RTL)仿真,邏輯網(wǎng)表仿真,門級(jí)仿真和布線后仿真;
-
前仿真:前(RTL)仿真,邏輯網(wǎng)表仿真,門級(jí)仿真;可以調(diào)試和驗(yàn)證邏輯系統(tǒng)的設(shè)計(jì)和結(jié)構(gòu)準(zhǔn)確與否,并發(fā)現(xiàn)問題及時(shí)修改。
-
布線后仿真:分析設(shè)計(jì)模塊運(yùn)行是否正常;
模塊的結(jié)構(gòu)
Verilog
的基本設(shè)計(jì)單元是"模塊(block
)"
verilog
模塊的結(jié)構(gòu)由在module
和endmodule
關(guān)鍵字之間的4個(gè)主要部分組成:
module block1(a,b,c,d); //端口定義input a,b,c;output d; //I/O聲明wire x; //信號(hào)類型聲明assign d = a | x;assign x = (b &~c); //功能描述
endmodule
五、邏輯功能的定義
在Verilog
中有3種方法可以描述電路的邏輯功能:
1. 用assign語句(連續(xù)賦值語句,常用于描述組合邏輯)
assign x = (b &~c);
2.用元件例化(instance 門元件例化)
and(門元件關(guān)鍵字) u_and3(例化原件名)(f,a,b,c);
注1:元件例化即是調(diào)用Verilog提供的元件;
注2:元件例化包括門元件例化和模塊元件例化;
注3:每個(gè)實(shí)例元件的名字必須唯一,以避免與其他調(diào)用元件的實(shí)例相混淆;
注4:例化元件名也可以省略。
3.用"always"塊語句
always @(posedge clk) //當(dāng)時(shí)鐘上升沿到來時(shí)執(zhí)行一遍塊內(nèi)語句
beginif(load)out = data; //同步預(yù)置數(shù)據(jù)elseout = data + cin +1; //加1計(jì)數(shù)
end
注1:”always“塊語句常用于描述時(shí)序邏輯,也可描述組合邏輯;
注2:”always“塊可用多種手段來表達(dá)邏輯關(guān)系,如用if…else語句或case語句;
注3:”always“塊語句與assign語句是并發(fā)執(zhí)行的,assign語句一定要放在”always“塊語句之外。
模塊結(jié)構(gòu)模板:
module <頂層模塊名> (<輸入輸出端口列表>);output 輸出端口列表;input 輸入端口列表;//更推薦
module <頂層模塊名> (output 輸出端口列表,input 輸入端口列表
);//1.使用assign語句定義邏輯功能
wire 結(jié)果信號(hào)名;
assign <結(jié)果信號(hào)名> =表達(dá)式;//2.使用always塊定義邏輯功能
always@(<敏感信號(hào)表
begin//過程賦值語句//if語句//case語句//while,repeat,for循環(huán)//task,function調(diào)用
end//3.文件例化
<module_name > <instance_name>(<port_list>);//模塊元件例化<gate_type_keyword > <instance_name>(<port_list>);//門元件例化
endmodule
六、標(biāo)示符
任何用Verilog
語言描述的東西都可以通過其名字來識(shí)別,這個(gè)名字被稱為標(biāo)示符;
如源文件名,模塊名,端口名,變量名,常量名,實(shí)例名等
標(biāo)示符可由字母,數(shù)字,$
和下劃線組成,但第一個(gè)字符必須是字母或下劃線,不能是$和數(shù)字
在Verilog
中標(biāo)示符是區(qū)分大小寫的,且不能與關(guān)鍵字同名。