التحقق من المخرجات
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 83 من 90.
التحدي
في هذا الدرس، ستضيف أوامر تفريغ شكل الموجة وتتحقق من أن وحدة التحكم في إشارة المرور تعمل بشكل صحيح.
حتى الآن، كان testbench مخفيًا ومُلحقًا بوحدتك. في هذه الخطوة، يصبح testbench جزءًا من ملف الخاص بك: احتفظ بوحدة traffic_light من الخطوة السابقة (توقيت العداد، ومن دون إدخال next) وأضف وحدة testbench أسفلها. إذا لم يكن ملفك يحتوي بعد على module testbench، فانسخ هذه الوحدة:
module testbench;
reg clk, reset;
wire red, yellow, green;
traffic_light uut (
.clk(clk),
.reset(reset),
.red(red),
.yellow(yellow),
.green(green)
);
always #1 clk = ~clk;
initial begin
// TODO: Add $dumpfile to create "traffic.vcd"
// TODO: Add $dumpvars to dump all signals (0, testbench)
$display("Traffic Light Test");
$monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
clk = 0;
reset = 1;
#2 reset = 0;
#90;
$finish;
end
endmoduleما يجب فعله:
حدّث testbench من أجل:
- إضافة
$dumpfileلإنشاء ملف شكل موجة باسمtraffic.vcd - إضافة
$dumpvarsلتفريغ جميع الإشارات في testbench - تشغيل المحاكاة والتحقق من الناتج
يقارن الاختبار ناتج المحاكي بالكامل، لذلك يجب أن يطبع testbench بالضبط ما يطبعه testbench أعلاه ولا شيء آخر: ترويسة $display("Traffic Light Test")، وسطر $monitor واحد لكل تغيير في الأضواء، وساعة تتبدل كل وحدة زمنية، وتحرير reset عند الزمن 2، و$finish بعد #90. لا تضف أسطر $display أخرى (لا تضف "Test complete").
الناتج المتوقع (يضيف المحاكي سطر $finish called at 92 النهائي بنفسه):
VCD info: dumpfile traffic.vcd opened for output.
Traffic Light Test
Time 0: red=1, yellow=0, green=0
Time 3: red=0, yellow=0, green=1
Time 65: red=0, yellow=1, green=0
Time 87: red=1, yellow=0, green=0جرّب بنفسك
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
// الحالات: 0=أخضر، 1=أصفر، 2=أحمر
reg [1:0] state;
reg [5:0] counter;
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // ابدأ عند الأحمر
counter <= 0;
end else begin
if (counter == 0) begin
// غيّر الحالة
if (state == 0) begin // أخضر -> أصفر
state <= 1;
counter <= 10; // الأصفر يستمر 10 ثوانٍ
end else if (state == 1) begin // أصفر -> أحمر
state <= 2;
counter <= 40; // الأحمر يستمر 40 ثانية
end else begin // أحمر -> أخضر
state <= 0;
counter <= 30; // الأخضر يستمر 30 ثانية
end
end else begin
counter <= counter - 1;
end
end
end
// منطق الإخراج
always @(*) begin
red = (state == 2);
yellow = (state == 1);
green = (state == 0);
end
endmodule
module testbench;
reg clk, reset;
wire red, yellow, green;
traffic_light uut (
.clk(clk),
.reset(reset),
.red(red),
.yellow(yellow),
.green(green)
);
always #1 clk = ~clk;
initial begin
// TODO: أضف $dumpfile لإنشاء "traffic.vcd"
// TODO: أضف $dumpvars لتفريغ جميع الإشارات (0, testbench)
$display("Traffic Light Test");
$monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
clk = 0;
reset = 1;
#2 reset = 0;
#90;
$finish;
end
endmodule
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت