استخدام مهام النظام
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 77 من 90.
مهام النظام (System tasks) هي أوامر مدمجة في Verilog تبدأ بعلامة الدولار ($). وتؤدي وظائف مفيدة مثل طباعة الرسائل، وإناء المحاكاة، وإنشاء ملفات المخطط الزمني (waveform).
لقد قمنا بالفعل بتغطية $display و $monitor و $dumpfile و $dumpvars في الدروس السابقة. في هذا الدرس، سنلقي نظرة على مهام نظام إضافية مفيدة في بيئات الاختبار (testbenches).
مهام النظام الإضافية
| مهام النظام (System Task) | الهدف |
|---|---|
$time | إرجاع وقت simulation الحالي (current) |
$finish | إنهاء (End) الـ simulation |
$stop | إيقاف مؤقت (pause) للـ simulation |
$random | توليد number عشوائي (random) |
$time
يعيد وقت الـ simulation الـ current. مفيد لتتبع وقت حدوث الأحداث.
$display("Current time is %0t", $time);$finish
ينهي الـ simulation. يُستخدم دائمًا في نهاية الـ testbench الخاص بك.
$finish;$stop
يقوم بإيقاف الـ simulation مؤقتًا. ويمكن استئنافه باستخدام أمر الـ simulator. مفيد للاستكشاف والأخطاء وتصحيحها (debugging).
$stop;$random
يقوم بإنشاء رقم عشوائي. مفيد لإنشاء محفزات اختبار عشوائية.
reg [7:0] rand_value;
rand_value = $random;مثال باستخدام مهام نظام متعددة
module system_tasks_demo;
reg [7:0] data;
integer i;
initial begin
$display("Simulation started at time %0t", $time);
for (i = 0; i < 5; i = i + 1) begin
data = $random;
$display("Random value %d: %b", i, data);
end
$stop;
#10 $display("Resumed at time %0t", $time);
$display("Simulation finished at time %0t", $time);
$finish;
end
endmoduleالتحدي
أضف مهام النظام المفقودة إلى وحدة الاختبار (testbench) هذه.
ما يجب فعله:
- أضف
$displayلطباعة الوقت الحالي (current time) في البداية (start) - أضف
$displayلطباعة الوقت الحالي (current time) في النهاية (end) - أضف
$finishلإنهاء المحاكاة (simulation)
جرّب بنفسك
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// TODO: أضف $display مع الوقت الحالي في البداية
// التنسيق: "Start time: %0t"
$monitor("Time %0t: a=%b, b=%b, c=%b", $time, a, b, c);
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
// TODO: أضف $display مع الوقت الحالي في النهاية
// التنسيق: "End time: %0t"
// TODO: أضف $finish
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات14أساسيات الـ Testbench
ما هو الـ Testbenchإنشاء المحفزاتالمهام Display و Monitorالمهام Dumpfile و Dumpvarsاستخدام مهام النظامملخص - Testbench كامل3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة