पर भी चर्चा की:

https://verificationacademy.com/forums/systemverilog/parameterizing-bit-widths-fields-packed-struct-so-modules-can-infer-bit-width-if-used-port-map-virtual-interface-interface- संकलन-समय-कॉन्फ़िगर-संरचना-बिट-चौड़ाई

https://forums.xilinx.com/t5/Synthesis/Parameterizing-the-Bit-Widths-of-fields-in-a-packed-struct-so/td-p/1191678

मुझे अपने कोड को अधिक सुरुचिपूर्ण और कम वर्बोज़ बनाने के लिए नवीनतम भाषा सुविधाओं का उपयोग करने की कोशिश कर रहे SystemVerilog में अपने इरादे को पूरा करने में परेशानी हो रही है। संश्लेषण के लिए**

मैं निम्नलिखित को पूरा करना चाहता हूं:

  • एक पैक संरचना में फ़ील्ड की बिट चौड़ाई को पैरामीटर करने में सक्षम हो जिसे मैं परिभाषित करना चाहता हूं ... मैंने पैरामीटरयुक्त इंटरफ़ेस निर्माण का उपयोग करके इसे पूरा करने का प्रयास किया है
  • मैं उस पैरामीटरयुक्त इंटरफ़ेस के साथ मॉड्यूल के लिए एक इनपुट के रूप में मॉड्यूल के लिए इंटरफ़ेस के अंदर परिभाषित उस पैक की गई संरचना के अंदर किसी फ़ील्ड की बिट चौड़ाई का अनुमान लगाने में सक्षम होना चाहता हूं

मैं ज्यादातर पिछले प्रयोगों में सफल रहा हूं लेकिन मुझे एक समस्या का सामना करना पड़ा है।

कृपया निम्नलिखित सरल इंटरफ़ेस परिभाषा देखें:

interface MyInterface #(int DATA_W, ADDR_W) () ;

  typedef struct packed
    { logic valid
    ; logic [ADDR_W-1:0] addr
    ; logic [DATA_W-1:0] data
    ; } SimpleStruct;

  SimpleStruct bus;
  logic ready;

  modport SNK (input bus, output ready);
  modport SRC (output bus, input ready);

endinterface

इंटरफ़ेस को इंस्टेंट करना और इस उदाहरण के लिए मेरे शीर्ष मॉड्यूल में एक साधारण मॉड्यूल के इनपुट पर इसका उपयोग करना काफी आसान है:

module TopTest 
  ( input wire Clock
  , input wire Reset
  , input wire [31:0] In
  , output wire dummyOut
  ) ;

  MyInterface # ( 32, 3 ) my_interface ();

  assign my_interface.bus.data = In ;
  assign my_interface.bus.addr = 3'h3 ;

  InnerTest inst_mod_inner_test
    ( .Clock( Clock )
    , .Reset( Reset )
    , .Sink( my_interface )
    ) ;

  assign dummyOut = my_interface.ready ;

endmodule

जिस समस्या में मैं चल रहा हूं वह यह है कि मैं वास्तविक मॉड्यूल को फ़ील्ड बिट चौड़ाई के साथ पैरामीटर नहीं करना चाहता, क्योंकि मेरा मानना ​​​​है कि संकलन समय पर फ़ील्ड की बिट चौड़ाई पहले से ही स्थापित और सुलभ होनी चाहिए। ऐसा नहीं लगता है, और मैं सोच रहा हूं कि इंटरफ़ेस में पैक्ड स्ट्रक्चर की थोड़ी चौड़ाई का अनुमान लगाने के लिए मैं कुछ भी कर सकता हूं (याद रखें कि यह मामला है क्योंकि मैं इसे पैरामीटरकृत करना चाहता हूं, मुझे पता है कि यह आसान है एक संरचना के क्षेत्र के $ बिट प्राप्त करें जो एक इंटरफ़ेस में परिभाषित नहीं है बल्कि इसके बजाय एक पैकेज या मॉड्यूल में परिभाषित किया गया है)

module InnerTest 
  ( input wire Clock
  , input wire Reset
  , MyInterface.SNK Sink
  ) ;

  localparam BIT_WIDTH_SINK_DATA = $bits( Sink.bus.data ) // this line errors out b/c sink is 'virtual'

  RAM # ( .DATA_WIDTH( BIT_WIDTH_SINK_DATA ) ) ram ( ... // etc

  ... other code to drive output ready of interface ...

endmodule

कई कारण हैं कि एक डिजाइनर एक मॉड्यूल को "पैरामीटर करने योग्य" क्यों बनाना चाहेगा और मैंने अतीत में उस दृष्टिकोण को लिया है, लेकिन मुझे जानकारी की नकल न करने में बहुत दिलचस्पी है। अगर मैं आसान तरीका अपनाता, तो मैं बस अपने आंतरिक परीक्षण मॉड्यूल को मापता ताकि मैं इसे DATA_WIDTH प्रदान कर सकूं, लेकिन मेरे पास अपडेट करने के लिए दो नंबर होंगे और बहुत सारे पैरामीटर जो मुझे लगता है कि मुझे इसकी आवश्यकता नहीं है। मुझे लगता है कि यह सबसे सुरुचिपूर्ण होगा अगर मैं किसी भी तरह से पैरामीटरयुक्त संरचना की विशेषताओं का अनुमान लगा सकता हूं। मैं जिस जानकारी की तलाश कर रहा हूं वह वास्तव में मेरी राय में संकलन समय पर जानी जाती है। मैं इसे एक्सेस नहीं कर सकता, या यह SystemVerilog की एक और कमी है।

अनुरूपण में Q का अनुसरण करें डेव द्वारा उल्लिखित समाधान QuestaSim का उपयोग करते समय बहुत उपयोगी था, लेकिन अब QuestaSim में विभिन्न मुद्दों में चल रहा है:

इंटरफ़ेस पोर्ट "सिंक" के माध्यम से पैरामीटर संदर्भ "sink.bus.data" मान्य नहीं है जब इंस्टेंस में वास्तविक इंटरफ़ेस एक सरणी इंस्टेंस तत्व है या जेनरेट कंस्ट्रक्शन के नीचे है

इसके लिए समाधान क्या है, मुझे समझ में नहीं आता कि केवल एक जनरेट स्टेटमेंट में होने से चीजों के बहाव पर असर पड़ेगा। इस मामले में मैं विभिन्न फीफो कार्यान्वयनों के बीच चयन करने के लिए एक जनरेट स्टेटमेंट का उपयोग करता हूं, कोड की रेखा के ऊपर कुछ परतें जहां त्रुटि होती है।

typedef sink.bus.data questasim_workaround;
localparam width = $bits(questasim_workaround);

अनुसरण करें प्रयोग मैंने खुद को DATA_W में पास करने के लिए प्रतिबंधित करने के बजाय टाइप में पास करने का प्रयोग किया है।

interface MyInterface #(int ADDR_W, type DATA_TYPE) () ;

  typedef struct packed
    { logic valid
    ; logic [ADDR_W-1:0] addr
    ; DATA_TYPE data
    ; } SimpleStruct;

  SimpleStruct bus;
  logic ready;

  modport SNK (input bus, output ready);
  modport SRC (output bus, input ready);

endinterface

यह अधिक लचीलेपन की अनुमति देता है। मैंने देखा है कि विवाडो सिम्युलेटर और सिंथेसिस टूल बिना किसी समस्या के इस तरह के एक उदाहरण को संभाल सकते हैं।

module SomeModule
  ( MyInterface myInt
  blah...
  );

  localparam SOMETHING = $bits(myInt.DATA_TYPE);
  // or equivalently
  localparam SOMETHING_ELSE = $bits(myInt.data);
  // or even this, for needs of a internal signal for pipelined processing steps
  MyInterface # ($bits(myInt.addr), myInt.DATA_TYPE) internal_0 () ;

इसके स्थान पर QUestaSim में हमें डेव के कार्य को लागू करना पड़ा है:

module SomeModule
  ( MyInterface myInt
  blah...
  );

  // this gets less elegant :/
  typedef myInt.data questasim_workaround_data;
  typedef myInt.addr questasim_workaround_addr;

  localparam SOMETHING = $bits(questasim_workaround_data);
  // or equivalently
  localparam SOMETHING_ELSE = $bits(questasim_workaround_data);
  // or even this, for needs of a internal signal for pipelined processing steps

  MyInterface # ($bits(questasim_workaround_addr), questasim_workaround_data) internal_0 () ;
0
ik631 6 जिंदा 2021, 15:23

2 जवाब

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

जब भी आप विवाडो में "[सिंथ 8-27] स्कोप्ड/पदानुक्रमित प्रकार का नाम समर्थित नहीं" के आसपास अप्रत्याशित त्रुटि देखते हैं ... यह देखने के लिए जांचें कि क्या इंस्टेंटेशन पोर्ट मैप वास्तविक मॉड्यूल परिभाषा पोर्टमैप के सभी नामों से मेल खाता है। केवल इस कोड के साथ विवाडो में यही समस्या थी। वर्तनी मेल नहीं खाती और "[सिंथ 8-448] नामित पोर्ट कनेक्शन 'clkkkk' मौजूद नहीं है" के बजाय मुझे "[सिंथ 8-27] स्कोप्ड/पदानुक्रमित प्रकार का नाम समर्थित नहीं है" त्रुटि मिली

जैसा कि इसमें बताया गया है: https://forums.xilinx.com/t5/Synthesis/Parameterizing-the-Bit-Widths-of-fields-in-a-packed-struct-so/td-p/1191678< /ए>

0
ik631 2 फरवरी 2021, 23:46

वर्तमान सिस्टम वेरिलोग बीएनएफ किसी भी डॉटेड "।" की अनुमति नहीं देता है। पैरामीटर प्रारंभ में नाम। लेकिन आप इसके बजाय टाइपिफ़ का उपयोग करके इसे प्राप्त कर सकते हैं

interface MyInterface #(int DATA_W=0, ADDR_W=0) () ;
  typedef  logic [DATA_W-1:0]   data_t;
  ...
endinterface
 
module InnerTest 
  ( input wire Clock
  , input wire Reset
  , MyInterface.SNK Sink
  ) ;
 
  typedef Sink.data_t data_t;
  localparam BIT_WIDTH_SINK_DATA = $bits( data_t );
  ...
endmodule
1
dave_59 7 जिंदा 2021, 08:22