SystemVerilog

لغة SystemVerilog ، التي تم توحيدها تحت مسمى IEEE 1800 من قبل معهد مهندسي الكهرباء والإلكترونيات (IEEE)، هي لغة لوصف الأجهزة والتحقق منها ، وتُستخدم على نطاق واسع في نمذجة وتصميم ومحاكاة واختبار وتنفيذ الأنظمة الإلكترونية في صناعة أشباه الموصلات والتصميم الإلكتروني . وتُعد SystemVerilog امتدادًا للغة Verilog .

تاريخ

بدأ تطوير لغة SystemVerilog بتبرع شركة Co-Design Automation الناشئة بلغة Superlog إلى شركة Accellera عام 2002. [ 1 ] وتعتمد معظم وظائف التحقق على لغة OpenVera التي تبرعت بها شركة Synopsys . في عام 2005، اعتُمدت SystemVerilog كمعيار IEEE 1800-2005. [ 2 ] وفي عام 2009، دُمج هذا المعيار مع معيار Verilog الأساسي (IEEE 1364-2005)، ليُصبح معيار IEEE 1800-2009.

تم تحديث معيار SystemVerilog لاحقًا في عام 2012، [ 3 ] 2017، [ 4 ] ومؤخرًا في ديسمبر 2023. [ 5 ]

ميزات التصميم

يمكن تقسيم مجموعة ميزات SystemVerilog إلى دورين متميزين:

  1. يُعدّ SystemVerilog لتصميم مستوى نقل السجلات (RTL) امتدادًا للغة Verilog-2005 ؛ إذ تتوفر جميع ميزات تلك اللغة في SystemVerilog. ولذلك، تُعتبر Verilog مجموعة فرعية من SystemVerilog.
  2. تستخدم لغة SystemVerilog للتحقق تقنيات برمجة كائنية التوجه واسعة النطاق ، وهي أقرب إلى لغة Java منها إلى Verilog. ولا يمكن عمومًا توليف هذه البنى البرمجية.

يتناول الجزء المتبقي من هذه المقالة ميزات SystemVerilog غير الموجودة في Verilog-2005 .

عمر البيانات

يُحدد SystemVerilog نوعين من دورة حياة البيانات: الثابتة والتلقائية . تُنشأ المتغيرات التلقائية بمجرد دخول البرنامج في نطاقها. أما المتغيرات الثابتة، فتُنشأ عند بدء تنفيذ البرنامج، وتحتفظ بنفس القيمة طوال دورة حياة البرنامج، ما لم تُسند إليها قيمة جديدة أثناء التنفيذ .

أي متغير يُصرَّح عنه داخل مهمة أو دالة دون تحديد نوعه يُعتبر تلقائيًا. لتحديد أن المتغير ثابت، ضع الكلمة المفتاحيةstatic " " في التصريح قبل النوع، على سبيل المثال، " ". تُستخدم الكلمة المفتاحية " " بنفس الطريقة.static int x;automatic

أنواع البيانات الجديدة

تُضيف أنواع المتغيرات المحسّنة إمكانيات جديدة إلى نوع "reg" في لغة Verilog:

المنطق [ 31 : 0 ] متغيري_ ؛

يقتصر استخدام متغيرات السجل (reg) في لغتي Verilog 1995 و2001 على التعليمات السلوكية مثل كود RTL . تُوسّع لغة SystemVerilog نوع السجل (reg) بحيث يمكن التحكم به بواسطة مُشغّل واحد مثل بوابة أو وحدة. تُسمّي SystemVerilog هذا النوع "logic" لتذكير المستخدمين بهذه الإمكانية الإضافية، وأنه ليس سجلًا ماديًا. يُمكن استخدام الاسمين "logic" و"reg" بشكل تبادلي. أما الإشارة التي تحتوي على أكثر من مُشغّل (مثل مُخزن ثلاثي الحالات للإدخال /الإخراج للأغراض العامة )، فيجب تعريفها بنوع شبكة مثل "wire" حتى تتمكن SystemVerilog من تحديد القيمة النهائية.

تعمل المصفوفات المعبأة متعددة الأبعاد على توحيد وتوسيع مفهوم Verilog عن "السجلات" و"الذاكرات":

المنطق [ 1 : 0 ][ 2 : 0 ] my_pack [ 32 ];

