Unsized Numbers
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 15 من 90.
الرقم غير محدد الحجم هو رقم يُكتب من دون تحديد عدد البتات التي يتكوّن منها. عند كتابة رقم من دون بادئة للحجم، يفترض Verilog أن حجمه هو 32 بتًا افتراضيًا.
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // نفس ما سبق، لكن بشكل صريحتستخدم الأرقام Unsized التنسيق والقيمة فقط: [format][value]
<strong>format</strong>: أساس الرقم:bللنظامbinary، وdللنظامdecimal، و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; // Unsized: 32-bit decimal 255
data = 'hFF; // غير محدد الحجم: سداسي عشري 32 بت FF
endUnsized مقابل Sized
| Unsized | Sized | |
|---|---|---|
| مثال | 1010 أو 'd255 | 8'b1010 أو 8'd255 |
| عرض البت | 32 bits (افتراضي) | explicit (كما هو محدد) |
| الفاصلة العليا | مطلوبة مع التنسيق | مطلوبة |
| متى تُستخدم | شفرة testbench البسيطة | تعيينات العتاد |
مشكلة محتملة
يمكن أن تتسبب الأرقام Unsized في سلوك غير متوقع عند إسنادها إلى سجلات أصغر:
reg [3:0] small;
small = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small = 'b10000; // قيمة 32-بت، لكنها كبيرة جدًا! (تحذير)يُسنِد المثال الثاني قيمةً من 32 بت 10000 إلى سجلّ من 4 بتات. لا يتم الاحتفاظ إلا بالبتات الأربعة الدنيا (0000)، وقد لا يكون هذا ما تتوقعه.
متى تستخدم الأرقام غير محددة الحجم
تُعد الأرقام غير محددة الحجم ملائمة من أجل:
- الأرقام البسيطة في منصات الاختبار
- عدادات الحلقات
- عبارات
$display
بالنسبة إلى إسنادات العتاد الفعلية، استخدم أرقامًا ذات حجم محدد لتكون explicit وتتجنب التحذيرات.
التحدي
في الكود أدناه، بعض الأرقام Unsized. غيّرها إلى أرقام sized (8 bits) لتجنّب التحذيرات.
ما يجب فعله:
- غيّر
aإلى رقم Change ثنائي بحجم 8 bits من أجل 1010 - غيّر
bإلى رقم Change عشري بحجم 8 bits من أجل 255 - غيّر
cإلى رقم Change سداسي عشري بحجم 8 bits من أجل FF
جرّب بنفسك
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // غيّر إلى حجم محدد (عشري 8 بت)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت