المهام Display و Monitor
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 75 من 90.
تُعد $display و $monitor مهام نظام تُستخدم لطباعة المعلومات من المحاكاة الخاصة بك. فهي تساعدك على رؤية ما يحدث داخل تصميمك.
$display
يقوم $display بطباعة رسالة مرة واحدة في لحظة تنفيذه.
الصيغة:
$display("message", variables);مثال:
initial begin
$display("Simulation started");
#10;
$display("Time 10");
#10;
$display("Time 20");
endالمخرجات:
Simulation started
Time 10
Time 20$monitor
يقوم $monitor بطباعة رسالة تلقائياً كلما تغيرت أي من متغيراته.
الصيغة البرمجية:
$monitor("message", variables);مثال:
initial begin
a = 0; b = 0;
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
#10 a = 0;
endالمخرجات:
Time 0: a=0, b=0
Time 10: a=1, b=0
Time 20: a=1, b=1
Time 30: a=0, b=1$display مقابل $monitor
| $display | $monitor | |
|---|---|---|
| وقت الطباعة | مرة واحدة عند التنفيذ | في كل مرة يتغير فيها متغير |
| عدد المرات | بعدد المرات التي تستدعيه فيها | بشكل مستمر (حتى يتم تغييره) |
| يستخدم لـ | العناوين، رسائل الاختبار | تتبع الإشارات المتغيرة |
محددات التنسيق الشائعة
| المحدد | المعنى | مثال |
|---|---|---|
%b | ثنائي | $display("%b", a); |
%d | عشري | $display("%d", count); |
%h | ستة عشري | $display("%h", data); |
%t | الوقت | $display("%t", $time); |
%0t | الوقت (بدون مسافات) | $display("%0t", $time); |
%s | سلسلة نصية | $display("%s", "Hello"); |
قواعد هامة
| القاعدة | الشرح |
|---|---|
$display يطبع مرة واحدة | جيد للعناوين والنتائج النهائية |
$monitor يطبع عند التغيير | جيد لمراقبة الإشارات |
$monitor واحد فقط يكون نشطاً | الأخير يلغي ما قبله |
استخدم $finish للتوقف | وإلا فقد تستمر المحاكاة إلى الأبد |
التحدي
أضف عبارات $display و $monitor المفقودة إلى منصة الاختبار (testbench) هذه.
ما يجب القيام به:
- أضف
$displayلطباعة ترويسة: "Testing OR Gate" - أضف
$monitorلطباعة الوقت، و x، و y، و z كلما تغيرت أي إشارة. التنسيق: "Time %0t: x=%b, y=%b, z=%b" - أضف
$displayفي النهاية لطباعة "Test complete"
ورقة مرجعية
يطبع $display مرة واحدة عند التنفيذ؛ بينما يطبع $monitor تلقائياً كلما تغير أي من متغيراته.
$display("message", variables);
$monitor("message", variables);مثال:
initial begin
$display("Simulation started");
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
endمحددات التنسيق الشائعة:
%b— ثنائي (Binary)%d— عشري (Decimal)%h— ست عشري (Hexadecimal)%t/%0t— الوقت (مع/بدون حشو)%s— سلسلة نصية (String)
القواعد الأساسية:
- يكون
$monitorواحد فقط نشطاً في المرة الواحدة — الأخير يلغي ما قبله. - استخدم
$finishلإيقاف المحاكاة.
جرّب بنفسك
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
// TODO: أضف $display لعنوان "Testing OR Gate"
// TODO: أضف $monitor لتتبع الوقت، x، y، z
// التنسيق: "Time %0t: x=%b, y=%b, z=%b"
// تطبيق المحفزات
x = 0; y = 0; #10;
x = 0; y = 1; #10;
x = 1; y = 0; #10;
x = 1; y = 1; #10;
// TODO: أضف $display لرسالة "Test complete"
$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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة