加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1. Verilog HDL概述
    • 2. 行為建模和結(jié)構(gòu)建模
    • 3. 其他術(shù)語
    • 4. 典型的RTL綜合和RTL仿真流程
    • 5. 模塊結(jié)構(gòu)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

Verilog HDL基礎(chǔ)知識(一)

05/27 15:10
2981
閱讀需 19 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

引言:本文我們介紹Verilog HDL的基礎(chǔ)知識,重點(diǎn)對Verilog HDL的基本語法及其應(yīng)用要點(diǎn)進(jìn)行介紹。

1. Verilog HDL概述

什么是Verilog?Verilog是IEEE標(biāo)準(zhǔn)的硬件描述語言,一種基于文本的語言,用于描述最終將在硬件中實(shí)現(xiàn)的電路。Verilog和它的競爭對手VHDL一樣,可以用于仿真和綜合,實(shí)現(xiàn)對硬件進(jìn)行建模。

Verilog最初是由Cadence收購的Gateway Design Automation創(chuàng)建的。1995年,它被IEEE采用為標(biāo)準(zhǔn)。2001年,采用了該語言的修訂版本。2005年也進(jìn)行了小的修訂。同樣值得注意的是,2005年SystemVerilog作為Verilog HDL的超集引入,其中還包括面向?qū)ο蟮尿?yàn)證技術(shù)。2009年,IEEE將Verilog標(biāo)準(zhǔn)與System Verilog標(biāo)準(zhǔn)合并為一個IEEE 1800-2009標(biāo)準(zhǔn)。

2. 行為建模和結(jié)構(gòu)建模

當(dāng)進(jìn)行綜合實(shí)現(xiàn)時,有兩種方法可以進(jìn)行電路建模:行為建模和結(jié)構(gòu)建模。

2.1 行為建模

在行為建模中,您描述的是電路的功能,而不是電路的結(jié)構(gòu)。輸出行為是相對于輸入來描述的。這里是描述移位操作的行為HDL代碼的示例。

圖1:移位操作行為建模示例這種類型的建模依賴于綜合引擎來創(chuàng)建與所描述的行為相匹配的正確電路。

2.2 結(jié)構(gòu)建模

圖2:結(jié)構(gòu)建模示例

在結(jié)構(gòu)建模方法中,指定了電路的功能和結(jié)構(gòu)。編寫HDL的工程師調(diào)用特定的硬件元件并將它們連接在一起。硬件元件可以像AND或OR門一樣簡單,也可以是表示另一抽象層的模塊。

3. 其他術(shù)語

寄存器傳輸級(RTL):,這是一個常用術(shù)語,描述了一種行為建模風(fēng)格,該風(fēng)格根據(jù)硬件模型內(nèi)的數(shù)據(jù)流操作定義輸入輸出關(guān)系。RTL構(gòu)建體是可綜合的。

綜合(Synthesis):綜合是指將HDL代碼轉(zhuǎn)換和優(yōu)化為特定的電路。例如,查找表和FPGA觸發(fā)器

RTL綜合(RTL Synthesis):轉(zhuǎn)換硬件RTL模型到優(yōu)化的專用門電路的實(shí)現(xiàn),簡單理解為RTL模型映射。

圖3:RTL綜合示例

圖3演示了RTL綜合的過程。在第一步中,綜合引擎使用特定目標(biāo)器件的架構(gòu)元素將原始代碼轉(zhuǎn)換為硬件邏輯門。然后,它將經(jīng)過優(yōu)化階段,以確保電路描述的最佳實(shí)現(xiàn)。在這個特定的例子中,case語句是在一個軟件通常推斷的多路復(fù)用器塊內(nèi)實(shí)現(xiàn)的。

4. 典型的RTL綜合和RTL仿真流程

Verilog模型可以通過綜合仿真兩種不同的流程轉(zhuǎn)換,如圖下圖所示。

圖4:典型的RTL綜合和RTL仿真流程

