वेरिलॉग दाहिने हाथ की ओर का आकार बदल रहा है

Jan 14 2021

मेरे पास एक बुनियादी मॉड्यूल है जो कुछ प्रदर्शित करने के लिए निम्नानुसार है।

module tb();

reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;

initial begin

    U = 5;
    T = 3;
    {E, C} = U + ~T + 1'b1;
    #1000;

end

endmodule

मुझे उम्मीद है कि ई 1 हो सकता है, क्योंकि;

U है 101

T है 011

और U + ~T + 001,

   101
   100
   001
+______
= 1010 

तो, C को 010 हिस्सा मिलता है और E को 1. मिलता है। यह अपेक्षित व्यवहार है, हालाँकि, मुझे C उतना ही मिलता है, लेकिन E को 0. मुझे लगता है कि verilog RHS वेरिएबल्स के आकार को 4 बिट्स तक बढ़ा रहा है, क्योंकि बाएं हाथ की तरफ 4 बिट्स हैं ( 1 + 3)। हालांकि, टी के लिए, यह टी को पूरक करने से पहले 0 का नेतृत्व करता है, इसलिए टी 0011 हो जाता है और इसका पूरक टी पूरक के 0100 के बजाय 1100 होता है।

और यह होता है,

   0101
   1100
   0001
+______
= 10010 

जिसके कारण E देखा गया है।

मुझे समझ नहीं आता कि ऐसा क्यों है, और एक अग्रणी शून्य को जोड़ने से पहले पूरक बनाने का कोई तरीका नहीं मिल सकता है।

अगर मैं इसके बजाय निम्नलिखित करता हूं, तो यह ठीक काम करता है और E को 1 मिलता है:

    U = 5;
    T = 3;
    T = ~T;
    {E, C} = U + T + 1'b1;

यह पुष्टि करता है कि मेरा संदेह सही है। तो, मैं इस तरह के एक समाधान है, हाँ। हालांकि, मैं वास्तव में इससे संतुष्ट नहीं हूं, मुझे लगता है कि उस व्यवहार को रोकने का एक तरीका होना चाहिए।

किसी भी सहायता की सराहना की जाएगी।

जवाब

3 dave_59 Jan 14 2021 at 05:55

जब आपके पास अलग-अलग चौड़ाई के मिश्रण के ऑपरेंड होते हैं, तो वेरिलॉग के पास अभिव्यक्ति के संदर्भ के आधार पर प्रत्येक ऑपरेंड को सबसे बड़े ऑपरेंड की चौड़ाई के लिए नियम है। आपने सही ढंग से नोट किया कि एलएचएस 4 बिट्स है, आरएचएस पर ऑपरेंड 4 बिट्स तक विस्तारित हो जाते हैं। ऑपरेशन लागू करने से पहले ऐसा होता है ।

आप इस तथ्य का लाभ उठाकर इसे ठीक कर सकते हैं कि एक संघ के संचालन स्वयं निर्धारित संदर्भ हैं:

{E, C} = U + {~T} + 1'b1;

अब की चौड़ाई ~Tकेवल की चौड़ाई से निर्धारित होती है T