logo

معلمات فيريلوج

في Verilog، تعد المعلمات ثوابت ولا تنتمي إلى أي نوع بيانات آخر مثل أنواع البيانات المسجلة أو الصافية.

يشير التعبير الثابت إلى رقم ثابت أو معلمة محددة مسبقًا. لا يمكننا تعديل قيم المعلمات في وقت التشغيل، ولكن يمكننا تعديل قيمة المعلمة باستخدام com.defparam إفادة.

ال com.defparam يمكن للبيان تعديل المعلمات فقط في وقت الترجمة. يمكن تعديل قيم المعلمات باستخدام مواصفات التأخير # مع إنشاء مثيل للوحدة النمطية.

في فيريلوج ، هناك طريقتان لتجاوز قيمة معلمة الوحدة أثناء إنشاء مثيل للوحدة.

  1. باستخدام الكلمة الأساسية defparam.
  2. وتعيين قيمة معلمة مثيل الوحدة النمطية.

بعد الكلمة الأساسية defparam، يتم تحديد المسار الهرمي للمعلمة والقيمة الجديدة للمعلمة. يجب أن تكون هذه القيمة الجديدة تعبيرًا ثابتًا. إذا كان التعبير الموجود على الجانب الأيمن يشير إلى أي معلمات، فيجب الإعلان عنه داخل الوحدة حيث يتم استدعاء defparam.

تبدو طريقة تعيين قيمة معلمة مثيل الوحدة وكأنها تعيين تأخير لمثيل البوابة. تتجاوز هذه الطريقة المعلمات الموجودة داخل الوحدات التي تم إنشاء مثيل لها كما تظهر في الوحدة. باستخدام هذا التنسيق، لا يمكن تخطي المعلمات.

يمكن أن تحتوي التعبيرات الثابتة على معلمات معلنة مسبقًا. عند اكتشاف تغييرات على المعلمات المعلنة مسبقًا، يتم تحديث جميع المعلمات التي تعتمد على هذه القيمة تلقائيًا.

ضع في اعتبارك أنه يمكن تحديد معلمات أداة الجمع ذات 4 بت لقبول قيمة عدد البتات، ويمكن تمرير قيم المعلمات الجديدة أثناء إنشاء مثيل الوحدة. لذلك، يتم تحويل أداة الجمع N-bit إلى أداة إضافة 4 بت أو 8 بت أو 16 بت. إنها مثل الوسائط للدالة التي يتم تمريرها أثناء استدعاء الوظيفة.

 parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3 

هناك نوعان من المعلمات وحدة و تحديد وكلاهما يقبل مواصفات النطاق. ولكنها مصنوعة على نطاق واسع بقدر القيمة التي سيتم تخزينها، وبالتالي فإن مواصفات النطاق ليست ضرورية.

معلمات الوحدة

يمكن استخدامه لتجاوز تعريفات المعلمات داخل الوحدة النمطية ويجعل الوحدة تحتوي على مجموعة مختلفة من المعلمات في وقت الترجمة. يمكن تعديل المعلمة باستخدام com.defparam إفادة. من الشائع استخدام الأحرف الكبيرة في أسماء المعلمات لتلاحظها على الفور.

تستخدم الوحدة أدناه معلمات لتحديد عرض الناقل وعرض البيانات وعمق FIFO داخل التصميم، ويمكن تجاوزها بقيم جديدة عند إنشاء مثيل للوحدة أو باستخدام عبارات defparam.

 module design_ip ( addr, wdata, write, sel, rdata); parameter BUS_WIDTH = 32, DATA_WIDTH = 64, FIFO_DEPTH = 512; input addr; input wdata; input write; input sel; output rdata; wire [BUS_WIDTH-1:0] addr; wire [DATA_WIDTH-1:0] wdata; reg [DATA_WIDTH-1:0] rdata; reg [7:0] fifo [FIFO_DEPTH]; endmodule 

في نمط ANSI الجديد لإعلان منفذ Verilog، قد نعلن عن معلمات مثل:

 module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations ); 

تجاوز المعلمات

يمكن تجاوز المعلمات بقيم جديدة أثناء إنشاء مثيل الوحدة. الجزء الأول هو الوحدة المسماة design_ip بالاسم d0 حيث يتم تمرير المعلمات الجديدة ضمن # ( ).

الجزء الثاني هو استخدام بنية Verilog تسمى com.defparam لتعيين قيم المعلمات الجديدة. تُستخدم الطريقة الأولى بشكل شائع لتمرير معلمات جديدة في تصميمات RTL. ويتم استخدام الطريقة الثانية في عمليات محاكاة الاختبار لتحديث معلمات التصميم بسرعة دون الحاجة إلى إعادة تشغيل الوحدة.

 module tb; // Module instantiation override design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]); // Use of defparam to override defparam d0.FIFO_DEPTH = 128; endmodule 

يحتوي عداد الوحدة على معلمتين ن و تحت ، والتي تم الإعلان عن أن قيمتها الافتراضية هي 2 و 0.

ن يتحكم في عدد البتات في الإخراج، ويتحكم بشكل فعال في عرض العداد. إنه عداد 2 بت بشكل افتراضي.

معامل تحت يتحكم في ما إذا كان العداد يجب أن يزيد أو ينقص. سوف يتناقص العداد لأن المعلمة مضبوطة على 0.

عداد 2 بت لأعلى

string.format في جافا
 module counter # ( parameter N = 2, parameter DOWN = 0) (input clk, input rstn, input en, output reg [N-1:0] out); always @ (posedge clk) begin if (!rstn) begin out <= 0; end else begin if (en) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>

يتم استخدام المعلمات الافتراضية لتنفيذ العداد حيث ن يساوي اثنين، مما يجعله عدادًا مكونًا من 2 بت، و تحت يساوي صفرًا، مما يجعله عدادًا صعوديًا. يتم ترك الإخراج من العداد غير متصل في المستوى الأعلى.

معلمات فيريلوج

4 بت أسفل العداد

في هذه الحالة، يتم إنشاء عداد الوحدة النمطية باستخدام N كـ 4 مما يجعله عدادًا ذو 4 بت. يتم تمرير DOWN بقيمة 1 أثناء إنشاء مثيل الوحدة وبالتالي يتم تنفيذ العداد السفلي.

 module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule 

معلمات فيريلوج

تحديد المعلمات

تُستخدم هذه المعلمات لتوفير قيم الوقت والتأخير ويتم الإعلان عنها باستخدام com.specparam الكلمة الرئيسية. يُسمح باستخدامه داخل الكتلة المحددة وجسم الوحدة الرئيسية.

 // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule 

الفرق بين التحديد ومعلمات الوحدة النمطية

تحديد المعلمة معلمة الوحدة
حدد الكلمة الأساسية specparam التي تعلن عن المعلمة. يتم الإعلان عن معلمة الوحدة بواسطة المعلمة.
يمكن الإعلان عنه داخل كتلة محددة أو داخل الوحدة الرئيسية. لا يمكن الإعلان عنها إلا داخل الوحدة الرئيسية.
قد يتم تعيين معلمات ومعلمات لهذه المعلمة. قد لا يتم تعيين المواصفات لهذا.
يمكن استخدام SDF لتجاوز القيم. يمكن استخدام قيم معلمات إعلان المثيل أو defparam للتجاوز.

ملحوظات

فيما يلي بعض الملاحظات المهمة لمعلمات Verilog، مثل:

  • إذا كنا نستخدم com.defparam بيان، يجب علينا تحديد مسار هرمي للمعلمة.
  • لا يمكننا تخطي المعلمة في تعيين قيمة معلمة مثيل الوحدة النمطية . إذا أردنا القيام بذلك، استخدم القيمة الأولية لمعلمة غير قابلة للكتابة فوقها.
  • عندما تعتمد إحدى المعلمات على الأخرى، فسيتم تحديث المعلمة الثانية تلقائيًا إذا قمنا بتغيير المعلمة الأولى.