0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

SystemVerilog 中各種不同的聯(lián)合解析

454398 ? 來源:賽靈思論壇 ? 作者:Alan Schuler ? 2020-11-19 15:16 ? 次閱讀

注意:本文所有內(nèi)容皆來源于Xilinx工程師,

BY Alan Schuler

基本聯(lián)合

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

其工作方式為通過 typedef 來聲明聯(lián)合,并提供不同標識符用于引用此聯(lián)合。 這些標識符稱為“字段”。

例如:

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

union_type my_union;

以上代碼創(chuàng)建了一種新類型,名為“union_type”。

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

此外,代碼最后一行創(chuàng)建了一個新信號,名稱為“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:基本聯(lián)合

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

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

含多維字段的聯(lián)合

上述示例只是簡單演示了聯(lián)合的作用。 讓我們來看下較為復雜的聯(lián)合示例:

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

union_type my_union;

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

其結構如下所示:

圖 2:含多維陣列的聯(lián)合

為此結構分配的 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:多維聯(lián)合的原理圖

含結構的聯(lián)合

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

例如:

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 介紹的聯(lián)合包含 2 個位寬均為 10 位的字段。 第一個字段為名為“data”且位寬為 10 位的矢量。 第二個字段采用包含 5 個字段的結構,這些字段的大小總和同樣為 10 位。

為此創(chuàng)建的結構如下所示:

圖 4:含結構的聯(lián)合

由于當前聯(lián)合中包含結構,因此其正確的引用方式是引用聯(lián)合中的結構:

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

解包聯(lián)合

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

對于前一種情況,如果指定的聯(lián)合包含不同大小的字段,那么該聯(lián)合本身大小將設置為最大字段的大小。

示例 RTL:

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

union_type my_union;

這樣即可創(chuàng)建如下所示結構:

圖 5:含不同大小字段的解包聯(lián)合

含結構的解包聯(lián)合

與打包聯(lián)合相同,解包聯(lián)合同樣可以使用結構。

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;

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

此聯(lián)合將作為位寬 8 位的矢量來創(chuàng)建,如下所示:

圖 6:含結構的解包聯(lián)合

同上,由于聯(lián)合中包含結構,因此需按如下方式來引用信號:

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

編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1602

    瀏覽量

    48896
  • Vivado
    +關注

    關注

    19

    文章

    797

    瀏覽量

    65855
收藏 人收藏

    評論

    相關推薦

    IEEE 1800-2023 SystemVerilog新版本正式發(fā)布了!

    2024年3月初,在美國硅谷舉辦的DVCon2024上,IEEE-SA和Accellera聯(lián)合宣布通過IEEE Get Program可以免費獲取IEEE 1800-2023 SystemVerilog語言參考手冊。
    的頭像 發(fā)表于 03-20 13:52 ?1278次閱讀

    在Vivado Synthesis怎么使用SystemVerilog接口連接邏輯呢?

    SystemVerilog 接口的開發(fā)旨在讓設計中層級之間的連接變得更加輕松容易。 您可以把這類接口看作是多個模塊共有的引腳集合。
    的頭像 發(fā)表于 03-04 15:25 ?741次閱讀
    在Vivado Synthesis<b class='flag-5'>中</b>怎么使用<b class='flag-5'>SystemVerilog</b>接口連接邏輯呢?

    XML在HarmonyOS的生成,解析與轉(zhuǎn)換(下)

    一、XML 解析 對于以 XML 作為載體傳遞的數(shù)據(jù),實際使用需要對相關的節(jié)點進行解析,一般包括解析 XML 標簽和標簽值、解析 XML
    的頭像 發(fā)表于 02-18 10:07 ?609次閱讀

    嵌入式開發(fā):映射表在串口數(shù)據(jù)解析的應用

    1 映射表在串口數(shù)據(jù)解析的應用 1.1 數(shù)據(jù)結構 1.2 指令、函數(shù)映射表 1.3 串口解析函數(shù)實現(xiàn)
    的頭像 發(fā)表于 11-28 10:30 ?355次閱讀

    分享一些SystemVerilog的coding guideline

    本文分享一些SystemVerilog的coding guideline。
    的頭像 發(fā)表于 11-22 09:17 ?579次閱讀
    分享一些<b class='flag-5'>SystemVerilog</b>的coding  guideline

    C語言映射表在串口數(shù)據(jù)解析的應用

    C語言映射表在串口數(shù)據(jù)解析的應用
    的頭像 發(fā)表于 11-13 09:33 ?395次閱讀

    C語言映射表在串口數(shù)據(jù)解析的應用

    一、映射表在串口數(shù)據(jù)解析的應用 二、映射表在UI設計的應用
    發(fā)表于 10-27 11:16 ?261次閱讀

    SystemVerilog相比于Verilog的優(yōu)勢

    我們再從對可綜合代碼的支持角度看看SystemVerilog相比于Verilog的優(yōu)勢。針對硬件設計,SystemVerilog引入了三種進程always_ff,always_comb
    的頭像 發(fā)表于 10-26 10:05 ?708次閱讀
    <b class='flag-5'>SystemVerilog</b>相比于Verilog的優(yōu)勢

    systemverilog:logic比reg更有優(yōu)勢

    systemverilog協(xié)議,logic定義四態(tài)值,即向量(vector)的每個位(bit)可以是邏輯0, 1, Z或X,與verilog協(xié)議的reg很接近。但是logic有個很明顯的優(yōu)勢,不允許多驅(qū)動。
    的頭像 發(fā)表于 10-26 09:32 ?809次閱讀
    <b class='flag-5'>systemverilog</b>:logic比reg更有優(yōu)勢

    SystemVerilog在硬件設計部分有哪些優(yōu)勢

    談到SystemVerilog,很多工程師都認為SystemVerilog僅僅是一門驗證語言,事實上不只如此。傳統(tǒng)的Verilog和VHDL被稱為HDL(Hardware Description
    的頭像 發(fā)表于 10-19 11:19 ?944次閱讀
    <b class='flag-5'>SystemVerilog</b>在硬件設計部分有哪些優(yōu)勢

    SystemVerilog:處理信號雙驅(qū)動問題解析

    SystemVerilog,類型可以分為線網(wǎng)(net)和變量(variable)。線網(wǎng)的賦值設定與Verilog的要求相同,即線網(wǎng)賦值需要使用連續(xù)賦值語句(assign),而不應該出現(xiàn)在過程塊(initial/always)
    的頭像 發(fā)表于 10-13 14:53 ?1727次閱讀
    <b class='flag-5'>SystemVerilog</b>:處理信號雙驅(qū)動問題<b class='flag-5'>解析</b>

    SystemVerilog聯(lián)合(union)介紹

    SystemVerilog ,聯(lián)合只是信號,可通過不同名稱和縱橫比來加以引用。
    的頭像 發(fā)表于 10-08 15:45 ?1092次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的<b class='flag-5'>聯(lián)合</b>(union)介紹

    看一下SystemVerilogpackage的使用方法與注意事項

    談到package,用過VHDL的工程師并不陌生。實際上,SystemVerilog的package正是從VHDL引入的,以進一步增強其在系統(tǒng)級的描述能力。
    的頭像 發(fā)表于 10-07 11:33 ?1821次閱讀
    看一下<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>package的使用方法與注意事項

    systemverilog:logic比reg更有優(yōu)勢?

    systemverilog協(xié)議,logic定義四態(tài)值,即向量(vector)的每個位(bit)可以是邏輯0, 1, Z或X,與verilog協(xié)議的reg很接近。但是logic有個很明顯的優(yōu)勢,不允許多驅(qū)動。
    的頭像 發(fā)表于 09-28 17:34 ?2287次閱讀
    <b class='flag-5'>systemverilog</b>:logic比reg更有優(yōu)勢?

    SystemVerilog的隨機約束方法

    上一篇文章《暗藏玄機的SV隨機化》介紹了SystemVerilog各種隨機化方法,本文將在其基礎上引入SystemVerilog的隨機約束方法(constraints)。通過使用隨機約束,我們可以將隨機限制在一定的空間內(nèi),有針
    的頭像 發(fā)表于 09-24 12:15 ?1213次閱讀