كانت لغة Verilog الكلاسيكية تسمح بتعريف بُعد واحد فقط على يسار اسم المتغير. أما SystemVerilog فتسمح بأي عدد من هذه الأبعاد "المُكدسة". يُمثل المتغير من نوع المصفوفة المُكدسة قيمة عددية صحيحة بنسبة 1:1. في المثال أعلاه، my_packيمكن استخدام كل عنصر من عناصر المصفوفة في التعبيرات كعدد صحيح من ستة بتات. تُسمى الأبعاد على يمين الاسم (32 في هذه الحالة) بالأبعاد "غير المُكدسة". وكما هو الحال في Verilog-2001 ، يُسمح بأي عدد من الأبعاد غير المُكدسة.

تسمح أنواع البيانات المُعدّدة (enums) بتسمية الكميات العددية بأسماء ذات دلالة. لا يمكن إسناد متغيرات مُعرّفة على أنها من نوع مُعدّد إلى متغيرات من نوع مُعدّد مختلف دون إجراء تحويل . لا ينطبق هذا على المعاملات، التي كانت أسلوب التنفيذ المُفضّل للكميات المُعدّدة في Verilog-2005.

typedef enum logic [ 2 : 0 ] { RED , GREEN , BLUE , CYAN , MAGENTA , YELLOW } color_t ;color_t my_color = GREEN ; initial $ display ( "اللون هو %s" , my_color . name ());

كما هو موضح أعلاه، يمكن للمصمم تحديد نوع حسابي أساسي ( logic [2:0]في هذه الحالة) يُستخدم لتمثيل قيمة التعداد. ويمكن استخدام القيم الوصفية X وZ هنا، ربما لتمثيل الحالات غير المسموح بها. name()تُعيد الدالة المدمجة سلسلة ASCII للقيمة المُعدّدة الحالية، وهو أمر مفيد في التحقق والاختبار.

أنواع الأعداد الصحيحة الجديدة : يُعرّف SystemVerilog كلاً من byte`x` و` shortinty` intو` longintz` كأنواع أعداد صحيحة مُوقّعة ثنائية الحالة، بأطوال بتات 8 و16 و32 و64 بت على التوالي. bitيُعدّ النوع `x` نوعًا ثنائي الحالة ذو عرض متغير، ويعمل بشكل مشابه لـ `x` logic. تفتقر أنواع الحالة الثنائية إلى القيم الوصفية X و Z الموجودة في Verilog الكلاسيكي؛ وقد يؤدي استخدام هذه الأنواع إلى محاكاة أسرع.

تعمل البنى والاتحاداتبشكل مشابه لطريقة عملها في لغة C. تشمل تحسينات SystemVerilog السمة packed والسمة tagged . تتيح السمة packed تتبعًا أثناء التشغيل لأي عضو (أو أعضاء) من الاتحاد قيد الاستخدام حاليًا. أما السمةtagged فتؤدي إلى ربط البنية أو الاتحاد بشكل مباشر (واحد لواحد) بمصفوفة بتات مضغوطة. تشغل محتوياتأنواع البيانات كتلة متصلة من الذاكرة دون فجوات، على غرار حقول البتات في لغتي C و C++.taggedpackedstruct

typedef struct packed { bit [ 10 : 0 ] expo ; bit sign ; bit [ 51 : 0 ] mant ; } FP ;FP zero = 64'b0 ;

كما هو موضح في هذا المثال، يدعم SystemVerilog أيضًا تعريفات الأنواع (typedefs) ، كما هو الحال في لغتي C و C++.

الكتل الإجرائية

