侵權投訴

SystemVerilog 中各種不同的聯合解析

39度創意研究所 2020-11-19 15:16 次閲讀

注意:本文所有內容皆來源於Xilinx工程師,

BY Alan Schuler

基本聯合

在 SystemVerilog 中,聯合只是信號,可通過不同名稱和縱橫比來加以引用。

其工作方式為通過 typedef 來聲明聯合,並提供不同標識符用於引用此聯合。 這些標識符稱為“字段”。

例如:

  typedef union packed {       logic [3:0] a;       logic [3:0] b;  } union_type;    union_type my_union;

以上代碼創建了一種新類型,名為“union_type”。

此類型的位寬為 4 位,可作為“a”或“b”來引用。

此外,代碼最後一行創建了一個新信號,名稱為“my_union”且類型為“union_type”。

其使用語法為“.”。

例如:

  always@(posedge clk) begin        my_union.a < = in1;  end    always@(posedge clk) begin       out1 < = my_union.a;       out2 < = my_union.b;  end

在 Vivado 中運行此代碼時,原理圖如下所示:

 

 
圖 1:基本聯合

請注意,my_union 位寬仍僅為 4 位,而以“a”或“b”來引用它的兩項分配均採用相同邏輯。 針對 my_union 的分配使用的是“a”,而此聯合的讀取結果針對 out1 和 out2 則分別使用“a”和“b”。

聯合分兩種類型:打包 (packed) 和解包 (unpacked)。在上述示例中,我們指定的是打包聯合。 默認情況下,如果不指定類型,編譯器將假定它採用解包聯合。打包聯合與解包聯合的差別在於,在打包聯合中,其中所有標識符都必須採用打包類型,並且大小必須相同。 在上述示例中,“a”和“b”位寬均為 4 位。 但如果其中之一為 4 位,而另一個為 2 位,則該工具中將生成錯誤。 而在解包聯合中,標識符可採用解包類型並且大小無需相同。 因此,在上述 4 位和 2 位聯合示例中,刪除“packed”語句將使該工具能夠對 RTL 進行完整審查。 總而言之,打包聯合在綜合工具中所受支持更為廣泛,並且更便於概念化。 對於本文中的前幾個聯合示例,我們使用的是打包聯合,但從此處開始直至文末,我們將展示解包聯合示例。

含多維字段的聯合

上述示例只是簡單演示了聯合的作用。 讓我們來看下較為複雜的聯合示例:

  typedef union packed {       logic [3:0] a;       logic [1:0][1:0] b;  } union_type;    union_type my_union;

同上,首先對聯合進行聲明,並創建類型為“union_type”的信號。 差別在於,字段“a”位寬為 4 位,另一個字段“b”位寬同樣為 4 位,但後者排列為 2 個 2 位矢量。 由於這兩個字段大小相同,並且字段“b”使用的是打包類型,因此這是一個合法的打包聯合。

其結構如下所示:

 

 
圖 2:含多維陣列的聯合

為此結構分配的 RTL 如下所示:

  always@(posedge clk) begin       my_union.a < = in1;  end    always@(posedge clk) begin       out1 < = my_union.b[0];       out2 < = my_union.b[1];  end

原理圖如下所示:

 

 
圖 3:多維聯合的原理圖

含結構的聯合

聯合還可配合結構一起使用。 就像所有打包聯合一樣,結構大小必須與聯合中的任何其他類型的大小相同。

例如:

  typedef union packed {       logic [9:0] data;       struct packed {            bit op1;            bit [2:0] op2;            bit [1:0] op3;            bit op4;            bit [2:0] op5;       } op_modes;  } union_type;    union_type my_union;

此 RTL 介紹的聯合包含 2 個位寬均為 10 位的字段。 第一個字段為名為“data”且位寬為 10 位的矢量。 第二個字段採用包含 5 個字段的結構,這些字段的大小總和同樣為 10 位。

為此創建的結構如下所示:

 

 
圖 4:含結構的聯合

由於當前聯合中包含結構,因此其正確的引用方式是引用聯合中的結構:

  always@(posedge clk) begin       my_mult < = my_union.op_modes.op2 * my_union.op_modes.op5;  end

解包聯合

如果聯合中的字段大小不同,或者如果聯合中的字段本身使用的類型為解包類型,那麼此類聯合需聲明為解包聯合。

對於前一種情況,如果指定的聯合包含不同大小的字段,那麼該聯合本身大小將設置為最大字段的大小。

示例 RTL:

  typedef union {       logic [5:0] a;       logic [3:0] b;       logic c;  } union_type;    union_type my_union;

這樣即可創建如下所示結構:

 

 
圖 5:含不同大小字段的解包聯合

含結構的解包聯合

與打包聯合相同,解包聯合同樣可以使用結構。

  typdef struct {       bit [3:0] a1;       bit a2;  } s_1;    typedef union {       logic [7:0] b1;       s_1 b2;  } union_type    union_type my_union;

以上示例將創建一個含兩個字段的聯合。其中一個字段為位寬 8 位的矢量“b1”,另一個字段為位寬 5 位的結構,此結構由一個位寬 4 位的矢量 a1 和一個位寬 1 位的矢量 a2 組成。

此聯合將作為位寬 8 位的矢量來創建,如下所示:

 

 
圖 6:含結構的解包聯合

同上,由於聯合中包含結構,因此需按如下方式來引用信號:

  always@(posedge clk) begin       my_union.b1 <= in1;       out1 <= my_union.b2.a1;       out2 <= my_union.b2.a2;  end

編輯:hfy


收藏 人收藏
分享:

評論

相關推薦

帶大家一起體驗一下Vivado的ECO流程

這裏帶大家一起體驗一下Vivado 的ECO流程,以vivado自帶的Example Design為....
的頭像 FPGA之家 發表於 11-29 11:04 71次 閲讀
帶大家一起體驗一下Vivado的ECO流程

vivado約束案例:跨時鐘域路徑分析報告

跨時鐘域路徑分析報告分析從一個時鐘域(源時鐘)跨越到另一個時鐘域(目標時鐘)的時序路徑。
的頭像 電子設計 發表於 11-27 11:11 504次 閲讀
vivado約束案例:跨時鐘域路徑分析報告

PHP 8.0 正式版正式開放下載 引入 JIT編譯器特性

IT之家11月27日消息 恰逢一年一度感恩節,PHP 8.0 正式版現已正式開放下載。 PHP 8.....
的頭像 工程師鄧生 發表於 11-27 10:06 198次 閲讀
PHP 8.0 正式版正式開放下載 引入 JIT編譯器特性

生成zynq裸核啓動文件步驟解析

通過修改lscript.ld文件中的內容,可以改變在存儲器中的執行位置, 因為ELF文件是加載到DD....
的頭像 39度創意研究所 發表於 11-26 15:20 276次 閲讀
生成zynq裸核啓動文件步驟解析

【丹陽到香港快遞】典型時序模型的三條時鐘路徑分析

發起沿(LaunchEdge):數據被launch的時鐘邊沿;也就是説,每一個啓動沿,一般都會產生一....
的頭像 電子設計 發表於 11-26 14:16 468次 閲讀
【丹陽到香港快遞】典型時序模型的三條時鐘路徑分析

C語言預處理命令的分類和工作原理詳細説明

C 語言編程過程中,經常會用到如 #include、#define 等指令,這些標識開頭的指令被稱為....
發表於 11-25 10:34 45次 閲讀
C語言預處理命令的分類和工作原理詳細説明

單片機C51程序設計的學習課件免費下載

本文檔的主要內容詳細介紹的是單片機C51程序設計的學習課件免費下載包括了:1、C51程序設計基礎,2....
發表於 11-24 17:24 42次 閲讀
單片機C51程序設計的學習課件免費下載

高質量C++和C語言編程指南的PDF電子書免費下載

 早期的編程語言如 Basic Fortran 沒有頭文件的概念 C++/C 語言的初學者雖然會用使....
發表於 11-23 08:00 46次 閲讀
高質量C++和C語言編程指南的PDF電子書免費下載

方舟編譯器官發佈對 RISC-V 後端的支持