在綜合流程中,綜合編譯器(例如Synopsys的Synplify或Altera的Native synthesis
Engine)將使用目標(biāo)器件庫中的可用技術(shù),將verilog模型轉(zhuǎn)換并優(yōu)化為技術(shù)特定的網(wǎng)表,該網(wǎng)表可用于定時分析,或放置并路由(映射)到特定器件中。

在仿真流程中,例如使用Mentor Graphics Modelsim,仿真編譯器將使用Verilog測試臺或通過測試向量提供的激勵來仿真Verilog模型。

大多數(shù)綜合工具也可以寫出科綜合的Verilog文件,以便設(shè)計者在執(zhí)行放置和布線之前檢查綜合結(jié)果。

5. 模塊結(jié)構(gòu)

Verilog HDL模塊結(jié)構(gòu)如下所示:

module?module?(port_list);---------- // port?declarations---------- // data?tpye?declarations---------- //?circuit?functionality---------- //?timing?specificationsendmodule?

Verilog HDL模塊由關(guān)鍵字module和結(jié)endmodule封裝,它還由幾個主要部分組成。首先是端口列表,它是用模塊聲明指定的。接下來定義端口。然后在數(shù)據(jù)類型聲明中聲明模塊中要使用的變量和網(wǎng)絡(luò)。之后是定義電路功能的代碼,最后是是否制定了適用的時序規(guī)范仿真環(huán)境。
(1)Verilog HDL區(qū)分大小寫,所有關(guān)鍵字都是小寫的;

(2)與C一樣,Verilog HDL語句以分號結(jié)尾;

(3)單行注釋以斜杠開頭,而斜線星號用于多行注釋的開頭,星號斜杠用于多行注釋的結(jié)尾;

(4)Verilog HDL對空格不敏感,有助于提高可讀性。

圖5:mult-acc模塊Verilog HDL示例

圖5為Verilog HDL代碼,模塊用于生成右側(cè)所示的乘法器-累加器塊。

在頂部,聲明了mult-acc模塊以及輸入和輸出端口的列表。橙色部分是將在該模塊中使用的所有變量和端口的端口和數(shù)據(jù)類型聲明。代碼的綠色部分是一個連續(xù)的賦值語句,它將被綜合到組合加法器中。粉紅色部分是順序時序寄存器的代碼。最后,藍(lán)色部分實(shí)例化了描述乘法器的另一個模塊。

5.1 模塊和端口聲明

模塊以關(guān)鍵字module開頭,后跟模塊名稱。

Verilog HDL模塊的第一部分是端口列表。端口列表包含模塊的所有輸入、輸出和雙向連接。端口列表位于模塊名稱后面的括號中。

圖6:模塊和端口聲明示例

在端口列表之后是端口聲明部分。本節(jié)將每個端口與端口類型相關(guān)聯(lián)。有三種端口類型:輸入、輸出和雙向端口的inout。端口聲明部分的結(jié)構(gòu)是端口類型,后跟端口名稱。總線有一個方括號,跟在端口類型后面,里面有總線位寬。

圖6例子中,ina和inb是8位輸入,clk和aclr是1位輸入,而out是16位輸出總線。使用Verilog2001標(biāo)準(zhǔn),您可以選擇聲明端口列表和端口類型以及模塊聲明。如圖7所示,我這樣更簡潔。

圖7:模塊和端口聲明示例,2001標(biāo)準(zhǔn)

5.2 數(shù)據(jù)類型

在端口聲明部分之后是數(shù)據(jù)類型聲明部分。Verilog HDL有Net和可變數(shù)據(jù)兩種基本數(shù)據(jù)類型。

5.2.1 Net數(shù)據(jù)類型

Net數(shù)據(jù)類型表示進(jìn)程或功能塊之間的物理互連。它們需要不斷地被驅(qū)動,而不能存儲數(shù)值。

圖8:Net數(shù)據(jù)類型

