جعل UVM أسرع من خلال نظام تكوين جديد - Semiwiki

جعل UVM أسرع من خلال نظام التكوين الجديد – Semiwiki

عقدة المصدر: 3036575

تعد منهجية التحقق العالمية (UVM) طريقة شائعة للمساعدة في التحقق من تصميمات SystemVerilog، وتتضمن نظام التكوين الذي للأسف لديه بعض مشاكل السرعة والاستخدام. كتب ريتش إيدلمان من Siemens EDA ورقة مفصلة مكونة من 20 صفحة حول موضوع كيفية تجنب هذه المشكلات، وقد قمت بمراجعتها لتلخيص أبرز النقاط لك. يستخدم مهندسو التحقق قاعدة بيانات تكوين UVM لتعيين القيم، ثم للحصول على القيم لاحقًا في اختبار UVM الخاص بهم. أحد الأمثلة على تعيين القيمة "T" والحصول عليها هو:

uvm_config#(T)::set(scope, example_path_name, field_name, value); uvm_config#(T)::get(scope, example_path_name, field_name, value);

يستخدم توصيل منصة اختبار UVM بالجهاز قيد الاختبار قاعدة بيانات التكوين لتمرير الواجهات الافتراضية. هناك ثلاث مشاكل في استخدام تكوين UVM:

  • كود كبير، حوالي 2,600 سطر من الكود
  • يتطلب مطابقة تامة للنوع، لذا فإن "int" و"bit" ليسا متماثلين
  • رمز بطيء

خذ بعين الاعتبار حالة التعليمات البرمجية البطيئة، لأنه مع آلاف الاستدعاءات لـ set()، فإن استخدام الأسماء ذات أحرف البدل يمكن أن يستغرق ما يصل إلى 30 دقيقة لإكمال مرحلة "set" و"get".

الوقت المنقضي دقيقة

يقترح ريتش حلاً جديدًا لتكوينات UVM يتميز بسرعات أعلى بكثير، ولا يستغرق سوى بضع ثوانٍ بالمقارنة.

حل جديد دقيقة

إذا كان رمز UVM الخاص بك يتجنب استخدام أحرف البدل ويحتوي على عدد قليل من أوامر "الضبط"، فسيتم تشغيل التعليمات البرمجية الخاصة بك بشكل أسرع.

الحلول الممكنة لمشكلات تكوين UVM هي:

  • استخدم متغيرًا عموميًا بدلاً من ذلك
  • استخدم تكوين UVM مع مجموعة واحدة ()
  • استخدم تكوين UVM مع مجموعة قليلة ()
  • استخدم شجرة التكوين
  • جرب شيئًا مختلفًا

هذا النهج الأخير لتجربة شيء مختلف هو الحل الجديد، ويستمر في استخدام set() وget() API، ثم يتم تبسيطه عن طريق إزالة معلمات التكوينات، وإزالة الأسبقية، وإزالة تغيير خوارزمية البحث. نتائج هذا النهج الجديد هي سرعات عالية.

تم تعريف عنصر التكوين الجديد الخاص بك في الفئة المشتقة من "config_item"، ويوضح المثال أدناه "قيمة int" باعتبارها الخاصية التي يتم تعيينها. لأغراض تصحيح الأخطاء، يمكنك إضافة وظيفة الطباعة الجميلة.

يمتد الفصل my_special_config_item إلى config_item؛ وظيفة جديدة (اسم السلسلة = "my_special_config_item")؛ super.new(name); القيمة النهائية للوظيفة النهائية؛ سلسلة الوظيفة الافتراضية Convert2string(); return $sformatf("%s - value=%0d <%s>"، get_name(), value, super.convert2string()); وظيفة نهاية الطبقة النهائية

يحتوي "config_item" على سمة اسم، ويتم البحث عن هذا الاسم، بالإضافة إلى اسم المثيل. يحتوي كائن التكوين أيضًا على وظيفة get_name() لإرجاع الاسم. للعثور على أي "instance_name.field_name"، تستخدم قاعدة بيانات التكوين مصفوفة ترابطية لسرعات البحث والإنشاء السريعة.
لإمكانية التتبع، يمكنك معرفة من قام بتعيين أو من اتصل بـ get، لأن اسم الملف ورقم السطر عبارة عن حقول في استدعاءات الدالة set() وget().

set(null, "top.ab*"، "SPEED"، my_speed_config، `__FILE__، `__LINE__) get(null, "top.abcdmonitor1"، "SPEED"، speedconfig، `__FILE__، `__LINE__)

يمكن طباعة قائمة انتظار الوصول أثناء التصحيح لمعرفة من اتصل بـ set() و get().

لدعم أحرف البدل المطلوبة إضافة آلية بحث باستخدام الحاويات. خذ بعين الاعتبار اسم المثيل "top.abcd*_0".

شجرة الحاوية دقيقة
شجرة الحاوية

تتم معالجة جزء البدل من اسم المثيل باستخدام شجرة الحاوية، بدلاً من المصفوفة النقابية.

نبذة عامة

يمكن إجراء مشاركة البيانات بين الوحدة النمطية/المثيل والعالم القائم على الفئة في منصة اختبار UVM باستخدام قاعدة بيانات تكوين UVM، فقط كن على دراية بتباطؤ السرعة. إذا كانت منهجيتك تستخدم الكثير من التكوينات، ففكر في استخدام النهج الجديد الذي تم تقديمه والذي يحتوي على حزمة تستخدم حوالي 300 سطر من التعليمات البرمجية بدلاً من 2,600 سطر من التعليمات البرمجية في ملف قاعدة بيانات تكوين UVM.

إقرأ الورقة كاملة مكونة من 20 صفحة، تجنب جنون التكوين بالطريقة السهلة في شركة سيمنز EDA.

مدونات ذات الصلة

شارك هذا المنشور عبر:

الطابع الزمني:

اكثر من سيميويكي