昨日,方舟編譯器官方新發布了對 RISC-V 後端的支持。 地址://gitee.com....
的頭像 工程師鄧生 發表於 11-21 10:55 231次 閲讀
方舟編譯器官發佈對 RISC-V 後端的支持

用Tcl實現Vivado設計全流程

設置芯片型號,設置源文件位置,設置生成文件位置,添加設計源文件,流程命令,生成網表文件,設計分析,生....
的頭像 Lauren的FPGA 發表於 11-20 10:56 226次 閲讀
用Tcl實現Vivado設計全流程

初識指針和指針變量

通過變量名來訪問變量,是一種「相對安全」的方式。因為只有你定義了它,你才能夠訪問相應的變量。這就是對....
的頭像 STM32嵌入式開發 發表於 11-20 10:02 162次 閲讀
初識指針和指針變量

從執行速度和內存使用等方面來優化C語言代碼

實際上,在我的項目中,我使用了很多優化ARM編程的方法(該項目是基於ARM平台的),也使用了很多互聯....
的頭像 嵌入式ARM 發表於 11-16 16:55 300次 閲讀
從執行速度和內存使用等方面來優化C語言代碼

vivado版本升級後,怎麼簡單移植軟核。

將程序從低版本的vivado搬移到高版本的vivado的時,直接在高版本的vivado下升級軟核中的各個IP後,在綜合過程中報錯。在低版本...
發表於 11-14 20:57 281次 閲讀
vivado版本升級後,怎麼簡單移植軟核。

C語言的頭文件組織與包含原則

説明本文假定讀者已具備基本的C編譯知識。 如非特殊説明,文中“源文件”指 * .c文件,“頭文件”....
的頭像 Wildesbeast 發表於 11-14 11:31 538次 閲讀
C語言的頭文件組織與包含原則

如何不建Vivado工程,也能看Device視圖呢

在FPGA設計與開發中,Device視圖和Package視圖發揮着重要的作用。在Device視圖下:....
的頭像 Lauren的FPGA 發表於 11-13 18:11 378次 閲讀
如何不建Vivado工程,也能看Device視圖呢

GCC程序編譯的靜態鏈接和動態鏈接

靜態鏈接使用靜態庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態鏈接生成的程....
的頭像 Linux愛好者 發表於 11-12 15:50 271次 閲讀
GCC程序編譯的靜態鏈接和動態鏈接

關於Vivado中三種操作Debug的方式

Vivado中提供了多種Debug的操作方式,下面就來總結一下: 1. 代碼中例化ILA IP核 第....
的頭像 39度創意研究所 發表於 11-11 17:07 189次 閲讀
關於Vivado中三種操作Debug的方式

質疑:鴻蒙會不會沒有APP可用

近日華為消費者業務軟件部總裁王成錄宣佈,手機版鴻蒙OS將按照計劃在今年12月發佈。另有消息爆料手機鴻....
的頭像 鴻蒙系統HarmonyOS 發表於 11-09 17:11 435次 閲讀
質疑:鴻蒙會不會沒有APP可用

Vivado中模塊封裝成edif和dcp

發表於 11-09 14:50 303次 閲讀
Vivado中模塊封裝成edif和dcp

iOS 14.2原生支持了JIT編譯器 模擬器類APP受益

