2013-05-26 45 views
2

簡單問題Verilog:令

如果我需要使用4個8位數字,我會聲明以下reg。

reg [7:0] numbers [3:0] 

我對第一個和第二個聲明([7:0]和[3:0])之間的區別很困惑。他們應該以什麼順序來?第一個人是否會留下一個數字的大小,而第二個人是否是數字的數量,反之亦然?是[7:0]還是[0:7]給出正確的順序?

在此先感謝。

編輯:

號碼的普通陣列看起來像這樣,例如

0000 
0110 
0001 

有三個4位數字(0000,0110,0001)。我們可以通過使用數組索引來訪問它們。因此,訪問第二個數字的第一個數字是這樣做的

a[0][1] 

假設這個數組存儲在變量a中。

返回Verilog,如果我將交換reg中的值或者以相反順序([0:7])聲明它們,訪問元素將如何更改?

+1

運行模擬並找出。 – toolic

回答

3
  1. reg[7:0]是8位「登記」,或可變
  2. reg[7:0] numbers[3:0]是1 d陣列4層的元件,命名 numbers,其中的每一個是8位的寄存器
  3. numbers一個元件被稱爲訪問
  4. numbers[i][j]numbers[i]的位選。它訪問位 jnumbers
  5. i個元素作爲toolic說,這是更傳統的數組索引是 編號[lsb:msb],但沒有很好的理由。

當分配兩個對象時,位從左到右複製,與VHDL相同。

Verilog對位和部分選擇和數組索引進行檢查很差。請參閱下面的代碼。

module top; 
    initial 
    test; 
    task test; 
     reg[3:0] a[0:1]; 
     reg[0:3] b[0:1]; 
     reg[2:5] c[0:1]; 
     begin 
     a[0] = 4'b1101; 
     a[1] = 4'b0110; 
     a[2] = 4'b0001;      // error, but not caught by Verilog 

     $display("a[2] is %d", a[2]);  // modelsim produces no warning, prints 'a[2] is x' 
     $display("a[0][4] is %b", a[0][4]); // modelsim warns, and prints 'a[0][4] is x' 

     $display(       // produces '1.1.0.1' 
     "a[0][3:0] is %b.%b.%b.%b", a[0][3], a[0][2], a[0][1], a[0][0]); 

     b[0] = a[0];       
     $display("b[0] is %d", b[0]);  // produces '13' 
     $display(       // produces '1.1.0.1' 
     "b[0][0:3] is %b.%b.%b.%b", b[0][0], b[0][1], b[0][2], b[0][3]); 

     c[0] = a[0];       
     $display("c[0] is %d", c[0]);  // produces '13' 
     $display(       // produces '1.1.0.1' 
     "c[0][2:5] is %b.%b.%b.%b", c[0][2], c[0][3], c[0][4], c[0][5]); 
    end 
    endtask 
endmodule 
2

是的,語法可以用於聲明4 8位數字,但它是更常規爲0到留在結腸的單詞的數目:

reg [7:0] numbers [0:3] 
+0

但它會給出與普通數組相同的順序嗎? –

+0

我不明白你的問題。請詳細說明使用代碼示例。 – toolic

+0

好吧,我會在編輯 –

0

右側的尺寸稱爲未包裝的尺寸,左側的尺寸已打包。我通過網絡發現了這一點,作爲訪問元素的簡單方法。 「從左到右,從右開始」。所以你首先從解包的尺寸開始。爲了在您的聲明中訪問第三位數字的第8位,我將使用數字編號[2] [7]。 This帖子有適當的解釋。

如果你使用相同的約定來聲明和賦值,我認爲它應該沒問題。事實上,消除[:]要簡單得多,並將其聲明爲給出4位,8位數的 reg [7:0] numbers [4];