module tb;
  
  bit [7:0] bytes [];
  bit [7:0] q[$];
  
  initial begin
    bytes = new[20];
    bytes[0] = 8'hee;
    bytes[1] = 8'hea;
    bytes[2] = 8'haf;
    bytes[3] = 8'haf;
    bytes[4] = 8'haf;
    bytes[5] = 8'h50;
    bytes[6] = 8'h6a;
    bytes[7] = 8'h0d;
    bytes[8] = 8'hc8;
    bytes[9] = 8'hc8;
    bytes[10] = 8'h21;
    foreach(bytes[i])
      $write("%h ", bytes[i]);
    $display("\n");
    q = bytes.unique();
    foreach(q[i])
      $write("%h ", q[i]);
  end
endmodule

उपरोक्त कोड में, मुझे bytes नामक गतिशील सरणी के लगातार डुप्लिकेट तत्वों (केवल लगातार डुप्लिकेट तत्व) को हटाने की आवश्यकता है और उन्हें q नामक कतार में रखना होगा। साथ ही, मुझे सभी पिछली 0 को हटाने की जरूरत है। मैंने unique() का उपयोग करने की कोशिश की, लेकिन मुझे जो मिलता है वह कुछ अलग है।

अपेक्षित उत्पादन:

ee ea af af af 50 6a 0d c8 c8 21 00 00 00 00 00 00 00 00 00 00

ee ea af 50 6a 0d c8 21

आउटपुट मुझे edaplayground पर QuestaSim पर मिल रहा है

ee ea af af af 50 6a 0d c8 c8 21 00 00 00 00 00 00 00 00 00 00 
 
00 0d 21 50 6a af c8 ea ee

अधिक जानकारी:

एक बार जब यह 0 हो जाता है, तो इसमें अधिक डुप्लीकेट नहीं हो सकते हैं। चूंकि यह डीयूटी इंटरफ़ेस पर डेटा मानों को पढ़कर बनाई गई गतिशील सरणी है, इसलिए अंतिम मान पढ़ा गया 0 है और यह 0 पर रहता है जब तक कि नया डेटा न हो।

चूंकि इसका दोहराव केवल आउटपुट इंटरफेस पर मौजूद मौजूदा डेटा के कारण होता है (कुछ मध्यस्थता प्राथमिकता के बाद, अगले प्राथमिकता पोर्ट डेटा के लिए कुछ चक्रों की प्रतीक्षा)। और डेटा को अद्वितीय मान (डेटा जो DUT में इनपुट है) रखने के लिए यादृच्छिक रूप से बाधित किया गया है।

उदाहरण के लिए मैं पोर्ट 3 पर इनपुट पर ए, बी, सी, डी भेजता हूं और पोर्ट 3 कुछ चक्रों की जांच के लिए प्रतीक्षा करता है कि क्या कोई अन्य बंदरगाह अनुरोध किया गया है, इसलिए आउटपुट बीबीबी सीसी डी (बी और 2 चक्र के लिए 3 चक्र) जैसा कुछ हो सकता है सी के लिए) और गतिशील सरणी इस आउटपुट को पढ़ती है। डुप्लीकेट आइटम को हटाना स्कोरबोर्ड में इनपुट और आउटपुट तुल्यता की तुलना करने के लिए है।

1
shaam 15 अक्टूबर 2020, 15:19

3 जवाब

सबसे बढ़िया उत्तर

ऐसा लगता है कि कतार में तत्वों का क्रम जो unique विधि द्वारा लौटाया गया है, परिभाषित नहीं है। तो, अपनी कतार को ints की कतार में बदलने के बारे में क्या:

int q[$];

और फिर unique_index का उपयोग करना:

q = bytes.unique_index();

और फिर उस पर sort विधि का उपयोग करना:

q.sort();

फिर आदेश परिभाषित किया गया है, जो भी सिम्युलेटर आप उपयोग करते हैं। (और कोड लिखना बेहतर है जो किसी भी सिम्युलेटर पर काम करता है)। इसलिए, अब हमारे पास अनुक्रमितों की एक कतार है, जिसका उपयोग हम मूल सरणी (byte) को अनुक्रमित करने के लिए कर सकते हैं:

foreach(q[i])
   $write("%h ", bytes[q[i]]);

यह मुझे यह आउटपुट देता है (एल्डेक रिवेरा प्रो पर):

ee ea af af af 50 6a 0d c8 c8 21 00 00 00 00 00 00 00 00 00 

ee ea af 50 6a 0d c8 21 00 

https://www.edaplayground.com/x/6pV6

