ما الذي تم تضمينه في قائمة الحساسية verilog Always@*؟

StackOverflow https://stackoverflow.com//questions/9659038

  •  12-12-2019
  •  | 
  •  

سؤال

أنا في حيرة من أمري بشأن ما يعتبر مدخلاً عند استخدام حرف البدل @* في قائمة حساسية الحظر دائمًا.على سبيل المثال، في المثال التالي، ما هي الإشارات التي يتم تفسيرها على أنها مدخلات تؤدي إلى إعادة تقييم الكتلة دائمًا؟من ما أفهم clk و إعادة ضبط لم يتم تضمينها لأنها لا تظهر على الجانب الأيمن من أي بيان إجرائي في الكتلة دائمًا. أ و ب يتم تضمينهما لأنهما يظهران على الجانب الأيمن من البيانات الإجرائية في الكتلة دائمًا.ولكن ما أنا في حيرة من أمري حقًا هو أون و مكس.لأنها تستخدم كشروط اختبار في لو و قضية البيانات هل تعتبر مدخلات؟هل تتم إعادة تقييم الكتلة دائمًا في كل مرة أون و مكس تغيير القيمة؟أنا مستجد إلى حد كبير، وفي كتب Verilog الثلاثة التي أملكها لم أجد تفسيرًا مرضيًا.لقد وجدت دائمًا أن التفسيرات هنا مفيدة حقًا.شكرًا

module example
( 
    input wire clk, reset, en, a, b,
    input wire [1:0] mux,
    output reg x,y, z
);

always @*    
begin  
 x = a & b;    
  if (en)
    y= a | b;
  case(mux)
    2'b00: z = 0;
    2'b01: z = 1;
    2'b10: z = 1;
    2'b11: z = 0;
  endcase
end
endmodule
هل كانت مفيدة؟

المحلول

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

في حالة الكود الذي قدمته، فإن أي إشارة هي:

  • تم تقييمها على الجانب الأيمن من المهمة (a و b)
  • تم تقييمه كجزء من الشرط (en و mux)

...ولكنها أي إشارة سيتم تقييمها لأي سبب من الأسباب.(لا أستطيع التفكير في أي أسباب أخرى الآن، ولكن ربما يمكن لشخص آخر أن يفعل ذلك)

clk و reset ليست مدرجة في قائمة الحساسية لأنها غير مستخدمة.سهل هكذا.لا يوجد شيء مميز فيهم؛إنها إشارات مثل أي إشارات أخرى.

نصائح أخرى

في المثال الخاص بك، يتم تضمين الإشارات التالية في قائمة الحساسية الضمنية:

a
b
en
mux

clk و reset ليست جزءا من قائمة الحساسية.

تم توضيح ذلك بالكامل في IEEE Std for Verilog (1800-2009، على سبيل المثال).تعد مواصفات IEEE أفضل مصدر للمعلومات التفصيلية عن Verilog.قد تصف الوثائق الخاصة بالمحاكي الخاص بك أيضًا كيفية القيام بذلك @* يعمل.

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

لذا، استخدم دائمًا "always@*" أو الأفضل من ذلك "always_comb" وانس مفهوم قوائم الحساسية.إذا تم تقييم العنصر الموجود في الكود، فسيؤدي ذلك إلى تشغيل العملية.سهل هكذا.إذا كان العنصر موجودًا في حالة if/else، أو حالة، أو تم تعيينه لمتغير، أو أي شيء آخر، فسيتم "تقييمه" وبالتالي يؤدي إلى بدء العملية.

لكن تذكر فقط أنه في الدوائر الرقمية، لا توجد قائمة حساسية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top