वेरिलोग में एक अभिव्यक्ति बिट चौड़ाई को कैसे छोटा किया जाए?


11

एक अभिव्यक्ति पर विचार करें जैसे:

assign x = func(A) ^ func(B);

जहां दुर्गंध का उत्पादन 32 बिट्स चौड़ा है, और x 16 बिट्स का तार है। मैं परिणामी एक्सोर के केवल सबसे कम 16 बिट्स असाइन करना चाहता हूं।

मुझे पता है कि उपरोक्त कोड पहले से ही ऐसा करता है, लेकिन यह एक चेतावनी भी उत्पन्न करता है। "स्पष्ट" दृष्टिकोण काम नहीं करता है:

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected

जवाबों:


8

आप एक और चर का उपयोग कर सकते हैं, हालांकि यह विशेष रूप से सुरुचिपूर्ण नहीं है।

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

एक फ़ंक्शन का उपयोग करने के लिए एक बेहतर दृष्टिकोण होगा।

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));

मैं उम्मीद कर रहा था कि इससे कुछ अच्छा होगा ... ओह ठीक है, मैं बस बड़ी संख्या में छंटनी करूंगा।
user23106

5

आपके उदाहरण में, आप संक्षेप में बिट्स को काट रहे हैं।

ट्रंकेशन को स्पष्ट करना अक्सर सिमुलेशन / लिंट / संश्लेषण में चेतावनी को दूर कर सकता है।

इन-लाइन में ऐसा करने का एक तरीका कास्ट ऑपरेटर का उपयोग करना है, जैसे:

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

यह दृष्टिकोण समझ में आ सकता है यदि यह इस संदर्भ से स्पष्ट है कि सभी बिट्स को गिराया जा रहा है 0 है।

यदि कुछ बिट्स नॉनजरो हो सकते हैं, तो मैं अभी भी एक मध्यवर्ती नेट का उपयोग करने का सुझाव दूंगा जैसे @dwikle ने पिछले उत्तर में सुझाव दिया था , क्योंकि यह अधिक स्पष्ट करता है कि आप वास्तव में बिट्स फेंक रहे हैं। यहाँ यह फिर से संदर्भ के लिए है।

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

1
मुझे लगता है कि यह केवल SystemVerilog में काम करेगा। दिलचस्प गैर-कम।
टॉम कारपेंटर

@TomCarpenter, क्या आप IEEE Std 1364-2005 में उपलब्ध वेरिलॉग के सबसेट तक खुद को सीमित करना चाहते हैं, बजाय नए यूनिफाइड IED Std 1800 संशोधनों में से एक में उपलब्ध सिंथेसिबल वेरिलॉग के पूरे सेट का उपयोग करने के बजाय? आप Verilog-2005 या कुछ स्पष्ट करने के लिए कहना चाह सकते हैं, क्योंकि 2009 में Verilog मानक को एकीकृत SystemVerilog मानक में शामिल किया गया था।
matgately

3

मुझे लगता है कि इससे लाइन को नीचे रखने में मदद मिल सकती है।

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

यह सुनिश्चित नहीं है कि हालांकि यह असाइनमेंट के साथ मान्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.