سریعتر کردن UVM از طریق یک سیستم پیکربندی جدید - Semiwiki

سریعتر کردن UVM از طریق یک سیستم پیکربندی جدید - Semiwiki

گره منبع: 3036575

روش تأیید جهانی (UVM) یک روش محبوب برای کمک به تأیید طرح های SystemVerilog است و شامل یک سیستم پیکربندی که متاسفانه برخی از مشکلات سرعت و استفاده دارد. ریچ ادلمن از زیمنس EDA مقاله 20 صفحه ای مفصلی در مورد چگونگی جلوگیری از این مسائل نوشت و من آن را مرور کردم تا نکات برجسته را برای شما خلاصه کنم. مهندسان تأیید از یک پایگاه داده پیکربندی UVM برای تنظیم مقادیر و سپس برای دریافت مقادیر بعداً در آزمایش UVM خود استفاده می کنند. یک مثال از تنظیم و دریافت مقدار "T" این است:

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

اتصال تست UVM به دستگاه تحت آزمایش از پایگاه داده پیکربندی برای عبور رابط های مجازی استفاده می کند. سه مشکل در استفاده از پیکربندی UVM وجود دارد:

  • کد بزرگ، حدود 2,600 خط کد
  • به تطابق دقیق نوع نیاز دارد، بنابراین 'int' و 'bit' یکسان نیستند
  • کد آهسته

مورد کد آهسته را در نظر بگیرید، زیرا با هزاران تماس برای set() استفاده از نام‌های دارای حروف عام می‌تواند تا 30 دقیقه طول بکشد تا فاز «set» و «get» کامل شود.

زمان سپری شده دقیقه

Rich راه حل جدیدی برای پیکربندی های UVM پیشنهاد می کند که سرعت بسیار بالاتری دارد و در مقایسه تنها چند ثانیه طول می کشد.

حداقل راه حل جدید

اگر کد UVM شما از استفاده از حروف عام اجتناب می کند و دستورات «set» کمی دارد، کد شما سریعتر اجرا می شود.

راه حل های ممکن برای مشکلات پیکربندی UVM عبارتند از:

  • به جای آن از یک متغیر سراسری استفاده کنید
  • استفاده از پیکربندی UVM با یک مجموعه ()
  • استفاده از پیکربندی UVM با چند set()
  • از درخت پیکربندی استفاده کنید
  • چیز دیگری را امتحان کنید

آخرین رویکرد امتحان کردن چیزی متفاوت، راه‌حل جدید است، و به استفاده از set() و get() API ادامه می‌دهد، سپس با حذف پارامترسازی پیکربندی‌ها، اولویت را حذف می‌کند و تغییر الگوریتم جستجو را حذف می‌کند. نتایج این رویکرد جدید سرعت های سریع است.

آیتم پیکربندی جدید شما در کلاس مشتق شده از 'config_item' تعریف شده است، و مثال زیر 'int value' را به عنوان ویژگی در حال تنظیم نشان می دهد. برای اهداف اشکال‌زدایی، عملکرد چاپ زیبا را اضافه می‌کنید.

کلاس my_special_config_item config_item را گسترش می دهد. تابع new(نام رشته = "مجموعه_special_config_item"); super.new(name); endfunction مقدار int; رشته تابع مجازی convert2string(); return $sformatf("%s - value=%0d <%s>", get_name(), value, super.convert2string()); endfunction endclass

'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__)

صف Accessor را می توان در حین اشکال زدایی چاپ کرد تا ببینیم چه کسی set() و get() را فراخوانی کرده است.

برای پشتیبانی از حروف عام نیاز به افزودن مکانیزم جستجو با استفاده از کانتینرها است. نام نمونه 'top.abcd*_0' را در نظر بگیرید.

حداقل درخت ظرف
درخت ظرف

قسمت عام نام نمونه با استفاده از درخت کانتینر به جای آرایه انجمنی مدیریت می شود.

خلاصه

به اشتراک گذاری داده ها بین ماژول/نمونه و دنیای مبتنی بر کلاس در یک تست UVM را می توان با استفاده از پایگاه داده پیکربندی UVM انجام داد، فقط از کاهش سرعت آگاه باشید. اگر متدولوژی شما از پیکربندی های زیادی استفاده می کند، پس از رویکرد جدید معرفی شده استفاده کنید که دارای بسته ای با استفاده از حدود 300 خط کد به جای 2,600 خط کد در فایل پایگاه داده پیکربندی UVM است.

مقاله کامل 20 صفحه ای را بخوانید، اجتناب از جنون پیکربندی راه آسان در زیمنس EDA.

وبلاگهای مرتبط

اشتراک گذاری این پست از طریق:

تمبر زمان:

بیشتر از نیمه ویکی