一、基本概念
1.1 硬件描述語(yǔ)言
硬件描述語(yǔ)言,Hardware Description Language (HDL)。利用HDL,可以根據(jù)電路結(jié)構(gòu)的特點(diǎn),采用層次化的設(shè)計(jì)結(jié)構(gòu),將抽象的邏輯功能用電路的方式進(jìn)行實(shí)現(xiàn)。之后通過(guò)EDA(電子設(shè)計(jì)自動(dòng)化)工具,可以將HDL程序綜合成網(wǎng)表,通過(guò)自動(dòng)布線工具把網(wǎng)表轉(zhuǎn)換為具體電路布線結(jié)構(gòu),用于專用集成電路(Application Specific Integrated Circuit,ASIC)和現(xiàn)場(chǎng)可編程門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)的實(shí)現(xiàn)。
Verilog HDL和VHDL是兩種常用的硬件描述語(yǔ)言。
1.2 可重用性與IP核
模塊的可重用性對(duì)于硬件電路的開(kāi)發(fā)效率的提高至關(guān)重要,因此提出了集成電路的軟核、硬核和固核的概念。
軟核(Soft Core) 一般是指經(jīng)過(guò)功能驗(yàn)證、5000門(mén)以上的可綜合Verilog HDL或VHDL模型,軟核與設(shè)計(jì)方法和電路采用的工藝無(wú)關(guān)。
固核(Firm Core)通常是指在FPGA器件上,經(jīng)過(guò)綜合驗(yàn)證、大于5000門(mén)的電路網(wǎng)表文件。
硬核(Hard Core)通常是指在ASIC器件上,經(jīng)過(guò)驗(yàn)證,正確的、大于5000門(mén)的電路結(jié)構(gòu)版圖掩模。
三者的聯(lián)系與區(qū)別:軟核、固核、硬核是目前數(shù)字集成電路功能單元模塊在不同層級(jí)使用的三種形式,可以簡(jiǎn)單理解為 軟核 > 固核 > 硬核。軟核采用可讀性較高的可綜合HDL實(shí)現(xiàn),其可維護(hù)性和可重用性程度高,使用更加靈活和便捷。固核和硬核是針對(duì)不同芯片平臺(tái)的功能能單元,性能穩(wěn)定,不宜修改。
IP核:IP核是具有知識(shí)產(chǎn)權(quán)核的集成電路芯核的總稱,是經(jīng)過(guò)反復(fù)驗(yàn)證的、具有特定功能的紅模塊,且該模塊與芯片制造工藝無(wú)關(guān),可以移植到不同的半導(dǎo)體工藝中。
如下圖所示,在SoC芯片的設(shè)計(jì)生產(chǎn)過(guò)程中,芯片的生產(chǎn)廠家只需根據(jù)設(shè)計(jì)需要購(gòu)入相應(yīng)功能的IP核,再將這些IP核按照設(shè)計(jì)要求進(jìn)行組合,即可完成所需特定功能的設(shè)計(jì)。
1.3 組合邏輯和時(shí)序邏輯
1、組合邏輯:
組合邏輯的特點(diǎn)是任意時(shí)刻的輸出僅取決于該時(shí)刻的輸入,與電路原本的狀態(tài)無(wú)關(guān),邏輯中不牽涉跳變沿信號(hào)的處理,組合邏輯的verilog描述方式有兩種:
(1)always@(電平敏感信號(hào)列表)
always模塊的敏感信號(hào)列表為所有輸入信號(hào);
組合邏輯中的賦值建議使用阻塞賦值”=“;
always 模塊中的信號(hào)必須定義為reg 型,但最終的綜合得到的組合邏輯電路中并沒(méi)有寄存器。
(2)assign描述的連續(xù)賦值語(yǔ)句
2、時(shí)序邏輯:
時(shí)序邏輯的特點(diǎn)為任意時(shí)刻的輸出不僅取決于該時(shí)刻的輸入,而且還和電路原來(lái)的狀態(tài)有關(guān)。時(shí)序邏輯電路里面有存儲(chǔ)元件,不管其輸入如何變化,僅當(dāng)時(shí)鐘發(fā)生跳變時(shí),輸出才可能會(huì)變化。
(1)always@(邊沿敏感型信號(hào)列表)
時(shí)序邏輯的敏感信號(hào)列表為時(shí)鐘信號(hào)(以及復(fù)位信號(hào))和部分輸入信號(hào);
時(shí)序邏輯中的賦值建議使用非阻塞賦值“<=”。
二、Verilog HDL基礎(chǔ)知識(shí)
此處所有的內(nèi)容都可見(jiàn)本人另一篇博客(更加明了),[Verilog學(xué)習(xí)]一、Verilog語(yǔ)言快速入門(mén)
Verilog HDL語(yǔ)法來(lái)源于C語(yǔ)言基本語(yǔ)法,空白符、注釋符、標(biāo)識(shí)符、轉(zhuǎn)移標(biāo)識(shí)符、關(guān)鍵字等就不再贅述。
2.1 數(shù)據(jù)類型
在Verilog中數(shù)據(jù)類型一共有19種,分別是wire,tri,tri1,wand,triand,trireg,trior,wor,reg,large,small,scalared,medium,vectored,integer,time,real,parameter型??梢苑譃閮纱箢悾何锢頂?shù)據(jù)類型(連線型和寄存器型)和抽象數(shù)據(jù)類型(主要有整型,時(shí)間型,實(shí)型和參數(shù)型)。
- 物理數(shù)據(jù)類型中最主要用到的就是wire(連線型)和reg(寄存器型),它們的區(qū)別如下:
-
wire連線表示邏輯單元的物理連接,可以對(duì)應(yīng)為電路中的物理信號(hào)連接,這種變量類型不能保持電荷。連線型變量必須要有驅(qū)動(dòng)源,一種是連接到一個(gè)門(mén)或者模塊的輸出端;另一種使用assign連續(xù)賦值語(yǔ)句對(duì)其賦值。若沒(méi)有驅(qū)動(dòng)源,則保持高阻態(tài)z
-
reg寄存器型變量是數(shù)據(jù)存儲(chǔ)單元的抽象類型,其對(duì)應(yīng)的硬件電路元件具有狀態(tài)保持作用,能夠存儲(chǔ)數(shù)據(jù),如觸發(fā)器、鎖存器等。
reg型數(shù)據(jù)和wire型的區(qū)別在于,reg型數(shù)據(jù)能夠保持最后一次的賦值,而wire型數(shù)據(jù)需要有持續(xù)的驅(qū)動(dòng)。
- 抽象數(shù)據(jù)類型則是對(duì)純數(shù)字的抽象描述,不能夠與實(shí)際的硬件電路相映射,即不可綜合。
2.2 運(yùn)算符
詳細(xì)介紹見(jiàn)本人的另外一篇博客中1.2.2小節(jié),此處不再贅述
[Verilog學(xué)習(xí)]一、Verilog語(yǔ)言快速入門(mén)
2.3 模塊
模塊(module)是Verilog中的基本單元,它代表一個(gè)基本的功能塊,用于描述某個(gè)設(shè)計(jì)的功能或結(jié)構(gòu)以及與其他模塊通信的外部端口。模塊正是Verilog中層次化設(shè)計(jì)的體現(xiàn)。
詳細(xì)介紹見(jiàn)本人另外一篇博客,此處不再贅述
[Verilog學(xué)習(xí)]一、Verilog語(yǔ)言快速入門(mén)
三、Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式
3.1 數(shù)據(jù)流建模
數(shù)據(jù)流建模只有一種描述方式,即通過(guò)連續(xù)賦值語(yǔ)句進(jìn)行邏輯描述,其最基本的語(yǔ)句是由assign引導(dǎo)的。數(shù)據(jù)流建??梢悦枋鏊械慕M合邏輯電路。
語(yǔ)法格式:
<net_declaration><range><name>;
assign #<delay><name> = Assignment expression;
-
net_declaration,連線型變量類型,缺省為wire
-
range,變量位寬,缺省為1bit
-
delay,延時(shí),語(yǔ)法格式為:
#(delay1, delay2, delay3)
“delay1”稱為上升延時(shí),是連線型變量轉(zhuǎn)移到”1“狀態(tài)的延時(shí)值
“delay2”稱為下降延時(shí),是連線型變量轉(zhuǎn)移到”0“狀態(tài)的延時(shí)值
“delay3”稱為關(guān)閉延時(shí),是連線型變量轉(zhuǎn)移到”Z“狀態(tài)的延時(shí)值
// eg.
module example1_assignment(a,b,m,n,c,y)
input[3:0]a,b,m,n;
output[3:0]c,y;
assign y = m|n;
assign #(3,2,4)c = a&b;
endmodule
(1)賦值目標(biāo)只能是連線型(wire)
(2)在連續(xù)賦值中,只要賦值語(yǔ)句右邊表達(dá)式任何一個(gè)變量有變化,表達(dá)式立即被計(jì)算,計(jì)算的結(jié)果立即賦值給左邊的信號(hào)
(3)連續(xù)賦值語(yǔ)句不能出現(xiàn)在過(guò)程塊(行為級(jí)建模會(huì)提到,initial/always)中
(4)多個(gè)連續(xù)賦值語(yǔ)句之間是并行關(guān)系,與位置順序無(wú)關(guān)
(5)連續(xù)賦值語(yǔ)句中的延時(shí)具有硬件電路中慣性延時(shí)的特性,任何小于其延時(shí)量的信號(hào)變化脈沖都將被濾除,不會(huì)出現(xiàn)在輸出端口
下面通過(guò)兩段Verilog代碼,重點(diǎn)解釋一下并行關(guān)系
- 案例一:輸入信號(hào)為a和b,輸出信號(hào)為c和d,c和d之間沒(méi)有關(guān)系
module ParallelAssignmentExample(
input a, b,
output c, d
);
assign c = a & b; // 語(yǔ)句1:c 是 a 和 b 的邏輯與結(jié)果
assign d = a | b; // 語(yǔ)句2:d 是 a 和 b 的邏輯或結(jié)果
endmodule
在這個(gè)例子中,c
和d
的值都是并行計(jì)算的,不依賴于它們?cè)诖a中的順序。無(wú)論assign c = a & b;
和assign d = a | b;
這兩行語(yǔ)句的順序如何,它們都會(huì)在同一時(shí)鐘周期內(nèi)對(duì)輸入a
和b
進(jìn)行操作,并將結(jié)果分別賦值給c
和d
。
如果輸入a
和b
的值發(fā)生變化,那么c
和d
的值也會(huì)立即更新,而不需要等待前一個(gè)賦值語(yǔ)句完成。
- 案例二:輸入信號(hào)為a和b,輸出信號(hào)為c和d,且c是d的輸入信號(hào)之一
module DependencyExample(
input a, b,
output c, d
);
assign c = a & b; // 語(yǔ)句1:c 是 a 和 b 的邏輯與結(jié)果
assign d = c | !b; // 語(yǔ)句2:d 是 c 和 b 的非 的邏輯或結(jié)果
endmodule
在這個(gè)例子中,c
是a
和b
的邏輯與結(jié)果,而d
是c
(即a
和b
的邏輯與結(jié)果)和b
的非的邏輯或結(jié)果。盡管c
是d
的一個(gè)輸入,但由于這兩個(gè)賦值語(yǔ)句都是并行執(zhí)行的,因此c
的值會(huì)立即反映到d
的計(jì)算中。這就是說(shuō),如果右邊的表達(dá)式中包含了另一個(gè)連續(xù)賦值語(yǔ)句的輸出,那么該輸出值會(huì)立即用于計(jì)算。
3.2 行為級(jí)建模
Verilog行為描述語(yǔ)句及其可綜合性(能否生成實(shí)際的電路)如下
類別 | 語(yǔ)句 | 可綜合性 |
---|---|---|
過(guò)程語(yǔ)句 | initial | |
always | √ | |
語(yǔ)句塊 | 串行語(yǔ)句塊 begin-end | √ |
并行語(yǔ)句塊 fork-join | ||
賦值語(yǔ)句 | 過(guò)程連續(xù)賦值語(yǔ)句 assign | |
過(guò)程賦值語(yǔ)句 = 、<= | √ | |
條件語(yǔ)句 | if-else | √ |
case,casez,casex | √ | |
循環(huán)語(yǔ)句 | forever | |
repeat | ||
while | ||
for | √ | |
編譯向?qū)дZ(yǔ)句 | `define | |
`include |
3.2.1 過(guò)程語(yǔ)句
1、initial過(guò)程語(yǔ)句
語(yǔ)法格式如下:
initial
begin
語(yǔ)句1;
語(yǔ)句2;
...
語(yǔ)句n;
end
initial過(guò)程塊在進(jìn)行仿真時(shí)從模擬0時(shí)刻開(kāi)始執(zhí)行,在仿真過(guò)程中僅執(zhí)行一次,在執(zhí)行完一次之后該initial過(guò)程塊就被掛起,不再執(zhí)行。如果一個(gè)模塊中存在多個(gè)initial過(guò)程塊,每個(gè)initial過(guò)程塊都是從0時(shí)刻開(kāi)始并行執(zhí)行的。
initial過(guò)程語(yǔ)句通常用于仿真模塊中對(duì)激勵(lì)向量的描述。
2、always過(guò)程語(yǔ)句(可綜合)
語(yǔ)法格式如下:
always@(<敏感事件列表>) //邊沿敏感型、電平敏感型
語(yǔ)句塊;
(1)采用always過(guò)程語(yǔ)句對(duì)組合電路進(jìn)行描述時(shí),需要把全部的輸入信號(hào)列入敏感事件列表
(2)采用always過(guò)程語(yǔ)句對(duì)時(shí)序電路進(jìn)行描述時(shí),需要把時(shí)間信號(hào)和部分輸入信號(hào)列入敏感事件列表
3.2.2 過(guò)程賦值語(yǔ)句
過(guò)程塊中的賦值語(yǔ)句稱為過(guò)程賦值語(yǔ)句。過(guò)程賦值是在initial語(yǔ)句或always語(yǔ)句內(nèi)的賦值,只能對(duì)reg寄存器數(shù)據(jù)類型的變量賦值。
- 阻塞賦值語(yǔ)句 =,不再贅述
- 非阻塞賦值語(yǔ)句 <=, 不再贅述
3.2.3 過(guò)程連續(xù)賦值語(yǔ)句
過(guò)程連續(xù)賦值是在always和initial過(guò)程語(yǔ)句塊中對(duì)連線型和寄存器型變量進(jìn)行賦值操作,這種賦值語(yǔ)句能夠替換其他所有 wire 或 reg 的賦值,改寫(xiě)了 wire 或 reg 型變量的當(dāng)前值。
與過(guò)程賦值不同的是,過(guò)程連續(xù)賦值的表達(dá)式能被連續(xù)的驅(qū)動(dòng)到 wire 或 reg 型變量中,即過(guò)程連續(xù)賦值發(fā)生作用時(shí),右端表達(dá)式中任意操作數(shù)的變化都會(huì)立即引起過(guò)程連續(xù)賦值語(yǔ)句的重新執(zhí)行。
過(guò)程連續(xù)賦值語(yǔ)句的關(guān)鍵詞有四個(gè):
(1)賦值、重新賦值語(yǔ)句(assign、deassign),只能用于reg寄存器型變量賦值,不可用于wire連線型變量賦值。
assign <寄存器型變量> = <賦值表達(dá)式>;
deassign <寄存器型變量>;
(2)強(qiáng)制、釋放語(yǔ)句(force、release)
force <寄存器或連線型變量> = <賦值表達(dá)式>;
release <寄存器或連線型變量>;
下面是用assign、deassign改寫(xiě)的D觸發(fā)器邏輯代碼
//D觸發(fā)器
module dff_normal(
input rstn,
input clk,
input D,
output reg Q
);
always @(posedge clk or negedge rstn) begin
if(!rstn) begin //Q = 0 after reset effective
Q <= 1'b0 ;
end
else begin
Q <= D ; //Q = D at posedge of clock
end
end
endmodule
//使用assign和deassign改寫(xiě)之后的D觸發(fā)器
module dff_assign(
input rstn,
input clk,
input D,
output reg Q
);
always @(posedge clk) begin
Q <= D ; //Q = D at posedge of clock
end
always @(negedge rstn) begin
if(!rstn) begin
assign Q = 1'b0 ; //change Q value when reset effective
end
else begin //cancel the Q value overlay,
deassign Q ; //and Q remains 0-value until the coming of clock posedge
end
end
endmodule
3.2.4 條件分支語(yǔ)句
1、if語(yǔ)句
與C語(yǔ)言類似,此處不再贅述,需要注意的是if語(yǔ)句必須在過(guò)程塊內(nèi)使用!
2、case語(yǔ)句(可綜合)
語(yǔ)法格式如下
case(控制表達(dá)式)
值1: 語(yǔ)句塊1;
值2: 語(yǔ)句塊2;
...
值n: 語(yǔ)句塊n;
default: 語(yǔ)句塊n+1;
endcase
(1)case語(yǔ)句對(duì)控制表達(dá)式和后面的值進(jìn)行比較時(shí),必須是一種全等比較,必須保證兩者的對(duì)應(yīng)位全等。
(2)在使用case語(yǔ)句時(shí),應(yīng)包含所有的狀態(tài),如果未包含完全,那么必須寫(xiě)出default,否則將會(huì)產(chǎn)生鎖存器,這在同步時(shí)序電路設(shè)計(jì)中時(shí)不允許的。
本來(lái)覺(jué)得沒(méi)有必要補(bǔ)充casez語(yǔ)句的使用,但是在HDLbits上看到了一個(gè)有意思的題目,因此來(lái)補(bǔ)充一下(后續(xù))
3.2.5 循環(huán)語(yǔ)句(很少使用)
(1)forever所引導(dǎo)的循環(huán)語(yǔ)句表示永久循環(huán);
forever 語(yǔ)句或語(yǔ)句塊(循環(huán)體)
(2)repeat所引導(dǎo)的循環(huán)語(yǔ)句表示執(zhí)行固定次數(shù)的循環(huán);
repeat(循環(huán)次數(shù)表達(dá)式) 語(yǔ)句或語(yǔ)句塊(循環(huán)體)
(3)while所引導(dǎo)的循環(huán)語(yǔ)句表示條件循環(huán);
while(條件表達(dá)式) 語(yǔ)句或語(yǔ)句塊(循環(huán)體)
(4)for引導(dǎo)的循環(huán)語(yǔ)句也表示條件循環(huán)
for(循環(huán)變量賦初值; 循環(huán)結(jié)束條件; 循環(huán)變量增值) 語(yǔ)句塊(循環(huán)體)
循環(huán)語(yǔ)句也可以用于綜合電路的設(shè)計(jì),當(dāng)循環(huán)語(yǔ)句進(jìn)行計(jì)算和賦值的描述時(shí),即當(dāng)循環(huán)語(yǔ)句中的變量是數(shù)學(xué)值而非物理信號(hào)量,可以綜合得到邏輯電路。
3.3 結(jié)構(gòu)化建模
主要有模塊級(jí)建模、門(mén)級(jí)建模和開(kāi)關(guān)級(jí)建模三種,開(kāi)關(guān)級(jí)建模是Verilog HDL與VHDL之間的本質(zhì)區(qū)別。這里主要介紹一下模塊級(jí)建模。
1、模塊級(jí)建模就是通過(guò)調(diào)用由用戶自己描述產(chǎn)生的module模塊來(lái)對(duì)硬件電路結(jié)構(gòu)進(jìn)行說(shuō)明,并設(shè)計(jì)出電路。若當(dāng)前模塊不再被其它模塊所調(diào)用,那么這個(gè)模塊就是頂層模塊。
模塊調(diào)用的基本語(yǔ)法格式:模塊名<參數(shù)值列表> 實(shí)例名(端口名列表);
其中”模塊名“是module定義中給定的模塊名,它指明了被調(diào)用的是哪一個(gè)模塊,簡(jiǎn)單來(lái)說(shuō)就是被調(diào)用的模塊原來(lái)叫什么名字;
”參數(shù)值列表“是可選項(xiàng),通常會(huì)使用參數(shù)重定義語(yǔ)句defparam
修改參數(shù)值,后續(xù)會(huì)進(jìn)行介紹;
”實(shí)例名“是模塊被調(diào)用到當(dāng)前模塊的標(biāo)志,用來(lái)索引層次化建模中被調(diào)用的模塊位置,簡(jiǎn)單來(lái)說(shuō)就是被調(diào)用的模塊在頂層模塊中叫什么名字;
”端口名列表“是被調(diào)用模塊實(shí)例各端口(被調(diào)用模塊的信號(hào)名稱)相連的外部信號(hào)(頂層模塊的信號(hào)名稱),一般使用端口名對(duì)應(yīng)方式,還有一種是端口位置對(duì)應(yīng)方式。
module and_2(a,b,c) //2輸入與門(mén)模塊
input a,b;
output c;
parameter MAX_show = 520; //參數(shù)定義
assign c = a&b;
endmodule
module logic(in1,in2,q) //頂層模塊
input in1,in2;
output q;
and_2 U1(.a(in1), .b(in2), .c(q)); //端口名對(duì)應(yīng)方式
defparam U1.MAX_show = 521; //使用參數(shù)重定義語(yǔ)句修改參數(shù)值
endmodule
2、門(mén)級(jí)建模指的是用基本門(mén)級(jí)元件搭建硬件模型,但是實(shí)際使用較少,因?yàn)榭梢允褂脭?shù)據(jù)流建模的方式來(lái)進(jìn)行替代。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-848792.html
3、開(kāi)關(guān)級(jí)建模指的是用輸入、輸出為模擬信號(hào)的晶體管搭建硬件模型。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-848792.html
到了這里,關(guān)于[蔡覺(jué)平老師主講] Verilog HDL數(shù)字集成電路設(shè)計(jì)原理與應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!