以下是綜合支持的四種最常見的Net數(shù)據(jù)類型。

wire表示一個節(jié)點(diǎn)或者連接;tri表示三態(tài)節(jié)點(diǎn)supply0表示邏輯“0”;

supply1表示邏輯“1”。

總線聲明:

<data_type>?[MSB:LSB]?<sginal?name><data_type> [LSB:MSB] <sginal name>//示例:wire [7:0] out;tri enable;

5.2.2 變量數(shù)據(jù)類型

變量數(shù)據(jù)類型用于臨時存儲數(shù)據(jù)。它們與其他語言中的變量相似。根據(jù)使用情況,可變數(shù)據(jù)類型可以整合為硬件觸發(fā)器或寄存器或組合節(jié)點(diǎn)。

圖9:變量數(shù)據(jù)類型

變量數(shù)據(jù)類型表示臨時存儲。它們可以是reg、integer、real、time和realtime類型。

reg類型是任意無符號位大小的變量,使用reg signed可以定義符號變量。integer表示32位有符號變量。real、time和realtime僅用于仿真目的,不支持綜合。 變量數(shù)據(jù)類型需要在過程、任務(wù)或函數(shù)中分配,不能使用連續(xù)賦值語句assign來驅(qū)動它們。

使用reg數(shù)據(jù)類型,可以以與Net相同的方式進(jìn)行總線聲明。

reg?[MSB:LSB]?<sginal?name>reg?[LSB:MSB]?<sginal?name>//示例:reg?[7:0]?out;integer?cnt;

5.3 模塊實(shí)例化

5.3.1 模塊例化格式

一旦一個模塊被聲明,它可能會通過使用這里的語法在更高級別的模塊上實(shí)例化。模塊例化格式如下:

<componet_name>?#<delay>?<instance_name>?(port_list);

首先是較低級別的組件名稱componet_name,這是您聲明的組件的名稱。

如果希望通過組件表達(dá)時間延遲delay,可以使用可選的#構(gòu)造。這僅用于仿真,而不用于綜合。

指定實(shí)例名稱instance_name,這是應(yīng)用于組件實(shí)例的唯一名稱。

最后,指定要連接到較低級別組件的輸入和輸出的信號列表port_list。

通過實(shí)例化模塊,您可以創(chuàng)建具有多個層次結(jié)構(gòu)的設(shè)計,以實(shí)現(xiàn)更容易的可維護(hù)性,現(xiàn)代設(shè)計通常具有許多層次結(jié)構(gòu)。

5.3.2 模塊例化端口連接

將信號連接到較低級別的模塊端口時,有兩種方法可以定義連接:按信號順序列表和名稱。

圖10:模塊連接

圖10給出的例子中,實(shí)例化了半加法器模塊的兩個實(shí)例,以形成一個全加法器。

對于第一個實(shí)例u1,使用有序列表方法進(jìn)行實(shí)例化。在這里,通過以與較低級別模塊聲明中的端口列表相同的順序列出端口列表,將較高級別的信號連接到半加器模塊的端口。端口連接的順序很重要,所以應(yīng)該只在端口很少的模塊中使用此方法。

對于第二個實(shí)例u2,使用connections-by-name方法進(jìn)行實(shí)例化。在這里,已經(jīng)說明了哪些電線連接到哪個端口。此時端口連接的順序無關(guān)緊要,也可忽略不想連接的某些端口。這是推薦的方法。

5.3.3 例化端口連接規(guī)則

進(jìn)出模塊的連接必須遵守某些規(guī)則。模塊的端口和到模塊的連接只能聲明為特定的數(shù)據(jù)類型。

圖11:端口連接規(guī)則當(dāng)將信號連接到較低級別模塊的端口時,變量類型數(shù)據(jù)不能連接到模塊的輸出或輸出,而Net數(shù)據(jù)類型可以在所有情況下使用。

5.4 參數(shù)

參數(shù)可用于將值與符號名稱相關(guān)聯(lián),這樣可使代碼更具有可讀性和意義。

