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