2010-06-10 11 views
27

Verilog में 1 डी और 2 डी बाइट सरणी घोषित और उपयोग कैसे करें?Verilog में 1 डी और 2 डी बाइट सरणी घोषित करने और उपयोग करने के लिए कैसे?

उदाहरण के लिए। जैसे

byte a_2D[3][3]; 
byte a_1D[3]; 

// using 1D 
for (int i=0; i< 3; i++) 
{ 
    a_1D[i] = (byte)i; 
} 

// using 2D 
for (int i=0; i< 3; i++) 
{ 
    for (int j=0; j< 3; j++) 
    { 
     a_2D[i][j] = (byte)i*j; 
    } 
} 

उत्तर

46

कुछ Verilog बिट्स में सोचता है कि कैसे करना है, तो reg [7:0] a[0:3] आप एक 4x8 बिट सरणी (= 4x1 बाइट सरणी) दे देंगे। आपको a[0] के साथ इस में पहला बाइट मिलता है। दूसरे बाइट का तीसरा बिट a[1][2] है।

बाइट्स की 2 डी सरणी के लिए, पहले अपने सिम्युलेटर/कंपाइलर की जांच करें। पुराने संस्करण (पूर्व '01, मुझे विश्वास है) इसका समर्थन नहीं करेगा। फिर reg [7:0] a [0:3] [0:3] आपको बाइट्स की 2 डी सरणी देगा। उदाहरण के लिए a[2][0][7] के साथ एक बिट को एक्सेस किया जा सकता है।

reg [7:0] a [0:3]; 
reg [7:0] b [0:3] [0:3]; 

reg [7:0] c; 
reg d; 

initial begin 

    for (int i=0; i<=3; i++) begin 
     a[i] = i[7:0]; 
    end 

    c = a[0]; 
    d = a[1][2]; 


    // using 2D 
    for (int i=0; i<=3; i++) 
     for (int j=0; j<=3; j++) 
      b[i][j] = i*j; // watch this if you're building hardware 

end 
+1

क्या लूप को <3 के बजाय <3 की आवश्यकता नहीं है? –

+1

@RossAiken सरणी घोषणा [ए: बी] शैली समावेशी सीमा है। तो <= सही है। – siu

+0

@siu - मैंने मूल रूप से गलत किया - रॉस-ऐइकन ने त्रुटि देखी और मैंने जवाब संपादित किया ... – Marty

8

मार्टी उत्कृष्ट उत्तर के अलावा, SystemVerilog विनिर्देश byte डेटा प्रकार प्रदान करता है।

module tb; 

byte b [4]; 

initial begin 
    foreach (b[i]) b[i] = 1 << i; 
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]); 
    $finish; 
end 

endmodule 

यह बाहर प्रिंट:

Address = 0, Data = 00000001 
Address = 1, Data = 00000010 
Address = 2, Data = 00000100 
Address = 3, Data = 00001000 

यह मार्टी reg [7:0] a [0:3]; लिए अवधारणा में इसी तरह की है निम्नलिखित एक 4x8-बिट चर (4 बाइट्स) वाणी, प्रत्येक बाइट एक मूल्य प्रदान करती है, तो सभी मूल्यों को प्रदर्शित करता है । हालांकि, byte एक 2-राज्य डेटा प्रकार (0 और 1) है, लेकिन reg 4-राज्य (01xz) है। इस सिस्टम वेरिलोग वाक्यविन्यास का समर्थन करने के लिए byte का उपयोग करने के लिए आपके टूल चेन (सिम्युलेटर, सिंथेसाइज़र इत्यादि) की भी आवश्यकता है। नोट अधिक कॉम्पैक्ट foreach (b[i]) लूप सिंटैक्स भी नोट करें।

सिस्टम वेरिलोग विनिर्देश बहु-आयामी सरणी प्रकारों की विस्तृत विविधता का समर्थन करता है। एलआरएम उन्हें बेहतर से समझा सकता है; आईईईई स्टडी 1800-2005, अध्याय 5.

3

यह वास्तव में सरल है, सी प्रोग्रामिंग की तरह आपको घोषणा के दौरान दाईं ओर सरणी इंडेक्स को पास करने की आवश्यकता है। लेकिन हाँ 4 तत्वों के लिए वाक्यविन्यास [0: 3] की तरह होगा।

reg a[0:3]; 

यह एकल बिट की सरणी का 1 डी बना देगा। इसी तरह 2 डी सरणी इस तरह बनाया जा सकता है:

reg [0:3][0:2]; 

अब सी में तो यह आंतरिक रूप से 32 बिट के एक 2 डी सरणी पैदा करेगा, आप पूर्णांक की एक 2 डी सरणी बनाने लगता है। लेकिन दुर्भाग्यवश वेरिलोग एक एचडीएल है, इसलिए यह बिट्स में सोचता है, फिर बिट्स का गुच्छा (हालांकि वेरिलोग में इंट डेटाटाइप है), यह आपको सरणी के तत्व के अंदर संग्रहीत करने के लिए किसी भी बिट्स को बनाने की अनुमति दे सकता है (जो कि नहीं है सी के मामले में, आप सी में 2 डी सरणी के प्रत्येक तत्व में 5-बिट्स स्टोर नहीं कर सकते हैं। तो एक 2 डी सरणी बनाने के लिए, जिसमें प्रत्येक व्यक्तिगत तत्व 5 बिट मान रख सकता है, आपको यह लिखना चाहिए:

reg [0:4] a [0:3][0:2]; 
संबंधित मुद्दे