SystemVerilog DPI
واجهة برمجة التطبيقات المباشرة ( DPI ) في SystemVerilog هي واجهة تُستخدم لربط SystemVerilog بلغات برمجة أخرى، مثل C و C++ و SystemC وغيرها. تتكون واجهة DPI من طبقتين: طبقة SystemVerilog وطبقة اللغة الأجنبية، وهما معزولتان عن بعضهما.
توضيح
تتيح واجهة البرمجة المباشرة ( DPI ) استدعاء الدوال مباشرةً بين لغة SystemVerilog ولغة أجنبية. يمكن استدعاء الدوال المُنفذة باللغة الأجنبية من SystemVerilog، وتُسمى هذه الدوال دوال الاستيراد . وبالمثل، يمكن استدعاء الدوال المُنفذة بلغة SystemVerilog من لغة أجنبية ( C/C++ أو System C )، وتُسمى هذه الدوال دوال التصدير . تسمح واجهات البرمجة المباشرة بنقل البيانات بين مجالين عبر وسائط الدوال وقيم الإرجاع.
استيراد وتصدير الوظائف
1) استيراد الدوال: يمكن استخدام دالة مكتوبة بلغة أجنبية في لغة SystemVerilog عن طريق استيرادها. وتُسمى الدالة المكتوبة بلغة أجنبية والمستخدمة في SystemVerilog بالدالة المستوردة.
خصائص الوظيفة والمهمة المستوردة
- يجب أن تُكمل الدالة المستوردة تنفيذها فورًا ولا تستهلك أي وقت محاكاة. أما المهمة المستوردة فقد تستهلك وقتًا.
- يمكن أن تحتوي الدالة المستوردة على وسائط إدخال وإخراج وinout.
- لا يجوز تعديل وسائط الإدخال الرسمية. وإذا تم تغيير هذه الوسائط داخل دالة، فلا يجوز أن تكون التغييرات مرئية خارج الدالة.
- لا يجوز للدالة المستوردة افتراض أي قيم ابتدائية لوسائط الإخراج الرسمية. القيمة الابتدائية لوسائط الإخراج غير محددة وتعتمد على التنفيذ.
- يمكن للدالة المستوردة الوصول إلى القيمة الأولية لوسيط الإدخال/الإخراج الرسمي. يجب أن تكون التغييرات التي تُجريها الدالة المستوردة على وسيط الإدخال/الإخراج الرسمي مرئية خارج الدالة.
- لا يجوز للدالة المستوردة تحرير الذاكرة المخصصة بواسطة كود SystemVerilog ولا تتوقع من كود SystemVerilog تحرير الذاكرة المخصصة بواسطة الكود الأجنبي أو (المترجم الأجنبي).
- قد يؤدي استدعاء مهمة مستوردة إلى تعليق الخيط قيد التنفيذ حاليًا. يحدث هذا عندما تستدعي مهمة مستوردة مهمة مُصدَّرة، وتقوم المهمة المُصدَّرة بتنفيذ أمر تحكم في التأخير أو أمر تحكم في الحدث أو أمر انتظار. وبالتالي، من الممكن أن تكون المهمة المستوردة نشطة في عدة خيوط تنفيذ في الوقت نفسه.
- يمكن تزويد الدالة أو المهمة المستوردة بخصائص خاصة تسمى الخصائص النقية أو السياقية.
المهام والوظائف البحتة والسياقية
الدوال البحتة
تُسمى الدالة التي تعتمد نتائجها فقط على قيمة وسائط الإدخال الخاصة بها دون أي آثار جانبية بالدالة النقية.
خصائص الدوال البحتة
- لا يمكن استدعاء الدوال النقية إلا إذا كانت غير فارغة (Non-Void) وليس لها وسائط إخراج أو وسائط إدخال/إخراج.
- يجب ألا يكون للوظائف المحددة على أنها نقية أي آثار جانبية، ويجب أن تعتمد نتائجها فقط على قيم وسائط الإدخال الخاصة بها.
- يمكن حذف استدعاء الدالة النقية بأمان إذا لم تكن هناك حاجة إلى نتيجتها أو إذا كانت نتائجها لنفس قيمة وسيطات الإدخال متاحة لإعادة الاستخدام دون الحاجة إلى إعادة الحساب.
- يُفترض أن الدالة النقية لا تقوم بشكل مباشر أو غير مباشر بما يلي:
- قم بتنفيذ أي عملية على الملفات.
- اقرأ أو اكتب أي شيء في متغيرات البيئة، والذاكرة المشتركة، والمآخذ، وما إلى ذلك.
- الوصول إلى أي بيانات دائمة مثل المتغيرات العامة أو الثابتة.
- لا يمكن أبدًا اعتبار مهمة مستوردة مهمة نقية.
مهام ووظائف السياق
تُسمى المهمة أو الدالة المستوردة التي تستدعي المهام أو الدوال "المصدرة" أو تصل إلى كائنات بيانات SystemVerilog بخلاف وسائطها الفعلية مهمة أو دالة سياقية.
خصائص مهام ووظائف السياق
1) يمكن لمهمة أو دالة مستوردة من السياق الوصول إلى أي كائن بيانات SystemVerilog (قراءةً أو كتابةً) عن طريق استدعاء (PLI/VPI) أو عن طريق استدعاء مهمة أو دالة تصدير. لذلك، يُعد استدعاء مهمة أو دالة السياق عائقًا أمام تحسين مُصرّف SystemVerilog.
بيان الاستيراد
استيراد " DPI - C " دالة int calc_parity (input int a);بيان التصدير
تصدير "DPI-C" my_cfunction = دالة myfunction ;استدعاء وظائف يونكس
يمكن لرمز SystemVerilog استدعاء وظائف Unix مباشرة عن طريق استيرادها، دون الحاجة إلى غلاف.
مثال DPI
استدعاء دوال لغة C في لغة SystemVerilog
ملف كود C
#include <stdio.h> #include <stdlib.h>دالة خارجية int add ( void ) { int a = 10 , b = 20 ; a = a + b ;printf ( "تمت عملية الجمع بنجاح والنتيجة = %d \n " , a ); return a ; }ملف كود SystemVerilog
وحدة tb_dpi ؛استيراد "DPI-C" دالة int add (); استيراد "DPI-C" دالة int sleep ( input int secs ); int j ; initial begin $ display ( "الدخول إلى كتلة SystemVerilog الأولية" ); # 20 j = add (); $ display ( "قيمة J = %d" , j ); $ display ( "الانتظار لمدة 3 ثوانٍ مع دالة Unix" ); sleep ( 3 ); $ display ( "الخروج من كتلة SystemVerilog الأولية" ); # 5 $ finish ; end endmoduleمراجع
- جوبي كريشنا (2005-11-09). "برنامج تعليمي حول SystemVerilog DPI" .
- برنامج تعليمي حول لغة SystemVerilog DPI من مشروع VeriPage
- واجهات برمجة التطبيقات
- لغات التحقق من الأجهزة