iOS 14.2上的一項隱藏特性被挖掘出來。 一些開發者發現,iOS 14.2終於原生支持了JIT(....
的頭像 工程師鄧生 發表於 11-09 10:21 274次 閲讀
iOS 14.2原生支持了JIT編譯器 模擬器類APP受益

虛擬機軟件UTM等模擬器未來都可以在iPhone和iPad上全速運行

一些開發者發現,iOS 14.2終於原生支持了JIT(Just-In-Time)編譯器,它用於邊運行....
的頭像 lhl545545 發表於 11-09 10:17 286次 閲讀
虛擬機軟件UTM等模擬器未來都可以在iPhone和iPad上全速運行

iOS隱藏特性被發現:模擬器類APP不再有性能損失

iOS 14.2上的一項隱藏特性被挖掘出來。一些開發者發現,iOS 14.2終於原生支持了JIT(J....
的頭像 如意 發表於 11-09 09:44 310次 閲讀
iOS隱藏特性被發現:模擬器類APP不再有性能損失

Proteus仿真的使用入門教程

為了方便介紹,我分別對窗口內各部分進行中文説明(見上圖)。下面簡單介紹各部分的功能: 1.原理圖編輯....
發表於 11-09 08:00 132次 閲讀
Proteus仿真的使用入門教程

Vivado HLS和Vitis HLS 兩者之間有什麼區別

Vivado HLS 2020.1將是Vivado HLS的最後一個版本,取而代之的是VitisHL....
的頭像 Lauren的FPGA 發表於 11-05 17:43 747次 閲讀
Vivado HLS和Vitis HLS 兩者之間有什麼區別

Vivado的ECO流程

通常在設計網表中,需要在基礎上微調邏輯,這樣既無需修改代碼,也無需重新做綜合,在設計調試中可以節省時....
的頭像 丹陽到香港快遞網工程師 發表於 11-04 10:25 252次 閲讀
Vivado的ECO流程

基於DSP動態鏈接器的設計方案和應用優勢研究

基於數字信號處理器(DSP)的多功能自適應通信系統在軟件無線電領域正變得日益普遍,如何使DSP系統在....
發表於 11-03 13:05 257次 閲讀
基於DSP動態鏈接器的設計方案和應用優勢研究

Vivado中進行ZYNQ硬件部分設計方案

ZYNQ概述 ZYNQ內部包含PS和PL兩部分,PS中包含以下4個主要功能模塊: Applicati....
的頭像 39度創意研究所 發表於 11-03 12:33 679次 閲讀
Vivado中進行ZYNQ硬件部分設計方案

GNU彙編入門教程免費下載

以前用ARM的IDE工具,使用的是ARM標準的彙編語言。現在要使用GNU的工具,當然要了解一點GNU....
發表於 11-02 17:53 56次 閲讀
GNU彙編入門教程免費下載

中國科學院大學的一生一芯計劃引發熱議

本文經機器之心(微信公眾號:almosthuman2014)授權轉載,禁止二次轉載 選自Fueled....
的頭像 人工智能與大數據技術 發表於 11-02 11:49 364次 閲讀
中國科學院大學的一生一芯計劃引發熱議

我們為什麼要將變量、數組存儲到特定的地址?

表達式變量是數學表達式計算的結果。表達式是絕對變量或統計變量與數學運算符(+,-,*,/…)的組合,....
的頭像 strongerHuang 發表於 11-01 11:15 278次 閲讀
我們為什麼要將變量、數組存儲到特定的地址?

在程序設計中代碼優化的一些小技巧

作為一種結構化程序設計語言,C 語言兼顧多種高級語言的特點,具有很強的功能性和可移植性。但在嵌入式....
的頭像 玩轉單片機 發表於 10-30 14:11 338次 閲讀
在程序設計中代碼優化的一些小技巧

谷歌將在雲端上發佈深度學習虛擬機器(DLVM)映像檔

XLA是Google在2018年推出的最佳化編譯器,通過最佳化算法運算,可以提升機器學習模型的執行速....
的頭像 lhl545545 發表於 10-26 10:57 558次 閲讀
谷歌將在雲端上發佈深度學習虛擬機器(DLVM)映像檔

一起體驗Vivado 的ECO流程

作者:Hong Han,來源:賽靈思中文社區論壇 有時我們需要在設計網表的基礎上微調一下邏輯,這樣可....
的頭像 FPGA開發圈 發表於 10-26 09:45 455次 閲讀
一起體驗Vivado 的ECO流程

工程師避免這些誤區才能讓【丹陽到香港快遞】削鐵如泥

語法錯誤當使用參數調用宏時,會將參數替換為宏主體,並與其他輸入文件一起檢查結果,以進行更多的宏調用,....
的頭像 inr999 發表於 10-23 15:15 635次 閲讀
工程師避免這些誤區才能讓【丹陽到香港快遞】削鐵如泥

gcc的使用方法以及Linux gcc 的常用選項

gcc的使用方法 gcc 【丹陽到香港快遞】文件名 gcc常用選項 gcc -v: 查看gcc編譯器的版本,顯....
的頭像 嵌入式星球 發表於 10-22 14:42 424次 閲讀
gcc的使用方法以及Linux gcc 的常用選項

如何用Tcl實現Vivado設計流程介紹

Vivado有兩種工作模式:project模式和non-project模式。這兩種模式都可以藉助Vi....
的頭像 Lauren的FPGA 發表於 10-21 10:58 328次 閲讀
如何用Tcl實現Vivado設計流程介紹

C語言高效編程與代碼優化

翻譯作者:碼農網 gunner 在本篇文章中,我收集了很多經驗和方法。應用這些經驗和方法,可以幫助我....
的頭像 inr999 發表於 10-19 17:04 317次 閲讀
C語言高效編程與代碼優化

Keil MDK的一個bug

素材來源:Keil 編輯整理:strongerHuang 不知道還有多少人在繼續在使用Keil MD....
的頭像 inr999 發表於 10-19 15:26 294次 閲讀
Keil MDK的一個bug

驚爆內幕:老MDK也可以使用新編譯器!

【丹陽到香港快遞】 如果説喜新厭舊是人類的天性,那麼嵌入式程序員一定是特例他們尤其不喜歡更換自己用慣了....
的頭像 inr999 發表於 10-19 14:19 372次 閲讀
驚爆內幕:老MDK也可以使用新編譯器!

編譯器的位域和volatile詳細介紹

為了後續的討論更加簡單直接,我想重複下很多你們“肯定”注意到了的“廢話”:外設是可以跟CPU同時工作....
的頭像 Wildesbeast 發表於 10-17 11:56 739次 閲讀
編譯器的位域和volatile詳細介紹

華為啓動10億美元耀星計劃 讓鴻蒙發展再提速

華為可以説是民企裏面的驕傲,其不僅5G等技術領先,還是全球第二大手機廠商,還在高端市場與蘋果、三星較....
的頭像 鴻蒙系統HarmonyOS 發表於 10-16 10:30 919次 閲讀
華為啓動10億美元耀星計劃 讓鴻蒙發展再提速

DSP的開發工具及開發環境的詳細資料説明

DSP的軟件、硬件的開發以及系統的集成,日益關注。如何提高開發速度、降低開發難度,所有開發者共同關心....
發表於 10-15 17:35 92次 閲讀
DSP的開發工具及開發環境的詳細資料説明

HYCON 8位MCU C編譯器的使用手冊

本手冊主要介紹基於HYCON 8-bit OTP MCU的C 編譯器用法;以C語言為基礎,介紹HYC....
發表於 10-15 08:00 67次 閲讀
HYCON 8位MCU C編譯器的使用手冊

Python的知識手冊詳細

Python 的創立者,Guido van Rossum,荷蘭人。1982 年,Guido 從阿姆斯....
發表於 10-15 08:00 54次 閲讀
Python的知識手冊詳細

華為方舟編譯器正式支持C語言,將繼續完全開源

2019年8月底,華為方舟編譯器(OpenArkCompiler)正式開源,邁出了跨越性的一步。一年....
的頭像 如意 發表於 10-14 17:38 435次 閲讀
華為方舟編譯器正式支持C語言,將繼續完全開源

通過HLS封裝一個移位流水燈的程序案例

當我們安裝好Vivado 的時候,也同時裝好了Vivado HLS.。 這是個什麼東西?我就有一種想....
的頭像 39度創意研究所 發表於 10-14 15:17 783次 閲讀
通過HLS封裝一個移位流水燈的程序案例

華為方舟編譯器使用指南

當前方舟編譯器支持 Java/Kotlin 程序字節碼的前端輸入,其它編程語言的支持(如 C/C++....
發表於 10-14 14:56 122次 閲讀
華為方舟編譯器使用指南

Linux工具和項目佈局

使用實時操作系統作為應用程序代碼平台的設計還面臨着許多挑戰,比如如何將功能分配給不同的並行任務、如何....
的頭像 嵌入式ARM 發表於 10-12 17:35 495次 閲讀
Linux工具和項目佈局

關於C語言進階的操作

看來這波操作可行,似乎還省去了.h文件,之前bug菌説過,分析.h文件的時候直接把.h文件在對應的.....
的頭像 嵌入式ARM 發表於 10-10 11:27 305次 閲讀
關於C語言進階的操作

μC/OS-II內核如何在RTOS多個任務中作為任務棧的方法研究

簡單地説,一個任務可看作一個運行中的C函數。對於搶先式RTOS來説,在任務切換時,應保存當前任務的各....
的頭像 電子設計 發表於 10-09 10:21 396次 閲讀
μC/OS-II內核如何在RTOS多個任務中作為任務棧的方法研究

IP definition not found for VLNV: xilinx.com:ip:axi_vdma:6.2 ERROR: [Common 17-39] 'create_bd_cell' failed due to earlier errors.要如何解決呢

在Xilinx ZYNQ平台上對HDMI進行測試,參考ADI的官方Demo。 系統編譯時報錯 ERROR: [BD 5-390] IP...
發表於 10-06 22:22 243次 閲讀
IP definition not found for VLNV: xilinx.com:ip:axi_vdma:6.2  ERROR: [Common 17-39] 'create_bd_cell' failed due to earlier errors.要如何解決呢

擁有性能良好且集成的工具和可配置性可幫助外圍的編程設計

一種更好的方式就是選擇已經具備很多項目所需的所有外圍和靈活輸入輸出排列的微控制器。因此,用户可以選擇....
的頭像 牽手一起夢 發表於 10-04 14:57 544次 閲讀
擁有性能良好且集成的工具和可配置性可幫助外圍的編程設計

基於KEIL C5l編譯器的處理大量常量代碼的思路與實現

通常帶中文液晶顯示的系統採用的是不帶中文字庫的圖形液晶顯示模塊,需要給點陣字庫分配存儲空間。常用的是....
的頭像 牽手一起夢 發表於 10-04 14:18 382次 閲讀
基於KEIL C5l編譯器的處理大量常量代碼的思路與實現

Vivado中進行HDL代碼設計

在Vivado中進行HDL代碼設計,不僅需要描述數字邏輯電路中的常用功能,還要考慮如何發揮Xilinx器件的架構優勢。目前常用的H...
發表於 09-29 10:08 303次 閲讀
Vivado中進行HDL代碼設計

Vivado的多種RAM編寫方式

Vivado綜合可以理解多種多樣的RAM編寫方式,將其映射到分佈式RAM或塊RAM中。兩種實現方法在向RAM寫入數據時都是採取...
發表於 09-29 09:40 303次 閲讀
Vivado的多種RAM編寫方式

鴻蒙系統是在什麼系統下編譯?用的是什麼編譯器?

想了解下鴻蒙系統是在什麼系統下編譯?用的是什麼編譯器? ...
發表於 09-27 09:04 136次 閲讀
鴻蒙系統是在什麼系統下編譯?用的是什麼編譯器?

vivado入門資料,vivado工作模式簡介.pdf,FPGA入門教程—詳盡的基礎知識

發表於 09-16 15:04 159次 閲讀
vivado入門資料,vivado工作模式簡介.pdf,FPGA入門教程—詳盡的基礎知識

vivado入門資料,FPGA設計流程指南--pdf

發表於 09-08 09:44 235次 閲讀
vivado入門資料,FPGA設計流程指南--pdf

請問如何在Vivado中導出IO端口跟蹤長度?

大家好, 我從Vivado導出了CSV文件,其中有關於I / O端口的最小和最大跟蹤延遲的Igot信息,但沒有關於跟蹤長度的信息。 ...
發表於 08-28 07:40 101次 閲讀
請問如何在Vivado中導出IO端口跟蹤長度?

編譯的時候編譯器跑去讀自帶的2.0的庫是為什麼?

HARDWARE\TIM.c(52): error:  #136: struct " < unnamed > "    has no field "TIM_IC...
發表於 08-27 03:18 101次 閲讀
編譯的時候編譯器跑去讀自帶的2.0的庫是為什麼?