parameter size = 8;localparam outsize = 16;reg?[size-1:0]?dataaa,datab;reg [outsize-1:0] out;

在這里的示例中,我將size和outsize分別聲明為解析為8和16的參數(shù)。然后在聲明變量dataa、datab和out時引用它們。

在編譯期間,可以從實(shí)例化包含參數(shù)的模塊的模塊重寫參數(shù)。關(guān)鍵字localparam參數(shù)只能用作本地參數(shù)。所有類型的參數(shù)在編譯時解析為常數(shù)值,并且在模塊執(zhí)行期間不能更改。

使用Verilog-2001,您可以在聲明模塊的同時聲明變量。

module mult_acc#(parameter size = 8)(...);

5.5 數(shù)字賦值

數(shù)字可以通過兩種方式分配給變量,可以調(diào)整大小也可以取消大小。如果沒有指定數(shù)字的大小或格式,它們將默認(rèn)為32位十進(jìn)制數(shù)字。數(shù)字的格式是大小、進(jìn)制,然后是實(shí)際數(shù)字本身。

16'd233?//16bit位寬的十進(jìn)制數(shù)2338'h9A???//8bit位寬16進(jìn)制'b1010??//32bit位寬2進(jìn)制o'21????//32位寬8進(jìn)制16'shFA?//有符號數(shù)據(jù)16bit位寬16進(jìn)制?

如果指定了一個有大小的數(shù)字,則必須在進(jìn)制之前指定數(shù)字的寬度(以位為單位)?;靖袷娇梢允莇、h、b或o。也可以添加s來表示數(shù)字的有符號或2的補(bǔ)碼表示。

負(fù)數(shù)表示:

-8'd3?//8bit負(fù)數(shù),存儲為3的二進(jìn)制補(bǔ)碼?

提高數(shù)字可讀性:使用下劃線"_",例如:

32'h21_66_88_99?//32bit十六進(jìn)制

數(shù)字中的特殊字符表示:"X"表示未知值,"Z"表示高阻抗。

12'h12x?//12bit十六進(jìn)制,LSB未知1'bz????//1bit高阻抗數(shù)值

5.6?運(yùn)算符

運(yùn)算符如下表所示。

在算術(shù)運(yùn)算符方面,Verilog定義了加法、減法、乘法、除法、模和指數(shù)。某些綜合工具可能不支持除法或指數(shù)。只有當(dāng)?shù)诙€操作數(shù)是常量時,其他操作數(shù)才支持它們。

運(yùn)算符將輸入向量視為一個整數(shù)。因此,如果Z或X值出現(xiàn)在部分操作數(shù)中,結(jié)果將是未知的。例如表中,ain+din=>未知。

此外,如果結(jié)果向量與操作數(shù)大小相同,則進(jìn)位可能存在丟失。

5.7 位算符

位運(yùn)算符如下表所示。

Verilog HDL的位運(yùn)算符可以是一元運(yùn)算符或二進(jìn)制運(yùn)算符,它們包括反轉(zhuǎn)、和、或、異或或和同或。這些運(yùn)算符對操作數(shù)的每個位進(jìn)行運(yùn)算。如果操作數(shù)大小不同,則較小的操作數(shù)左擴(kuò)展,結(jié)果為最大操作數(shù)的大小。

5.8 歸約運(yùn)算符

歸約運(yùn)算符如下表所示。

歸約運(yùn)算符是將向量歸約為單個位的一元運(yùn)算。Verilog支持and、nand、or、nor、xor和xnor歸約運(yùn)算符。

這些運(yùn)算符中的每一個都會產(chǎn)生一個單比特結(jié)果。即使“X”和“Z”是未知值,結(jié)果可能仍然是已知的。例如,如果“and”向量中有一個零,則無論是否存在“X”或“Z”位,結(jié)果都將為0。

5.9 關(guān)系運(yùn)算符

