استخدام مهام النظام
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 77 من 90.
مهام النظام هي أوامر مدمجة في Verilog تبدأ بعلامة الدولار ($). وهي تؤدي وظائف مفيدة مثل طباعة الرسائل، وإنهاء المحاكاة، وإنشاء ملفات شكل الموجة (waveform).
لقد قمنا بالفعل بتغطية $display و $monitor و $dumpfile و $dumpvars في الدروس السابقة. في هذا الدرس، سنلقي نظرة على مهام نظام إضافية مفيدة في منصات الاختبار (testbenches).
مهام النظام الإضافية
| مهمة النظام | الغرض |
|---|---|
$time | إرجاع وقت المحاكاة الحالي |
$finish | إنهاء المحاكاة |
$stop | إيقاف المحاكاة مؤقتاً |
$random | توليد رقم عشوائي |
$time
يعيد وقت المحاكاة الحالي. مفيد لتتبع وقت حدوث الأحداث.
$display("Current time is %0t", $time);$finish
ينهي المحاكاة. استخدمه دائمًا في نهاية منصة الاختبار (testbench) الخاصة بك.
$finish;$stop
يوقف المحاكاة مؤقتاً. يمكن استئنافها باستخدام أمر محاكاة. مفيد لتصحيح الأخطاء.
$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لطباعة الوقت الحالي في البداية - أضف
$displayلطباعة الوقت الحالي في النهاية - أضف
$finishلإنهاء المحاكاة
ورقة مرجعية
تبدأ مهام النظام (System tasks) في Verilog بـ $ وتقوم بوظائف محاكاة مساعدة:
| مهمة النظام | الغرض |
|---|---|
$time | إرجاع وقت المحاكاة الحالي |
$finish | إنهاء المحاكاة |
$stop | إيقاف المحاكاة مؤقتاً |
$random | توليد رقم عشوائي |
$display("Time: %0t", $time); // طباعة الوقت الحالي
$finish; // إنهاء المحاكاة
$stop; // إيقاف المحاكاة مؤقتاً
reg [7:0] rand_value;
rand_value = $random; // تعيين رقم عشوائيجرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة