HDLBits (12) — 詳解向量
本題鏈接:
https://hdlbits.01xz.net/wiki/Vector1
向量用于使用一個名稱對相關(guān)信號進(jìn)行分組,以便更方便地操作。 例如,wire [7:0] w; 聲明一個名為 w 的 8 位向量,相當(dāng)于有 8 條單獨的線。
聲明向量
向量必須被聲明:
type 指定向量的數(shù)據(jù)類型。 這通常是線網(wǎng)( wire )或寄存器( reg )。 如果您要聲明輸入或輸出端口,則除了類型還可以另外加上端口類型(例如,輸入或輸出)。 舉些例子:
向量的字節(jié)序(或常說的“方向”)是最低有效位是低地址(小端,例如 [3:0])或高地址(大端,例如 [0:3])。在 Verilog 中,一旦用特定的字節(jié)序聲明了向量,就必須始終以相同的方式使用它。 例如,當(dāng) vec 被聲明為 wire [3:0] vec 時,寫入 vec[0:3]; 是違規(guī)的。 所以與字節(jié)序保持一致是一種很好的做法,因為如果分配或一起使用不同字節(jié)序的向量,就會發(fā)生奇怪的錯誤。
隱式網(wǎng)絡(luò)
隱式網(wǎng)絡(luò)通常是難以檢測的錯誤的來源。 在 Verilog 中,網(wǎng)絡(luò)類型信號可以通過賦值語句或通過將未聲明的東西附加到模塊端口來隱式創(chuàng)建。 隱式網(wǎng)絡(luò)始終是一位連線,如果您打算使用矢量,則會導(dǎo)致錯誤。 可以使用 `default_nettype none 指令禁用隱式網(wǎng)絡(luò)的創(chuàng)建。
添加 `default_nettype none 會使第二行代碼出錯,從而使錯誤更加明顯。
未打包 vs. 打包數(shù)組
您可能已經(jīng)注意到,在聲明中,向量索引寫在向量名稱之前。 這聲明了數(shù)組的“打包”位寬,其中位被“打包”到一個 blob 中(這與模擬器有關(guān),但與硬件無關(guān))。 解壓縮的位寬在名稱之后聲明。 它們通常用于聲明內(nèi)存數(shù)組。 由于 ECE253 沒有涵蓋內(nèi)存數(shù)組,我們在本課程中沒有使用打包數(shù)組。
通過訪問下面的鏈接得到對應(yīng)的細(xì)節(jié):
http://www.asic-world.com/systemverilog/data_types10.html
訪問向量元素:部分選擇
訪問整個向量是使用向量名稱完成的。例如:
獲取整個 4 位向量a并將其分配給整個 8 位向量w(聲明取自上面)。如果左右兩邊的長度不匹配,則根據(jù)需要進(jìn)行擴(kuò)展或截斷。
部分選擇運算符可用于訪問向量的一部分:
一點練習(xí)
構(gòu)建一個組合電路,將輸入半字(16 位, [15:0] )分成低 [7:0] 和高 [15:8] 字節(jié)。
模塊聲明:

題目

答案

輸出波形


當(dāng)位寬大于 1 時,wire 或 reg 即可聲明為向量的形式。我們可以指定某一位或若干相鄰位,作為其他邏輯使用。Verilog 支持可變的向量域選擇,以及指定 bit 位后固定位寬的向量域選擇訪問。
[bit+: width]?: 從起始 bit 位開始遞增,位寬為 width。
[bit-: width]?: 從起始 bit 位開始遞減,位寬為 width。
對信號重新進(jìn)行組合成新的向量時,需要借助大括號。
參考內(nèi)容:
2.3 Verilog 數(shù)據(jù)類型?| 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-data-type.html