يُقدّم SystemVerilog ثلاث وحدات إجرائية جديدة مُصممة لنمذجة الأجهزة : always_comb(لنمذجة الدوائر المنطقية التوافقيةalways_ffو( للقلابات )، و always_latch( للمثبتات ). بينما كان Verilog يستخدم وحدة واحدة عامة الأغراض alwaysلنمذجة أنواع مختلفة من هياكل الأجهزة، فإن كل وحدة من وحدات SystemVerilog الجديدة مُصممة لنمذجة نوع مُحدد من الأجهزة، وذلك بفرض قيود دلالية لضمان تطابق الأجهزة الموصوفة بواسطة هذه الوحدات مع الاستخدام المقصود للنموذج. يُمكن لمُترجم لغة وصف الأجهزة أو برنامج التحقق اتخاذ خطوات إضافية لضمان حدوث السلوك المقصود فقط.

تقوم وحدة always_combالمعالجة المركزية بنمذجة المنطق التوافقي . ويستنتج المحاكي قائمة الحساسية لتكون جميع المتغيرات من العبارات الواردة فيها:

always_comb begin tmp = b * b - 5'h4 * a * c ; no_root = ( tmp < 0 ); end

تقوم هذه always_latchالكتلة بنمذجة المزالج الحساسة للمستوى . ومرة ​​أخرى، يتم استنتاج قائمة الحساسية من الكود:

always_latch if ( en ) q <= d ;

تقوم وحدة always_ffالبناء بنمذجة المنطق المتزامن (وخاصة المنطق التسلسلي الحساس للحواف ):

always_ff @( posedge clk ) count <= count + 4'd1 ;

تستطيع أدوات أتمتة تصميم الإلكترونيات (EDA) التحقق من الغرض من التصميم من خلال التأكد من أن نموذج الأجهزة لا يخالف أيًا من قواعد استخدام الكتل البرمجية. على سبيل المثال، تقيّد الكتل البرمجية الجديدة عملية إسناد القيمة إلى متغير بالسماح بمصدر واحد فقط، بينما كانت alwaysكتل Verilog تسمح بالإسناد من مصادر إجرائية متعددة.

عند إجراء العمليات الحسابية باستخدام القيم العددية الثابتة في كود RTL، من المهم تحديد عرض البتات للثوابت بشكل صريح لتجنب الاقتطاع غير المقصود، أو مخالفات التدقيق، أو مشاكل التوليف. يُعد هذا الأمر بالغ الأهمية في وحدات المنطق التوافقي والتتابعي. عندما تفتقر المعاملات إلى مواصفات بتات صريحة، قد تستنتج برامج المحاكاة وأدوات التوليف العروض بناءً على السياق أو تستخدم أحجامًا افتراضية خاصة بالتنفيذ، مما قد يتسبب في فقدان البيانات أو سلوك غير متوقع أثناء المحاكاة أو التنفيذ على مستوى الأجهزة.

واجهات

في التصاميم الصغيرة، يصف منفذ Verilog بإيجاز اتصال الوحدة بالبيئة المحيطة. لكن الكتل الرئيسية ضمن تسلسل هرمي كبير للتصميم عادةً ما تحتوي على آلاف المنافذ. يُقدّم SystemVerilog مفهوم الواجهات لتقليل تكرار تعريفات أسماء المنافذ بين الوحدات المتصلة، بالإضافة إلى تجميع الإشارات ذات الصلة وتجريدها في حزمة يُعرّفها المستخدم. ومن المفاهيم الإضافية مفهوم modport ، الذي يُبيّن اتجاه الاتصالات المنطقية.

مثال:

واجهة intf ؛ منطق a ؛ منطق b ؛ منفذ إدخال modport ( مدخل a ، مخرج b )؛ منفذ إخراج modport ( مدخل b ، مخرج a نهاية الواجهةوحدة أعلى ؛ واجهة i ( u_a m1 ( .i1 ( i.in ))؛ u_b m2 ( .i2 ( i.out ) ) ؛ نهاية الوحدةوحدة u_a ( واجهة . in i1 نهاية الوحدةوحدة u_b ( واجهة.خارج i2 ) ؛ نهاية الوحدة

ميزات التحقق

لا يمكن عادةً توليف ميزات التحقق التالية، أي لا يمكن تنفيذها في الأجهزة باستخدام لغة وصف الأجهزة (HDL). وبدلاً من ذلك، فهي تساعد في إنشاء منصات اختبار قابلة للتوسيع ومرنة .

أنواع البيانات الجديدة

يمثل نوع البيانات سلسلةstring نصية متغيرة الطول . على سبيل المثال:

string s1 = "Hello" ; string s2 = "world" ; string p = ".?! ; string s3 = { s1 , ", " , s2 , p [ 2 ]}; // دمج السلاسل النصية $ display ( "[%d] %s" , s3 . len (), s3 ); // ستطبع المحاكاة: "[13] Hello, world!"

بالإضافة إلى المصفوفة الثابتة المستخدمة في التصميم، يوفر SystemVerilog المصفوفات الديناميكية والمصفوفات الترابطية وقوائم الانتظار :

int cmdline_elements ; // عدد عناصر المصفوفة الديناميكية int da []; // مصفوفة ديناميكية int ai [ int ]; // مصفوفة ترابطية، مفهرسة بواسطة int int as [ string ]; // مصفوفة ترابطية، مفهرسة بواسطة string int qa [$]; // قائمة انتظار، مفهرسة كمصفوفة، أو بواسطة دوال مدمجةinitial begin cmdline_elements = 16 ; da = new [ cmdline_elements ]; // تخصيص مصفوفة تحتوي على 16 عنصرًا end

تعمل المصفوفة الديناميكية بشكل مشابه للمصفوفة غير المعبأة، ولكنها توفر ميزة التخصيص الديناميكي في وقت التشغيل (كما هو موضح أعلاه). في حين أن حجم المصفوفة المعبأة يجب أن يكون معروفًا في وقت الترجمة (من ثابت أو تعبير عن الثوابت)، يمكن تهيئة حجم المصفوفة الديناميكية من متغير وقت التشغيل آخر، مما يسمح بتحديد حجم المصفوفة وتغيير حجمها بشكل تعسفي حسب الحاجة.

يمكن اعتبار المصفوفة الترابطية بمثابة شجرة بحث ثنائية بمفتاح ونوع بيانات يحددهما المستخدم . يشير المفتاح إلى ترتيب معين ؛ إذ يمكن قراءة عناصر المصفوفة الترابطية بترتيب معجمي. أخيرًا، توفر قائمة الانتظار معظم وظائف نوع قائمة الانتظار المزدوجة (deque) في مكتبة STL للغة C++ : حيث يمكن إضافة العناصر وإزالتها من أي من طرفيها بكفاءة. تتيح هذه العناصر الأساسية إنشاء هياكل بيانات معقدة ضرورية لتقييم تصميم كبير.

الصفوف الدراسية

يوفر SystemVerilog نموذج برمجة كائنية التوجه .

في لغة SystemVerilog، تدعم الفئات نموذج الوراثة الفردية ، ولكنها قد تُنفذ وظائف مشابهة للوراثة المتعددة باستخدام ما يُسمى "فئات الواجهة" (وهي مُطابقة في المفهوم لميزة interfaceJava). يُمكن تحديد خصائص الفئات حسب النوع ، مما يُوفر الوظيفة الأساسية لقوالب C++ . مع ذلك، لا يتم دعم تخصيص القوالب وقوالب الدوال .

تتشابه خصائص تعدد الأشكال في لغة SystemVerilog مع تلك الموجودة في لغة C++: إذ يمكن للمبرمج كتابة virtualدالة معينة بحيث تتحكم بها فئة مشتقة. راجع الدالة الافتراضية لمزيد من المعلومات.

يتم تحقيق التغليف وإخفاء البياناتlocal باستخدام الكلمتين المفتاحيتين `public` و` protecteddisplay`، واللتين يجب تطبيقهما على أي عنصر يُراد إخفاؤه. بشكل افتراضي، تكون جميع خصائص الفئة عامة .

يتم إنشاء نسخ الفئات ديناميكيًا باستخدام newالكلمة المفتاحية. ويمكن تعريف مُنشئ يُشار إليه بـ . يحتوي SystemVerilog على خاصية جمع البيانات المهملة تلقائيًا ، لذا لا توجد آلية لغوية لتدمير النسخ التي تم إنشاؤها بواسطة عامل التشغيل new بشكل صريح .function new

مثال:

فئة افتراضية باسم Memory ؛ دالة افتراضية bit [ 31 : 0 ] read ( bit [ 31 : 0 ] addr نهاية الدالة؛ دالة افتراضية void write ( bit [ 31 : 0 ] addr , bit [ 31 : 0 ] data )؛ نهاية الدالة؛ نهاية الفئةclass SRAM #( parameter AWIDTH = 10 ) extends Memory ; bit [ 31 : 0 ] mem [ 1 << AWIDTH ];دالة افتراضية bit [ 31 : 0 ] read ( bit [ 31 : 0 ] addr ); تُرجع mem [ addr ]; نهاية الدالةدالة افتراضية void write ( bit [ 31 : 0 ] addr , bit [ 31 : 0 ] data ); mem [ addr ] = data ; endfunction endclass

توليد عشوائي مقيد

يمكن إسناد قيم عشوائية إلى الكميات الصحيحة، سواءً كانت مُعرَّفة ضمن تعريف فئة أو كمتغيرات مستقلة في نطاق معجمي معين، وذلك بناءً على مجموعة من القيود. تُعد هذه الميزة مفيدة لإنشاء سيناريوهات عشوائية للتحقق .

في تعريفات الفئات، تشير المُعدِّلات `and` randو`and` randcإلى المتغيرات التي ستخضع لعملية التوزيع العشوائي. randcتُحدد `and` التوزيع العشوائي القائم على التبديل ، حيث يأخذ المتغير جميع القيم الممكنة مرة واحدة قبل تكرار أي قيمة. أما المتغيرات التي لا تحتوي على مُعدِّلات، فلا تخضع للتوزيع العشوائي.

class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit [ 31 : 0 ] fcs_corrupt ;constraint basic { payload . size inside {[ 46 : 1500 ]}; }constraint good_fr { fcs_corrupt == 0 ; } endclass

في هذا المثال، fcsلا يتم توليد الحقل عشوائيًا؛ عمليًا، يُحسب باستخدام مولد CRC، fcs_corruptويُستخدم هذا الحقل لإتلاف الإطار وحقن أخطاء FCS. ينطبق القيدان الموضحان على إطارات إيثرنت المتوافقة . يمكن تفعيل القيود بشكل انتقائي؛ هذه الميزة مطلوبة في المثال أعلاه لتوليد إطارات تالفة. قد تكون القيود معقدة بشكل تعسفي، وتشمل علاقات متبادلة بين المتغيرات، وتداعيات، وتكرارًا. يُطلب من محلل قيود SystemVerilog إيجاد حل إن وُجد، لكنه لا يضمن الوقت اللازم لذلك، لأن هذه المسألة تُصنف عمومًا ضمن مسائل NP-hard ( قابلية الإرضاء المنطقي ).

أساليب التوزيع العشوائي

تحتوي كل فئة في لغة SystemVerilog على ثلاث دوال مُعرَّفة مسبقًا للتوزيع العشوائي: pre_randomize و randomize و post_randomize. يستدعي المستخدم الدالة randomize لتوزيع قيم متغيرات الفئة عشوائيًا. تستدعي الدالة randomize الدالة pre_randomize قبل عملية التوزيع العشوائي، بينما تستدعي الدالة randomize الدالة post_randomize بعد عملية التوزيع العشوائي.

class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit corrupted_frame ;constraint basic { payload.size inside {[ 46 : 1500 ] }; } function void post_randomize () this.calculate_fcs (); // تحديث حقل fcs وفقًا للإطار العشوائي if (rupted_frame ) // إذا كان يجب إتلاف هذا الإطار this.corrupt_fcs ( ); // إتلاف fcs endfunction endclass

التحكم في القيود

تُستخدم الدالتان `constraint_mode()` و`random_mode()` للتحكم في عملية التوزيع العشوائي. تُستخدم الدالة `constraint_mode()` لتفعيل أو تعطيل قيد معين، بينما تُستخدم الدالة `random_mode()` لتفعيل أو تعطيل التوزيع العشوائي لمتغير معين. يصف الكود التالي إطار بيانات إيثرنت ويختبره إجرائيًا :

class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit corrupted_frame ;constraint basic { payload.size inside { [ 46 : 1500 ]} ; } constraint one_src_cst { src == 48'h1f00 }constraint dist_to_fcs { fcs dist { 0 :/ 30 ,[ 1 : 2500 ] :/ 50 }; // 30 و 50 هما الوزنان (30/80 أو 50/80، في هذا المثال) }endclass . . . eth_frame my_frame ;my_frame.one_src_cst.constraint_mode ( 0 ); // لن يتم أخذ القيد one_src_cst في الاعتبار . my_frame.f_type.random_mode ( 0 ) ; // لن يتم توليد قيمة عشوائية للمتغير f_type لهذه النسخة من الإطار . my_frame.randomize ( ) ;

التأكيدات

تُعدّ التأكيدات مفيدةً للتحقق من خصائص التصميم التي تظهر بعد بلوغ حالة أو شرط مُحدد. تمتلك لغة SystemVerilog لغةً خاصةً بها لتحديد التأكيدات، على غرار لغة تحديد الخصائص . تُعرف مجموعة بنيات لغة SystemVerilog التي تُستخدم للتأكيدات باسم تأكيدات SystemVerilog أو SVA. [ 6 ]

تُبنى تأكيدات SystemVerilog من التسلسلات والخصائص . الخصائص هي مجموعة شاملة من التسلسلات؛ يمكن استخدام أي تسلسل كما لو كان خاصية، على الرغم من أن هذا ليس مفيدًا عادةً .

تتكون المتتاليات من تعابير منطقية معززة بعوامل زمنية . أبسط عامل زمني هو ##العامل الذي يقوم بعملية الربط:

التسلسل S1 ؛ @( حافة صاعدة clk ) req ## 1 gnt ؛ نهاية التسلسل

تتطابق هذه السلسلة إذا gntارتفعت الإشارة بعد دورة ساعة واحدة من reqارتفاعها. لاحظ أن جميع عمليات السلسلة متزامنة مع الساعة.

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

يعمل التأكيد من خلال محاولة تقييم تسلسل أو خاصية بشكل مستمر. يفشل التأكيد إذا فشلت الخاصية. سيفشل التسلسل أعلاه كلما reqكانت قيمة الخاصية منخفضة. للتعبير بدقة عن الشرط الذي gntيلي reqالخاصية، يلزم ما يلي:

خاصية req_gnt ؛ @( posedge clk ) req |=> gnt ؛ نهاية الخاصيةassert_req_gnt: assert property ( req_gnt ) else $ error ( "req not following by gnt." );

يوضح هذا المثال عامل الاستلزام|=> . يُسمى الشرط الموجود على يسار الاستلزام بالشرط السابق ، والشرط الموجود على يمينه بالشرط التالي . يبدأ تقييم الاستلزام بمحاولات متكررة لتقييم الشرط السابق. عندما ينجح الشرط السابق ، تُجرى محاولة لتقييم الشرط التالي، ويعتمد نجاح التأكيد على نجاح الشرط التالي. في هذا المثال، لن تُجرى محاولة لتقييم الشرط التالي حتى reqيصبح الشرط السابق عاليًا، وبعد ذلك ستفشل الخاصية إذا gntلم يكن الشرط السابق عاليًا في الدورة التالية.

بالإضافة إلى التأكيدات، يدعم SystemVerilog الافتراضات وتغطية الخصائص. يحدد الافتراض شرطًا يجب على أداة إثبات المنطق الرسمي افتراض صحته . بينما يحدد التأكيد خاصية يجب إثبات صحتها. في المحاكاة ، يتم التحقق من كل من التأكيدات والافتراضات باستخدام محفزات الاختبار. تتيح تغطية الخصائص لمهندس التحقق التأكد من أن التأكيدات تراقب التصميم بدقة.

التغطية

يشير مصطلح "التغطية" في لغات التحقق من الأجهزة إلى جمع الإحصائيات بناءً على أحداث أخذ العينات داخل المحاكاة. تُستخدم التغطية لتحديد متى يكون الجهاز قيد الاختبار قد تعرض لمجموعة كافية من المحفزات، مما يضمن مستوى عالٍ من الثقة في أدائه الصحيح. تجدر الإشارة إلى أن هذا يختلف عن تغطية الكود ، التي تُفعّل كود التصميم لضمان تنفيذ جميع أسطر الكود فيه. تضمن التغطية الوظيفية استكشاف جميعالحالات الحدية والزاوية المطلوبة فينطاق التصميم .

تُنشئ مجموعة تغطية SystemVerilog قاعدة بيانات من "الفئات" التي تخزن رسمًا بيانيًا لقيم متغير مرتبط. كما يمكن تعريف التغطية المتقاطعة، والتي تُنشئ رسمًا بيانيًا يُمثل حاصل الضرب الديكارتي لمتغيرات متعددة.

يتحكم حدث أخذ العينات في وقت أخذ العينة. يمكن أن يكون حدث أخذ العينات حدثًا في لغة Verilog، أو دخول أو خروج كتلة من التعليمات البرمجية، أو استدعاءً لطريقة sampleمجموعة التغطية. يجب توخي الحذر لضمان أخذ عينات البيانات فقط عندما تكون ذات مغزى.

على سبيل المثال:

class eth_frame ; // التعريفات كما هو موضح أعلاه covergroup cov ; coverpoint dest { bins bcast [ 1 ] = { 48'hFFFFFFFFFFFF }; bins ucast [ 1 ] = default ; } coverpoint f_type { bins length [ 16 ] = { [ 0 : 1535 ] }; bins typed [ 16 ] = { [ 1536 : 32767 ] }; bins other [ 1 ] = default ; } psize : coverpoint payload.size { bins size [] = { 46 , [ 47:63 ] , 64 , [ 65 : 511 ], [ 512 : 1023 ] , [ 1024 : 1499 ], 1500 } ; }sz_x_t: cross f_type , psize ; endgroup endclass

في هذا المثال، يهتم مهندس التحقق بتوزيع إطارات البث والإطارات أحادية البث، وحقل الحجم/نوع_الإطار، وحجم الحمولة. وتعكس نطاقات تغطية حجم الحمولة الحالات الشاذة المهمة، بما في ذلك الإطارات ذات الحجم الأدنى والأقصى.

التزامن

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

تحسينات عامة على لغة فيريلوج الكلاسيكية

بالإضافة إلى الميزات الجديدة المذكورة أعلاه، يُحسّن SystemVerilog سهولة استخدام ميزات لغة Verilog الحالية. وفيما يلي بعض هذه التحسينات:

إلى جانب ذلك، يسمح SystemVerilog بواجهة ملائمة للغات الأجنبية (مثل C/C++)، من خلال SystemVerilog DPI (واجهة البرمجة المباشرة).

برامج التحقق والتوليف

في مجال التحقق من التصميم، يُستخدم SystemVerilog على نطاق واسع في صناعة تصميم الرقائق. وقد أدمجت أكبر ثلاث شركات مُصنّعة لبرامج تصميم الدوائر الإلكترونية ( Cadence Design Systems و Mentor Graphics و Synopsys ) لغة SystemVerilog في برامج محاكاة لغات وصف الأجهزة (HDL) الخاصة بها . ورغم أنه لا يوجد برنامج محاكاة يدعم دليل SystemVerilog المرجعي بالكامل حتى الآن، مما يجعل التوافق بين منصات الاختبار تحديًا، إلا أن الجهود جارية لتعزيز التوافق بين مختلف الشركات المُصنّعة. في عام 2008، أصدرت شركتا Cadence وMentor منهجية التحقق المفتوحة، وهي مكتبة فئات مفتوحة المصدر وإطار عمل لتسهيل تطوير منصات اختبار قابلة لإعادة الاستخدام ووحدات IP جاهزة للتحقق. واستجابت Synopsys، التي كانت أول من نشر مكتبة فئات SystemVerilog (VMM)، بفتح مكتبتها الخاصة VMM للجمهور. وقد أعلن العديد من مزودي خدمات الطرف الثالث عن وحدات IP للتحقق باستخدام SystemVerilog أو أصدروها بالفعل.

في مجال توليف التصميم (تحويل وصف تصميم الأجهزة إلى قائمة بوابات )، كان تبني لغة SystemVerilog بطيئًا. تستخدم العديد من فرق التصميم مسارات تصميم تتضمن أدوات متعددة من موردين مختلفين. لا تستطيع معظم فرق التصميم الانتقال إلى تصميم RTL باستخدام SystemVerilog إلا بعد أن تدعم مجموعة أدوات الواجهة الأمامية بالكامل ( أدوات التحقق من الأخطاء ، والتحقق الرسمي ، ومولدات هياكل الاختبار الآلية ) مجموعة فرعية مشتركة من اللغة.

انظر أيضاً

مراجع

مرجع معيار IEEE
دروس تعليمية
تطوير المعايير
امتدادات اللغة
  • Verilog AUTOs – نظام تعليقات تعريفية مفتوح المصدر لتبسيط صيانة كود Verilog
أدوات عبر الإنترنت
  • بيئة تطوير EDA Playground – تشغيل SystemVerilog من متصفح الويب (بيئة تطوير متكاملة مجانية عبر الإنترنت)
  • sverule – أداة SystemVerilog BNF Navigator (متوافقة مع معيار IEEE 1800-2012)
أدوات أخرى
  • SVUnit – إطار عمل لاختبار الوحدات للمطورين الذين يكتبون التعليمات البرمجية بلغة SystemVerilog. تحقق من وحدات SystemVerilog والفئات والواجهات بشكل منفصل.
  • sv2v - محول مفتوح المصدر من SystemVerilog إلى Verilog