मैं इस वेबसाइट से SV मर्जिंग इवेंट के बारे में पढ़ रहा था। कोड इस प्रकार है:

module events_ex;

  event ev_1; //declaring event ev_1
 
  initial begin
    fork
      //process-1, triggers the event
      begin
        #40;
        $display($time,"\tTriggering The Event");
        ->ev_1;
      end
     
      //process-2, wait for the event to trigger
      begin
        $display($time,"\tWaiting for the Event to trigger");
        #60;
        @(ev_1.triggered);
        $display($time,"\tEvent triggered");
      end
    join
  end
  initial begin
    #100;
    $display($time,"\tEnding the Simulation");
    $finish;
  end
endmodule

उसी के लिए परिणाम है:

0  Waiting for the Event to trigger
40  Triggering The Event
100 Ending the Simulation

इस विशेष कोड में, ट्रिगर को पहले 40 time units पर निष्पादित किया जा रहा है, फिर 60 time units पर प्रतीक्षा लागू की जाती है। यह ज्ञात है कि, यदि ट्रिगर पहले निष्पादित होता है, तो प्रतीक्षा प्रक्रिया अवरुद्ध रहती है। अगर मैं line 17 में #60 wait(ev_1.triggered); का उपयोग करता हूं तो इसे हल किया जा सकता है। हालाँकि, यह अभी भी वही परिणाम दिखा रहा है? मैं इसके पीछे की अवधारणा को जानना चाहता हूं।

0
Pragya Rathore 12 फरवरी 2021, 00:45

2 जवाब

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

तंत्र बहुत सरल है: event.triggered का मान केवल उसी सिमुलेशन टिक में सेट होता है जब इसे ट्रिगर किया गया था। यह चिपचिपा नहीं होता है और अगले टिक में 0 हो जाता है।

यह ज्ञात है कि, यदि ट्रिगर पहले निष्पादित होता है, तो प्रतीक्षा प्रक्रिया अवरुद्ध रहती है।

हां, क्योंकि अनब्लॉकिंग इवेंट पहले ही बीत चुका है और #60 का पता लगाने में बहुत देर हो चुकी है। इसलिए, अब न तो @ और न ही wait द्वारा इसका पता लगाया जा सकता है।

अब, आप क्या कर सकते हैं कि इवेंट में एक स्टिकी वेरिएबल सेट करें, उदाहरण के लिए triggered निम्नलिखित में:

module events_ex;

  event ev_1; //declaring event ev_1
  logic triggered = 1'b0;
  
  initial begin
    fork
      //process-1, triggers the event
      begin
        #40;
        $display($time,"\tTriggering The Event");
        ->ev_1;
      end
     
      begin 
        @(ev_1)
        triggered = 1'b1; // << set the sticky var
      end
      
      //process-2, wait for the event to trigger
      begin
        $display($time,"\tWaiting for the Event to trigger");
        #60;
        wait(triggered); // << wait for sticky var value of 1
        $display($time, "\tEvent triggered");
      end
    join
  end
  

  initial begin
    #100;
    $display($time,"\tEnding the Simulation");
    $finish;
  end
endmodule

हालांकि, आप @ और wait ऑपरेटरों के बीच शब्दार्थ में अंतर देख सकते हैं। @ मान में बदलाव की प्रतीक्षा करता है, जो #40 पर हुआ और यह #60 पर भी इसे नहीं पकड़ पाएगा। दूसरी ओर, wait स्तर की प्रतीक्षा करता है, ट्रिगर के 1'b1 हो जाने के लिए। तो, यह यहां काम करेगा क्योंकि चिपचिपा संस्करण पहले ही सेट हो चुका है।

2
Serge 12 फरवरी 2021, 06:06

उस वेबसाइट पर उदाहरण बहुत अच्छा नहीं है। आप कभी भी @ का उपयोग triggered पद्धति के साथ नहीं करना चाहेंगे।

जब आप -> ev_1 या ->> ev_1 के साथ किसी ईवेंट को ट्रिगर करते हैं, तो उस ईवेंट की triggered विधि केवल ट्रिगर के क्षण से ही मान्य होती है (या ट्रिगर के NBA क्षेत्र) ->>) के लिए समय चरण के अंत तक।

@ev_1 को ट्रिगर के क्षण से पहले निष्पादित किया जाना चाहिए। अन्यथा इसे अगले ट्रिगर की प्रतीक्षा करनी होगी।

wait(ev_1.triggered()) निर्माण केवल तभी उपयोगी होता है जब इसे ट्रिगर से पहले निष्पादित किया जाता है, या उसी समय-चरण के भीतर और ट्रिगर के बिंदु और उस ट्रिगर की प्रतीक्षा के बीच संभावित दौड़ की स्थिति होती है।

कच्ची घटनाओं का उपयोग करना ऐसा कुछ नहीं है जिसे मैं अधिकांश उपयोगकर्ताओं के लिए अनुशंसा करता हूं। एक ही चीज़ को प्राप्त करने के लिए आमतौर पर अधिक सॉफ़्टवेयर जैसे तंत्र होते हैं।

1
dave_59 12 फरवरी 2021, 06:59