সংশ্লেষণের সময় ল্যাচগুলি কীভাবে এড়ানো যায়


9

আমি ভিএইচডিএল ব্যবহার করে সংযুক্ত যুক্তির একটি ব্লক ডিজাইন করতে চাই, তবে মাঝে মাঝে সংশ্লেষিত ফলাফলটিতে একটি অনিচ্ছাকৃত ল্যাচ থাকে।

অনুমানকারী ল্যাচগুলি থেকে সিন্থেসাইজারকে এড়াতে আমার কী কোডিং নির্দেশিকা অনুসরণ করতে হবে?

উদাহরণ: কোডের ছোট অংশে, আমি যদি অন্য বিবৃতি ব্যবহার করি?


আমি যা জিজ্ঞাসা করতে চাইছি যদি কেউ যদি তা পেতে পারে তবে দয়া করে আমাকে জানান

আপনার উদাহরণ থেকে আপনি কী বোঝাতে চেয়েছিলেন তা নিশ্চিত ছিলাম না। পুনরায় রেকর্ডিংটি আপনার মূল উদ্দেশ্যটির সাথে মেলে তা নিশ্চিত করে দেখুন check
W5VO

@ ফাতাই, আমি ইতিমধ্যে মন্তব্য করেছি, মেটা.স্ট্যাকেক্সেঞ্জ.কম এ আপনার অ্যাকাউন্টটি মুছে ফেলার জন্য একটি নির্দিষ্ট পদ্ধতি রয়েছে। আমি শেষ প্রশ্নটিতে লিঙ্ক করেছি যা আমি পতাকাঙ্কিত হয়েছিলাম। সাইটে মডারেটরদের এই ক্ষমতা কখনও নেই। এর জন্য দেব দলের সাথে যোগাযোগ করা প্রয়োজন।
কর্টুক

উত্তর:


13

লেচগুলি এড়ানোর জন্য, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার সমস্ত আউটপুট কোডের সমস্ত সম্ভাব্য শাখায় নির্ধারিত হয়েছে।

উদাহরণ স্বরূপ,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

একটি ল্যাচ তৈরি করবে, কারণ প্রথম শর্তে, খ (1) এর মান নির্দিষ্ট করা হয়নি, তাই সংকলক সিদ্ধান্ত নিয়েছে যে আপনি বি (1) এর পূর্ববর্তী মানটি রাখতে চান। এটি লেখার একটি উপায় যা কোনও ল্যাচ তৈরি করে না:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

এখানে আপনি স্পষ্টতই বলেছেন যে খ এর পুরানো মান ধরে রাখা উচিত এবং তারপরে নতুন মান দিয়ে b (0) ওভাররাইট করা উচিত।

@ টোমিজির উত্তর অনুসারে, আর একটি উপায় বা ডিফল্ট মান দেওয়া।

আপনি যে কোডটি ল্যাচ পেয়ে যাচ্ছেন তা যদি পোস্ট করেন তবে আমরা আপনাকে সুনির্দিষ্ট কারণ খুঁজে পেতে সহায়তা করতে পারি।


আমি মনে করি না যে আপনার পদ্ধতির b <= bকোনও ল্যাচ এড়ানো হবে, কারণ এটির জন্য এখনও সংকেতের অবস্থা সংরক্ষণ করা দরকার।
টমি জুনিলিলা

তুমি ঠিক হতে পারো; আমি খুব ক্লক যুক্তি করতে অভ্যস্ত। আমি সম্পাদনা করব।
fbo

6

আপনি যদি সম্মিলিত যুক্তির জন্য প্রক্রিয়াগুলি ব্যবহার করছেন (এবং আমি কেবলমাত্র এই কারণে এটির বিরুদ্ধে পরামর্শ দিই) তবে নিশ্চিত হয়ে নিন যে প্রক্রিয়াটির মধ্য দিয়ে প্রতিটি পাথ প্রক্রিয়াটি চালিত প্রতিটি সংকেতকে কিছু নির্দিষ্ট করে দেয়। প্রক্রিয়াটি "শেষ সময়" থেকে চালিত আউটপুটগুলির কোনওটিরই আউটপুট নির্ভর করতে পারে না।

অন্যথায় আপনি একটি ল্যাচটি নির্ধারণ করেন কারণ পরবর্তী সময় প্রক্রিয়াটি নির্ধারিত হওয়ার পরে এটি সিগন্যালের মান রাখতে হবে যা গতবারের মতো নতুন মান পেল না।

আমি নিখুঁতভাবে যুক্ত যুক্তি যুক্তিকে অবিচ্ছিন্ন কার্যকারিতা হিসাবে রাখতে পছন্দ করি এবং ক্লকড যুক্তির জন্য প্রক্রিয়াগুলি ব্যবহার করি, তারপরে আমি ল্যাচগুলি পাই না।


5

ল্যাচগুলি এড়াতে চারটি নিয়ম:

  • আপনি যে সিগন্যাল লিখছেন তা থেকে পড়বেন না।
  • একটি সঠিক সংবেদনশীলতা তালিকা আছে (আপনি যে সমস্ত সংকেত পড়েন সেগুলি সংবেদনশীলতার তালিকায় থাকা উচিত)
  • আপনার লেখার প্রতিটি পথে নির্ধারিত সমস্ত সংকেত নিশ্চিত করুন। (উদাহরণস্বরূপ: যদি-অন্য-বিবৃতিতে প্রতিটি শাখায় থাকে)
  • যে প্রক্রিয়াগুলি ভেরিয়েবল ব্যবহার করে তাদের জন্য নিশ্চিত করুন যে প্রতিটি ভেরিয়েবল এটি পড়ার আগে একটি ডিফল্ট মান শুরু করা হয়েছে (অন্য কোনও পরিবর্তনশীল বা সিগন্যালে)।