module tb;
  
  bit [7:0] bytes [];
  int q[$];
  
  initial begin
    bytes = new[20];
    bytes[0] = 8'hee;
    bytes[1] = 8'hea;
    bytes[2] = 8'haf;
    bytes[3] = 8'haf;
    bytes[4] = 8'haf;
    bytes[5] = 8'h50;
    bytes[6] = 8'h6a;
    bytes[7] = 8'h0d;
    bytes[8] = 8'hc8;
    bytes[9] = 8'hc8;
    bytes[10] = 8'h21;
    foreach(bytes[i])
      $write("%h ", bytes[i]);
    $display("\n");
    q = bytes.unique_index();
    q.sort();
    foreach(q[i])
      $write("%h ", bytes[q[i]]);
  end
endmodule
2
Matthew Taylor 15 अक्टूबर 2020, 17:01
लेकिन मैं अभी भी नहीं मिला, कैसे int का उपयोग करके समस्या हल हो गई?
 – 
shaam
15 अक्टूबर 2020, 15:54
int का उपयोग करने से समस्या का हल नहीं हुआ, यह आवश्यक था क्योंकि unique_index तत्वों की अनुक्रमणिका देता है, जो int हैं s सरणी का तत्व प्रकार नहीं है (जिसे unique द्वारा लौटाया जाता है)।
 – 
Matthew Taylor
15 अक्टूबर 2020, 16:59
module duplicateremoval;
int array[] = {1, 2, 3, 4, 5, 2, 3, 4, 6, 8, 3};

int i, j, k;
  
initial begin
  for(i=0 ; i<array.size()-1 ; i=i+1)
  begin
    for(j=i+1 ; j<array.size() ; j=j+1)         //j should be one step advanced to i
          begin
               if(array[i] == array[j])
                  begin
                       for(k=j ; k<array.size() ; k=k+1)
                            begin
                                 array[k] = array[k+1];
                             end
                     j--;
                    end
               end
    $display("array[%0d]=%0d", i, array[i]);
   end
 end        
endmodule

इस कोड में, वर्तमान मान के साथ अगले मान की तुलना करने वाले लूप के लिए उपयोग करना। यदि वर्तमान मान अगले मान के समान है, तो वर्तमान मान छोड़ दिया जाएगा और अगला मान वर्तमान मान को असाइन किया जाएगा। प्रतिस्थापित करने के बाद, इटरेटर को 1 से कम करें ताकि यह वर्तमान स्थिति में हो।

-5
Akshay Pradeep 29 मई 2021, 18:23
1
स्टैक ओवरफ्लो में आपका स्वागत है। कृपया उत्तर कैसे दें पढ़ें। कोड बहुत अच्छा है, लेकिन यह बहुत बेहतर है जब इसके साथ यह स्पष्टीकरण दिया जाता है कि यह समस्या को कैसे हल करता है। हम यहां लोगों को सीखने में मदद करने के लिए हैं, न कि उन्हें आँख बंद करके कॉपी और पेस्ट करने के लिए स्निपेट देने के लिए।
 – 
Chris
28 मई 2021, 15:32

आप मूल सरणी के माध्यम से लूप कर सकते हैं और लगातार आइटम मेल नहीं खाने पर केवल नई कतार में आइटम जोड़ सकते हैं। यह अनुगामी 00 को भी हटा देता है।

module tb;
  
  bit [7:0] bytes [];
  bit [7:0] q[$];
  
initial begin
    bytes = new[20];
    bytes[0] = 8'hee;
    bytes[1] = 8'hea;
    bytes[2] = 8'haf;
    bytes[3] = 8'haf;
    bytes[4] = 8'haf;
    bytes[5] = 8'h50;
    bytes[6] = 8'h6a;
    bytes[7] = 8'h0d;
    bytes[8] = 8'hc8;
    bytes[9] = 8'hc8;
    bytes[10] = 8'h21;

    $display;
    foreach (bytes[i]) $write("%h ", bytes[i]);
    $display;

    q[0] = bytes[0];
    for (int i=1; i<bytes.size(); i++) begin
        if (bytes[i] != bytes[i-1]) q.push_back(bytes[i]);
    end
    if (q[$] == 0) void'(q.pop_back());

    foreach (q[i]) $write("%h ", q[i]);
    $display;
    $display;
end

endmodule

यह आउटपुट:

ee ea af af af 50 6a 0d c8 c8 21 00 00 00 00 00 00 00 00 00 
ee ea af 50 6a 0d c8 21

यहां edaplayground पर एक प्रदर्शन दिया गया है।


unique सरणी पद्धति के संबंध में, IEEE Std 1800-2017, खंड 7.12.1 सरणी लोकेटर विधियों में कहा गया है:

लौटाए गए तत्वों का क्रम मूल सरणी के क्रम से संबंधित नहीं है।

शायद इसका मतलब है कि परिणामी आदेश की गारंटी नहीं दी जा सकती है। आपके कोड के साथ, हमें edaplayground (प्रश्न में मूल कोड) पर विभिन्न सिमुलेटर पर मिश्रित परिणाम मिलते हैं; कुछ आपके वांछित आउटपुट ऑर्डर का उत्पादन करते हैं, जबकि अन्य नहीं करते हैं।

3
toolic 15 अक्टूबर 2020, 17:09