數(shù)字硬件建模SystemVerilog(七)-網(wǎng)絡(luò)
System Verilog提供兩組通用的數(shù)據(jù)類型:網(wǎng)絡(luò)和變量(nets 和 variables)。網(wǎng)絡(luò)和變量同時具有類型和數(shù)據(jù)類型特性。類型表示信號為網(wǎng)絡(luò)或變量,數(shù)據(jù)類型表示網(wǎng)絡(luò)或變量的值系統(tǒng),即2態(tài)或4態(tài)。為簡單起見,使用術(shù)語data type來表示信號的類型和數(shù)據(jù)類型。
軟件工具(如仿真器和綜合編譯器)使用數(shù)據(jù)類型來確定如何存儲數(shù)據(jù)和處理數(shù)據(jù)上的更改。數(shù)據(jù)類型影響操作,并在RTL建模中用于指示所需的硅行為。例如,數(shù)據(jù)類型用于確定加法器應(yīng)基于整數(shù)還是基于浮點,以及應(yīng)執(zhí)行有符號算術(shù)還是無符號算術(shù)。
網(wǎng)絡(luò)類型
網(wǎng)絡(luò)用于將設(shè)計元素連接在一起,例如將一個模塊的輸出端口連接到另一個模塊的輸入端口。網(wǎng)絡(luò)在三個重要方面不同于變量:
- 網(wǎng)絡(luò)沒有像變量一樣的臨時存儲,相反,網(wǎng)絡(luò)反映了網(wǎng)絡(luò)驅(qū)動器的當(dāng)前值(電容性trireg網(wǎng)絡(luò)似乎存儲了一個值,但實際上代表了驅(qū)動網(wǎng)絡(luò)的電容器的行為),
- 網(wǎng)絡(luò)可以計算多個驅(qū)動因素的結(jié)果值,其中變量只能有一個來源(如果對一個變量進行了多個程序賦值,則最后一個賦值是結(jié)果值,而不是解析所有賦值的結(jié)果)。
- 網(wǎng)絡(luò)反映驅(qū)動器值(0、1、Z或X)和驅(qū)動器強度。
驅(qū)動器的強度級別以0~7的步長表示。每個級別由一個關(guān)鍵字表示。大多數(shù)建模構(gòu)件的默認(rèn)強度級別為“強”,即級別6。強度級別對于晶體管級建模很重要,但不用于RTL建模。強度的表示和使用超出了本文關(guān)于RTL建模的范圍。
可綜合網(wǎng)絡(luò)類型
通過同時指定類型和數(shù)據(jù)類型來聲明網(wǎng)絡(luò)。類型可以是表3-3和3-4中列出的任何關(guān)鍵字。數(shù)據(jù)類型必須是關(guān)鍵字logic,可以顯式指定或隱式推斷。
每個SystemVerilog網(wǎng)絡(luò)類型都有特定的語義規(guī)則,這些規(guī)則會影響多個驅(qū)動程序的解析方式。雖然所有網(wǎng)絡(luò)類型都表示硅行為,但并非所有網(wǎng)絡(luò)類型都可以用標(biāo)準(zhǔn)ASIC和FPGA技術(shù)表示。表3-3列出了ASIC和FPGA綜合編譯器支持的網(wǎng)絡(luò)類型。
表3-3:可綜合網(wǎng)絡(luò)類型| 類型 | 代表 |
| --------- | --------------------------------------------------------------------- |
| wire | 使用CMOS行為解析多個驅(qū)動器的互連網(wǎng)絡(luò) |
| tri | wire的同義詞在所有方面都相同,可用于強調(diào)預(yù)期具有三態(tài)值的網(wǎng)絡(luò) |
| Supply0 | 在電源強度級別具有恒定邏輯0的互連網(wǎng)絡(luò)??捎糜诒硎窘拥剀墸℅ND、VSS) |
| Supply1 | 在電源強度級別具有恒定邏輯1的互連網(wǎng)絡(luò)??捎糜诒硎?a target="_blank">供電軌(VCC、VDD) |
不可綜合的網(wǎng)絡(luò)類型。
SystemVeriIog有幾種網(wǎng)絡(luò)類型,綜合編譯器并不普遍支持這些類型,如表3-4(第77頁)所示。
表3-4:一般不可綜合的網(wǎng)絡(luò)類型| 類型 | 代表 |
| -------- | ---------------------------------------------------------------------------- |
| uwire | 不允許或不解析多個驅(qū)動程序的互連網(wǎng)絡(luò) |
| pull0 | 一種互連網(wǎng)絡(luò),具有將下拉電阻器連接到網(wǎng)絡(luò)的特性 |
| Pull1 | 一種互連網(wǎng)絡(luò),具有將上拉電阻器連接到該網(wǎng)絡(luò)的特性 |
| wand | 一種互連網(wǎng)絡(luò),通過對驅(qū)動值進行AND運算來解析多個驅(qū)動程序 |
| triand | wand的同義詞,在所有方面都相同;可用于強調(diào)預(yù)期具有三態(tài)值的網(wǎng)絡(luò) |
| wor | 一種互連網(wǎng)絡(luò),通過對驅(qū)動值進行OR來解析多個驅(qū)動程序 |
| trior | wor的同義詞,在所有方面都相同;可用于強調(diào)預(yù)期具有三態(tài)值的網(wǎng)絡(luò) |
| trireg | 具有電容性的互連網(wǎng)絡(luò);如果所有驅(qū)動器均為高阻抗,則電容反映最后解析的驅(qū)動值 |
筆記某些RTL綜合編譯器可能支持一種或多種網(wǎng)絡(luò)類型。最佳實踐編碼風(fēng)格是不使用這些類型,以確保RTL模型與任何綜合編譯器兼容。如果使用其中一種類型,設(shè)計工程師應(yīng)檢查項目中使用的所有工具是否支持該類型。
CMOS工藝建模。
大多數(shù)ASIC和FPGA器件采用CMOS技術(shù)實現(xiàn)。CMOS互連的行為用線和三網(wǎng)類型表示。wire類型是最常用的網(wǎng)絡(luò)類型,也是隱式推斷網(wǎng)絡(luò)時的默認(rèn)網(wǎng)絡(luò)類型。
單驅(qū)動和多驅(qū)動邏輯。
ASIC和FPGA設(shè)計中的大多數(shù)互連網(wǎng)絡(luò)將單個驅(qū)動器連接到一個或多個接收器。例外是共享總線,其中多個驅(qū)動程序連接到一個或多個接收器。例如,RAM設(shè)備具有雙向數(shù)據(jù)總線,用于將值寫入RAM和從RAM讀取值。ASIC和FPGA設(shè)備通常具有一定數(shù)量的雙向I/O焊盤,用于讀取和驅(qū)動值。
最佳做法準(zhǔn)則3-7當(dāng)設(shè)計意圖是具有單個驅(qū)動器功能時,使用邏輯數(shù)據(jù)類型將設(shè)計組件連接在一起。僅當(dāng)設(shè)計意圖是允許多個驅(qū)動器時,才使用wire or tri類型。
將互連聲明為邏輯將推斷一個變量而不是網(wǎng)絡(luò)類型。變量只允許單個源(驅(qū)動程序)。
盡管大多數(shù)互連網(wǎng)絡(luò)僅具有一個驅(qū)動器;可綜合的網(wǎng)絡(luò)類型(如wire)允許多個驅(qū)動程序。工程師在使用網(wǎng)絡(luò)類型時需要小心避免編碼錯誤。網(wǎng)絡(luò)列表中的簡單錯誤可能會導(dǎo)致同一網(wǎng)絡(luò)無意中連接到多個驅(qū)動程序。在編譯和優(yōu)化過程中不會捕獲這種類型的錯誤。該錯誤會導(dǎo)致在仿真過程中檢測到功能性錯誤。下面幾個規(guī)則可以避免一些錯誤:
- 使用變量而不是網(wǎng)絡(luò)連接設(shè)計塊。SystemVerilog還允許使用變量將設(shè)計元素連接在一起。變量不允許多個驅(qū)動源。如果同一變量意外連接到多個驅(qū)動程序,則會發(fā)生綜合錯誤。
- 將輸入端口聲明為變量類型而不是網(wǎng)絡(luò)類型。默認(rèn)情況下,輸入和輸入輸出端口推斷為網(wǎng)絡(luò)類型,特別是wire類型,除非網(wǎng)絡(luò)類型指定了不同的網(wǎng)絡(luò)類型。如果多個驅(qū)動程序連接到同一輸入端口(或者一個值從模塊內(nèi)被反向驅(qū)動到輸入端口),這種網(wǎng)絡(luò)類型的推斷可能導(dǎo)致難以檢測的建模錯誤。這些建模錯誤在SystemVerilog中是合法的,因為網(wǎng)絡(luò)類型允許多個驅(qū)動程序。
通過將輸入端口顯式聲明為var logic類型,可以防止輸入端口的意外多個驅(qū)動程序。變量不允許多個驅(qū)動源。在編譯和詳細闡述設(shè)計模塊時,意外的多個驅(qū)動程序?qū)⒈粓蟾鏋榫幋a錯誤。
- 使用uwire防止多個驅(qū)動程序。uwire網(wǎng)絡(luò)類型還可用于防止輸入端口的多個無意驅(qū)動源。uwire類型作為1364-2005 Verilog標(biāo)準(zhǔn)的一部分添加到SystemVerilog中,特別是為了使無意中的多個驅(qū)動程序成為編譯/布線錯誤。輸入端口可以明確聲明為uwire類型,或者可以將默認(rèn)網(wǎng)絡(luò)類型更改為uwire。uwire類型不允許多個驅(qū)動程序。在編譯和詳細說明設(shè)計模塊時,意外的多個驅(qū)動程序?qū)⒈粓蟾鏋榫幋a錯誤。
筆記在編寫本文時,大多數(shù)綜合編譯器和一些仿真器尚未添加對uwire類型的支持,盡管它自2005年以來一直是Verilog/SystemVerilog標(biāo)準(zhǔn)的一部分。當(dāng)需要多驅(qū)動器網(wǎng)絡(luò)時,本書中的示例使用wire或tri類型。
網(wǎng)絡(luò)定義規(guī)則
通過指定網(wǎng)絡(luò)類型和可選數(shù)據(jù)類型來定義網(wǎng)絡(luò)。數(shù)據(jù)類型必須是4態(tài)logic數(shù)據(jù)類型,或從4態(tài)logic數(shù)據(jù)類型派生的用戶定義類型,如果未明確指定數(shù)據(jù)類型,則隱式推斷l(xiāng)ogic數(shù)據(jù)類型。
所有網(wǎng)絡(luò)類型的默認(rèn)大小都是標(biāo)量(1位)。可以使用與變量相同的語法將網(wǎng)絡(luò)顯式聲明為任何大小的向量。但是,只有變量向量聲明可以劃分為子字段。向量不能劃分為子字段。
一些可綜合的網(wǎng)絡(luò)聲明示例如下:
默認(rèn)情況下,所有網(wǎng)絡(luò)類型都是無符號的。網(wǎng)絡(luò)可以用與變量相同的方式顯式聲明為有符號或無符號。
網(wǎng)絡(luò)位和部分選擇 ??墒褂门c變量向量相同的語法從向量中選擇任何特定位或位組。常量和變量位和部分選擇都可以在網(wǎng)絡(luò)上執(zhí)行。
隱式聲明
未聲明的信號將在多個上下文中推斷網(wǎng)絡(luò)類型:
- 模塊input, inout or output,未明確聲明類型或數(shù)據(jù)類型,或從以前的端口聲明繼承
- 顯式聲明logic or reg數(shù)據(jù)類型或從以前的端口聲明繼承的模塊input or inout端口
- 與模塊實例或接口實例的端口或基本實例的終端的連接
- 連續(xù)賦值語句的左側(cè)
默認(rèn)情況下,推斷的隱式網(wǎng)絡(luò)類型為網(wǎng)絡(luò)wire類型。隱式網(wǎng)絡(luò)的向量大小基于本地上下文。如果網(wǎng)絡(luò)是從模塊端口聲明推斷出來的,那么隱式網(wǎng)絡(luò)的向量大小將是端口的大小。如果從與模塊、接口或例化實例的連接推斷網(wǎng)絡(luò),則將推斷標(biāo)量網(wǎng)絡(luò)。如果從連續(xù)賦值的左側(cè)推斷標(biāo)量網(wǎng)絡(luò),則也會推斷標(biāo)量網(wǎng)絡(luò)。示例3-1說明了幾個隱式網(wǎng)絡(luò)聲明。
示例3-1:創(chuàng)建隱式網(wǎng)絡(luò)的未聲明標(biāo)識符示例
上面還涉及到dot-name 和 dot-star的使用,這將在后面介紹。
更改默認(rèn)的隱式網(wǎng)絡(luò)類型??梢允褂镁幾g器指令:
'default_nettype
更改隱式網(wǎng)絡(luò)類型。每當(dāng)推斷出隱式網(wǎng)絡(luò)時,在指令之后編譯的所有SystemVerilog代碼都將使用指定的網(wǎng)絡(luò)類型。'default_nettype必須在模塊或接口邊界之外指定。
示例3-2將隱式網(wǎng)絡(luò)類型定義為uwire(單驅(qū)動源)類型
示例3-2:更改隱式網(wǎng)絡(luò)的網(wǎng)絡(luò)類型
`default_nettype tri1 // change default for implicit nets
//`default_nettype uwire // change default for implicit nets
`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module mixed_rtl_and_gate_adder
(input a, // implicit uwire net, logic data type
input logic b, // implicit uwire net, logic data type
input reg ci, // implicit uwire net, logic data type
output sum, // implicit uwire net, logic data type
output logic co // implicit variable, logic data type
);
timeunit 1ns/1ns;
xor g1 (n1, a, b); // undeclared n1 is implicit uwire net
xor g2 (sum, n1, ci);
and g3 (n2, a, b); // undeclared n2 is implicit uwire net
assign n3 = n1 & ci; // undeclared n3 is implicit uwire net
always_comb begin
co = n2 | n3;
end
endmodule: mixed_rtl_and_gate_adder
`end_keywords
`default_nettype wire // reset default for implicit nets
關(guān)閉隱式網(wǎng)絡(luò)聲明。
隱式網(wǎng)絡(luò)有優(yōu)點也有缺點。大型、復(fù)雜的網(wǎng)絡(luò)表可能需要幾十個1位網(wǎng)絡(luò)來連接設(shè)計塊。顯式聲明這些多個網(wǎng)絡(luò)既繁瑣又耗時,顯式聲明大量互連網(wǎng)絡(luò)也可能需要大量的鍵入,并存在需要鍵入的錯誤風(fēng)險。隱式網(wǎng)絡(luò)可以減少編寫網(wǎng)表模型所需的時間,并減少鍵入錯誤。
但是,隱式網(wǎng)絡(luò)的一個缺點是,與模塊、接口或例化實例的連接中拼寫錯誤的名稱不會被檢測為連接錯誤。不正確的名稱將推斷出一個隱式網(wǎng)絡(luò),其結(jié)果是必須檢測、調(diào)試和糾正的功能性錯誤。另一個缺點是,從實例連接推斷出的網(wǎng)絡(luò)將是一個1位網(wǎng)絡(luò),而不管該網(wǎng)絡(luò)連接到的端口大小如何。連接大小不匹配將導(dǎo)致警告消息,但仿真或綜合仍將繼續(xù)。端口大小不匹配還可能導(dǎo)致必須檢測和糾正的功能缺陷。
隱式net與顯式聲明net的優(yōu)缺點是Verilog和SystemVerilog工程師經(jīng)常爭論的話題。這實際上是用戶偏好的問題。這兩種編碼風(fēng)格都很好地工作,并且兩種風(fēng)格都有優(yōu)點和缺點。
對于喜歡顯式聲明所有網(wǎng)絡(luò)的工程師或公司,SystemVerilog提供了一種禁用隱式網(wǎng)絡(luò)的方法。這就要求顯式聲明所有網(wǎng)絡(luò),禁用隱式網(wǎng)絡(luò)是通過設(shè)置編譯器指令來完成的:
此編譯器指令必須在模塊外部設(shè)置,并對編譯到同一編譯單元的所有后續(xù)模塊保持有效,或者直到遇到另一個'default_nettype指令。
使用隱式網(wǎng)絡(luò)或禁用隱式網(wǎng)絡(luò)通常是個人偏好,有時也是公司內(nèi)部的編碼準(zhǔn)則。本書中的示例假設(shè)啟用了隱式網(wǎng)絡(luò),默認(rèn)隱式網(wǎng)絡(luò)類型為wire。
筆記“default_nettype”指令可以影響多個文件。編譯器指令在編譯單元中是準(zhǔn)全局的。當(dāng)在同一編譯單元中編譯多個文件時,編譯器指令對遇到該指令之前編譯的任何文件沒有影響,但會影響遇到該指令之后編譯的所有文件。
最佳做法準(zhǔn)則3-8如果更改了默認(rèn)網(wǎng)絡(luò)類型,請始終將’default_nettype”用作一對指令,第一個指令將默認(rèn)設(shè)置為所需的網(wǎng)絡(luò)類型,第二個指令將默認(rèn)設(shè)置回wire。
在任何更改默認(rèn)值的模塊之后,將默認(rèn)網(wǎng)絡(luò)類型設(shè)置回wire,將防止意外的副作用影響到其他預(yù)期默認(rèn)wire的文件。
網(wǎng)絡(luò)分配和連接規(guī)則
給網(wǎng)絡(luò)賦值。 網(wǎng)絡(luò)可以從兩種類型的源接收值:作為output or inout port端口的連接,以及作為連續(xù)賦值(assign語句)的左側(cè)。不能在程序賦值的左側(cè)使用網(wǎng)絡(luò)。
在整個仿真過程中對連續(xù)賦值進行求值,賦值右側(cè)的任何更改都會導(dǎo)致對右側(cè)表達式進行求值,并更新左側(cè)表達式。左側(cè)可以是變量或網(wǎng)絡(luò)。網(wǎng)絡(luò)的連續(xù)賦值可以是顯式的,也可以是隱式的。顯式連續(xù)賦值以關(guān)鍵字assign開始。
隱式連續(xù)賦值結(jié)合了網(wǎng)絡(luò)聲明和對該網(wǎng)絡(luò)的賦值。組合中未使用assign關(guān)鍵字。
注意不要混淆內(nèi)嵌變量初始化和隱式連續(xù)賦值。
這兩個構(gòu)造的語法可能看起來很相似,但行為卻截然不同。在線變量初始化是一次評估和賦值,在前面的示例中,如果a或b的值在以后的仿真中發(fā)生變化,則不會更新變量。隱式連續(xù)賦值,顧名思義,是在整個仿真過程中不斷求值的表達式。在前面的示例中,每次仿真期間a或b的值發(fā)生變化時,n1都會更新。
連接大小不匹配。 網(wǎng)絡(luò)用于將設(shè)計塊連接在一起,例如將一個模塊的輸出端口連接到一個或多個其他模塊的輸入端口。通常,端口和互連網(wǎng)絡(luò)的向量寬度相同,但SystemVerilog允許向量大小不同。例如16位標(biāo)量網(wǎng)絡(luò)可以將32位寬的輸出端口連接到8位寬的輸入端口。這種尺寸不匹配可能是設(shè)計錯誤,但在SystemVerilog中,只會生成警告。
SystemVerilog語言具有解決端口/連接不匹配的規(guī)則:
- port的比特數(shù)少于連接到的網(wǎng)絡(luò)或變量-值的最左邊的比特被截斷,導(dǎo)致值的最重要比特丟失。
- 一個端口的比特數(shù)大于連接到它的網(wǎng)絡(luò)或變量的比特數(shù)-網(wǎng)絡(luò)或變量的值保持?jǐn)U展?fàn)顟B(tài),如果端口、網(wǎng)絡(luò)/變量中有一個無符號,則該值為零擴展。如果端口和網(wǎng)絡(luò)/變量都有符號,則該值為有符號。
仿真器和綜合編譯器將生成連接大小不匹配的警告消息。這些警告不容忽視!連接不匹配通常是需要糾正的設(shè)計錯誤。
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7568瀏覽量
88796 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110107 -
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
36951
發(fā)布評論請先 登錄
相關(guān)推薦
評論