অতিরিক্তভাবে, আপনার বেশ কয়েকটি সমন্বয়মূলক প্রক্রিয়া থাকলে, নিশ্চিত করুন যে আপনি কোনও লুপ তৈরি করবেন না।

কয়েকটি কোডিং শৈলী আপনাকে এই নিয়মগুলিকে আটকে রাখতে সহায়তা করতে পারে, উদাহরণস্বরূপ @ টোমিজের উত্তরের শৈলী। @ মার্টিন থম্পসন যেমন উল্লেখ করেছেন, একসাথে সম্মিলিত যুক্তি এড়ানো আরও ভাল। পরিবর্তে সবকিছু একটি ক্লকড প্রক্রিয়াতে রাখুন।


+1 নিয়মের দুর্দান্ত সেট। আপনি কি সম্মত হবেন যে আপনার নিয়ম # 2 (সংবেদনশীলতার তালিকা সম্পর্কে) সংশ্লেষণ এবং সিমুলেশনের মধ্যে ধারাবাহিক ফলাফল নিশ্চিত করার জন্য আসলে গুরুত্বপূর্ণ, তবে ল্যাচগুলির অনুক্রম সম্পর্কে সত্যই কোনও পার্থক্য নেই?
রিক

@ ক্রিক আফাইক, অসম্পূর্ণ সংবেদনশীলতার তালিকার সাথে সংশ্লেষণের সরঞ্জামটি কী করবে তার কোনও গ্যারান্টি নেই । ভিএইচডিএল সংশ্লেষের জন্য আইইইই স্ট্যান্ডার্ড (1076.6-1999) বলেছে: "প্রক্রিয়া সংবেদনশীলতার তালিকায় প্রক্রিয়া বিবৃতিতে পঠিত সমস্ত সংকেত থাকবে plete অসম্পূর্ণ সংবেদনশীলতা তালিকা সহ প্রক্রিয়াগুলি সমর্থিত নয়" " এটি বলেছিল, আমি জানি যে সংশ্লেষণের নির্দিষ্ট সরঞ্জামগুলি (সম্ভবত সব?) অসম্পূর্ণ সংবেদনশীলতা তালিকা গ্রহণ করে তবে সংবেদনশীলতার তালিকাটিকে একসাথে উপেক্ষা করে। আপনি যদি কঠোর আইইইই স্ট্যান্ডার্ডের পরিবর্তে সেই আচরণের উপর নির্ভর করেন তবে আমার ধারণা আপনার বক্তব্যটি সঠিক হবে।
ফিলিপ

ধন্যবাদ, এটি সঠিক বলে মনে হচ্ছে, এটি আমার মডেলটিকে সেই মানটির সাথে সম্মতিযুক্ত করবে না। এটি আমার কৌতূহলটি পেয়েছিল কারণ আমি এ পর্যন্ত যত সংশ্লেষের সরঞ্জাম দেখেছি সেগুলি সংবেদনশীলতার তালিকাকে উপেক্ষা করেছে, তবে আমি গুজব শুনেছি যে কেউ কেউ ল্যাচগুলি অনুমান করতে পারে।
রিক করুন

3

@Fbo এবং @ মার্টিন থম্পসন দ্বারা নির্দেশিত হিসাবে, আপনার প্রক্রিয়া দ্বারা চালিত প্রতিটি সিগন্যাল প্রক্রিয়াটির প্রতিটি শাখায় কিছু মূল্য নির্ধারিত হয়েছে তা নিশ্চিত করা দরকার এবং সেই মানটি আউটপুটগুলির কোনওটির পূর্ববর্তী অবস্থার উপর নির্ভরশীল না হওয়া উচিত প্রক্রিয়া।

এটি নিশ্চিত করার সহজতম উপায় হ'ল প্রক্রিয়াটির একেবারে শুরুতে প্রতিটি আউটপুটকে কিছু ডিফল্ট মান নির্ধারণ করা, উদাহরণস্বরূপ (fbo- এর উদাহরণ সহ-বেছে নেওয়া):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
এটি একটি ভাল পদ্ধতি যা আমি প্রায়শই ব্যবহার করি। কখনও কখনও যদিও, একটি ল্যাচ সতর্কতা আপনাকে ইঙ্গিত দিতে পারে যে আপনি কিছু বিট বরাদ্দ করতে ভুলে গেছেন, যদিও এই পদ্ধতিটি বাগ খুঁজে পেতে আরও কঠিন করে তুলতে পারে। উদাহরণস্বরূপ, আপনি যদি একটি বিস্তৃত সংকেতের সমস্ত বিট পৃথকভাবে বরাদ্দ করছিলেন, এবং দুর্ঘটনাক্রমে ভুল অ্যাকাউন্টে।
fbo

2
শুধুমাত্র একটি সম্মিলিত প্রক্রিয়াতে। একটি ক্লকড প্রক্রিয়াতে, আপনি একটি ফ্লিপপ্লপ অনুমান করেন যা আপনি যা চান ঠিক তেমনই হতে পারে।
মার্টিন থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.