相等運(yùn)算符如下表所示。

關(guān)系運(yùn)算符用于比較操作數(shù),它們返回一個值。以下是Verilog HDL支持的關(guān)系運(yùn)算符:大于、小于、大于或等于以及小于或等于。結(jié)果為true或false,由“1”或“0”表示。如果任一操作數(shù)包含“Z”或“X”,則結(jié)果將是未知的。

5.10 相等運(yùn)算符

相等運(yùn)算符如下表所示。

與關(guān)系運(yùn)算符一樣,等式運(yùn)算符也用于比較值。它們返回一位真值或假值。Verilog HDL支持4個相等運(yùn)算符:相等、不相等、大小寫相等和大小寫不相等。

相等運(yùn)算符只支持已知值“1”和“0”,所以如果操作數(shù)中有x或z,結(jié)果將是未知的。

5.11 邏輯運(yùn)算符

邏輯運(yùn)算符如下表所示。

邏輯運(yùn)算符可以是一元運(yùn)算符,也可以是二進(jìn)制運(yùn)算符。

Verilog HDL支持not true、logic and和logic or。這些運(yùn)算符通常用于“if”和“while”語句中。這些運(yùn)算符返回一位true或false結(jié)果。操作數(shù)中出現(xiàn)“Z”或“X”位將導(dǎo)致未知結(jié)果。

5.12 移位運(yùn)算符

移位運(yùn)算符如下表所示。

支持Shift right和Shift left運(yùn)算符。這些運(yùn)算符將矢量向左或向右移動指定數(shù)量的位。

對于左移位,空出的位置用零填充,并且移位的比特丟失。對于右移,邏輯和算術(shù)無符號移位將用零填充,而算術(shù)有符號移位將使用符號位值填充。

5.13 混合運(yùn)算符

混合運(yùn)算符如下表所示。

條件運(yùn)算符的作用類似于if-then語句。

串聯(lián)運(yùn)算符將兩個或多個向量組合成一個更大的向量。
復(fù)制操作符獲取一個矢量并復(fù)制指定次數(shù)。

5.14 操作運(yùn)算符優(yōu)先級

操作運(yùn)算符優(yōu)先級如下圖所示。

當(dāng)您同時使用多個運(yùn)算符時,建議使用圓括號對操作進(jìn)行分組以進(jìn)行增強(qiáng)理解性和可讀性。

如果括號不存在,您可以在這里看到verilog定義的運(yùn)算符的優(yōu)先級。一元運(yùn)算符具有最高優(yōu)先級。

歡迎關(guān)注FPGA技術(shù)實(shí)戰(zhàn)公眾號,喜歡就多多轉(zhuǎn)發(fā)吧!

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
XC7A200T-2FBG484I 1 AMD Xilinx Field Programmable Gate Array, 16825 CLBs, 1286MHz, 215360-Cell, CMOS, PBGA484, FBGA-484

ECAD模型

下載ECAD模型
$325.32 查看
EP4CE6F17I7N 1 Intel Corporation Field Programmable Gate Array, 392 CLBs, 472.5MHz, 6272-Cell, PBGA256, 17 X 17 MM, 1 MM PITCH, LEAD FREE, FBGA-256
$44.04 查看
XC6SLX25-3FTG256I 1 AMD Xilinx Field Programmable Gate Array, 1879 CLBs, 862MHz, 24051-Cell, CMOS, PBGA256, 17 X 17 MM, 1 MM PITCH, LEAD FREE, FBGA-256

ECAD模型

下載ECAD模型
$344.14 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

專注FPGA技術(shù)開發(fā),涉及Intel FPGA、Xilinx FPGA技術(shù)開發(fā),開發(fā)環(huán)境使用,代碼風(fēng)格、時序收斂、器件架構(gòu)以及軟硬件項(xiàng)目實(shí)戰(zhàn)開發(fā),個人公眾號:FPGA技術(shù)實(shí)戰(zhàn)。