वेरिलॉग दाहिने हाथ की ओर का आकार बदल रहा है
मेरे पास एक बुनियादी मॉड्यूल है जो कुछ प्रदर्शित करने के लिए निम्नानुसार है।
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;
यह पुष्टि करता है कि मेरा संदेह सही है। तो, मैं इस तरह के एक समाधान है, हाँ। हालांकि, मैं वास्तव में इससे संतुष्ट नहीं हूं, मुझे लगता है कि उस व्यवहार को रोकने का एक तरीका होना चाहिए।
किसी भी सहायता की सराहना की जाएगी।
जवाब
जब आपके पास अलग-अलग चौड़ाई के मिश्रण के ऑपरेंड होते हैं, तो वेरिलॉग के पास अभिव्यक्ति के संदर्भ के आधार पर प्रत्येक ऑपरेंड को सबसे बड़े ऑपरेंड की चौड़ाई के लिए नियम है। आपने सही ढंग से नोट किया कि एलएचएस 4 बिट्स है, आरएचएस पर ऑपरेंड 4 बिट्स तक विस्तारित हो जाते हैं। ऑपरेशन लागू करने से पहले ऐसा होता है ।
आप इस तथ्य का लाभ उठाकर इसे ठीक कर सकते हैं कि एक संघ के संचालन स्वयं निर्धारित संदर्भ हैं:
{E, C} = U + {~T} + 1'b1;
अब की चौड़ाई ~T
केवल की चौड़ाई से निर्धारित होती है T
।