הפיכת 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 שלך נמנע משימוש בתווים כלליים ויש לו מעט פקודות 'קבע', הקוד שלך יפעל מהר יותר.

פתרונות אפשריים לבעיות תצורת UVM הם:

  • השתמש במשתנה גלובלי במקום זאת
  • השתמש בתצורת UVM עם סט אחד()
  • השתמש בתצורת UVM עם כמה set()
  • השתמש בעץ תצורה
  • נסה משהו אחר

הגישה האחרונה של לנסות משהו אחר היא הפתרון החדש, והיא ממשיכה להשתמש ב-set() ו-get() API, ואז מפשטת על ידי הסרת הפרמטריזציה של התצורות, מסירה קדימות ומסירת את השינוי באלגוריתם החיפוש. התוצאות של גישה חדשה זו הן מהירויות מהירות.

פריט התצורה החדש שלך מוגדר במחלקה הנגזרת מ-'config_item', והדוגמה למטה מציגה את 'int value' כמאפיין המוגדר. למטרות ניפוי באגים אתה מוסיף את פונקציית הדפס יפה.

class my_special_config_item מרחיב את config_item; function new(שם מחרוזת = "my_special_config_item"); super.new(שם); 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__)

ניתן להדפיס את תור העזר במהלך ניפוי באגים כדי לראות מי קרא ל-set() ו-get().

כדי לתמוך בתווים כלליים נדרש הוספת מנגנון חיפוש באמצעות קונטיינרים. שקול את שם המופע 'top.abcd*_0'.

עץ מיכל מינימום
עץ מיכל

חלק התווים הכלליים של שם המופע מטופל באמצעות עץ המכיל, במקום המערך האסוציאטיבי.

<br> סיכום

שיתוף נתונים בין המודול/מופע לעולם מבוסס הכיתה בספסל בדיקה של UVM יכול להיעשות באמצעות מסד הנתונים של תצורת UVM, רק שימו לב להאטות המהירות. אם המתודולוגיה שלך משתמשת בהרבה תצורות, שקול להשתמש בגישה החדשה שהוצגה הכוללת חבילה המשתמשת בכ-300 שורות קוד במקום 2,600 שורות הקוד בקובץ מסד הנתונים של תצורת UVM.

קרא את המאמר המלא בן 20 העמודים, הימנעות משיגעון תצורה בדרך הקלה בסימנס EDA.

בלוגים קשורים

שתף את הפוסט הזה באמצעות:

בול זמן:

עוד מ Semiwiki