الأعداد غير محددة الحجم
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 15 من 90.
الرقم غير محدد الحجم (unsized number) هو رقم يُكتب دون تحديد عدد البتات التي يحتوي عليها. عندما تكتب رقماً بدون بادئة حجم، يفترض Verilog أنه 32 بت بشكل افتراضي.
a = 'b1010; // غير محدد الحجم: يعامل Verilog هذا على أنه 32 بت
a = 32'b1010; // نفس ما ورد أعلاه، ولكن بشكل صريحتستخدم الأرقام غير محددة الحجم التنسيق والقيمة فقط: [format][value]
<strong>format</strong>— أساس الرقم:bللثنائي،dللعشري،hللست عشري، أوoللثماني<strong>value</strong>— الرقم الفعلي (على سبيل المثال،1010)
لا تزال الفاصلة العليا ' مطلوبة بين التنسيق والقيمة، ولكن لا يوجد عدد بتات قبلها.
'b1010— ثنائي 1010 بحجم 32 بت'd255— عشري 255 بحجم 32 بت'hFF— سداسي عشري FF بحجم 32 بت'b1— ثنائي 1 بحجم 32 بت (مع 31 صفراً بادئاً)
مثال على الكود:
reg [7:0] data;
initial begin
data = 1010; // غير محدد الحجم: قيمة 32 بت (قد يتسبب في تحذير)
data = 'd255; // غير محدد الحجم: عشري 32 بت 255
data = 'hFF; // غير محدد الحجم: سداسي عشري 32 بت FF
endغير محدد الحجم مقابل محدد الحجم
| غير محدد الحجم | محدد الحجم | |
|---|---|---|
| مثال | 1010 أو 'd255 | 8'b1010 أو 8'd255 |
| عرض البتات | 32 بت (افتراضي) | صريح (كما هو محدد) |
| الفاصلة العليا | مطلوبة مع التنسيق | مطلوبة |
| متى يُستخدم | أكواد منصة الاختبار (testbench) البسيطة | تعيينات العتاد (Hardware assignments) |
مشكلة محتملة
يمكن أن تتسبب الأرقام غير المحددة الحجم في سلوك غير متوقع عند تعيينها لسجلات أصغر:
reg [3:0] small;
small = 'b1111; // قيمة 32 بت، لكنها تناسب 4 بتات (جيد)
small = 'b10000; // قيمة 32 بت، لكنها كبيرة جداً! (تحذير)يقوم المثال الثاني بتعيين قيمة 32 بت 10000 إلى سجل 4 بت. يتم الاحتفاظ بالبتات الأربعة الدنيا فقط (0000)، وهو ما قد لا يكون ما تتوقعه.
متى تستخدم الأرقام غير محددة الحجم
تعتبر الأرقام غير محددة الحجم ملائمة لـ:
- الأرقام البسيطة في منصات الاختبار (testbenches)
- عدادات الحلقات
- جمل
$display
بالنسبة لتعيينات العتاد الفعلية، استخدم أرقاماً محددة الحجم لتكون صريحاً وتتجنب التحذيرات.
التحدي
في الكود أدناه، بعض الأرقام غير محددة الحجم. قم بتغييرها إلى أرقام محددة الحجم (8 بت) لتجنب التحذيرات.
ما يجب القيام به:
- قم بتغيير
aإلى رقم ثنائي بحجم 8 بت للقيمة 1010 - قم بتغيير
bإلى رقم عشري بحجم 8 بت للقيمة 255 - قم بتغيير
cإلى رقم سداسي عشري بحجم 8 بت للقيمة FF
ورقة مرجعية
الأرقام غير محددة الحجم في Verilog تكون افتراضياً 32 بت. الصيغة: '[format][value]
'b1010 // ثنائي 32 بت
'd255 // عشري 32 بت
'hFF // ستة عشري 32 بتالأرقام محددة الحجم تستخدم [bits]'[format][value]:
8'b1010 // ثنائي 8 بت
8'd255 // عشري 8 بت
8'hFF // ستة عشري 8 بتتخصيص رقم غير محدد الحجم لسجل (register) أصغر يحتفظ فقط بالبتات الدنيا — استخدم الأرقام محددة الحجم لتخصيصات العتاد لتجنب التحذيرات والاقتطاع غير المتوقع.
جرّب بنفسك
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // تغيير إلى محدد الحجم (8-bit decimal)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة