কীভাবে আমি ভিএইচডিএলে "যত্ন নেই" সংকেত নির্দিষ্ট করতে পারি?


11

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

উদাহরণস্বরূপ একটি রেজিস্টার ফাইল নিন। write_addressএবং write_dataসংকেত সত্যিই কোন ব্যাপার না তখন write_enableসংকেত '0'। সুতরাং, এই সংকেতগুলি চালিত করছে এমন যুক্তিতে আরও অনুকূলিতকরণের জন্য তাদের ( "যত্ন নেই" মান নির্ধারণ করা উচিত (অর্থাত্ রেজিস্টার ফাইলটিতে নয়)।

সম্ভাব্য অপ্টিমাইজেশনের জন্য সংশ্লেষণের সরঞ্জামকে আরও জায়গা দেওয়ার জন্য ভিএইচডিএলে এই জাতীয় "যত্ন করবেন না" মানগুলি নির্দিষ্ট করার সঠিক উপায় কী?


এখনও অবধি আমি নীচের জিনিসগুলি খুঁজে পেয়েছি যা উপযুক্ত হতে পারে। তবে আমি নিশ্চিত না যে প্রতিটি পদ্ধতির উপকারিতা এবং বিপরীতগুলি কী:

  • কেবল সংকেত বরাদ্দ করা হচ্ছে না। দেখে মনে হচ্ছে এটি কাজ করতে পারে। তবে আমি দেখতে পেয়েছি যে আপনি যখন কোনও recordধরণের "ধ্রুবক কিছু না করেন" সংজ্ঞায়িত করতে চান তখন এটি কাজ করে না , কারণ রেকর্ড ধ্রুবকগুলি সম্পূর্ণরূপে নির্দিষ্ট করা দরকার (কমপক্ষে মডেলসিম আমাকে তাই বলে)।
  • std_logic_1164প্যাকেজ মূল্য নির্ধারণ '-' -- Don't careজন্য std_ulogic। এটিকে দেখে মনে হচ্ছে এটি স্পষ্ট "যত্নশীল নয়" এর জন্য শব্দার্থগতভাবে সঠিক পছন্দ, তবে আমি এটি কোথাও কখনও ব্যবহার করতে দেখিনি (সম্পর্কিত সম্পর্কযুক্ত ভিএইচডিএল -2008 এর case?নির্মাণ ব্যতীত)।
  • মডেলসিম নির্ধারিত 'X'সংকেত প্রদর্শনের জন্য মানটি ব্যবহার করে । তবে আমি নিশ্চিত নই যে সংশ্লেষের সরঞ্জামগুলি একটি 'X'" স্পষ্ট করে না" হিসাবে একটি স্পষ্ট- নির্ধারিত বিষয়টি বোঝে ।

এখানে স্পষ্টকরণের জন্য একটি ওভারসিম্প্লিফাইড কোড স্নিপেট রয়েছে, যেখানে আমি যত্নের সাথে সংকেতগুলি না দিয়ে ইনিশিয়েল করেছি '-'

যেহেতু আপনি দেখতে পারেন, সিগন্যাল control.reg_write_address3 এর মান আলাদা করতে পারেন: "----", instruction(11 downto 8);এবং instruction(3 downto 0);। এখন আমি প্রত্যাশা করব যে এটি '-'"যত্ন নেই" হিসাবে ব্যাখ্যা করা হলে এটি 2-ইনপুট মাল্টিপ্লেক্সারে সংশ্লেষিত হবে । আমি যদি এর (others => '0')পরিবর্তে সংকেতটি আরম্ভ করি '-', তবে সরঞ্জামটির পরিবর্তে 3-ইনপুট মাল্টিপ্লেক্সার তৈরি করতে হবে।

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package mytypes is
    type control_signals_t is record
        write_enable  : std_logic;
        write_address : std_ulogic_vector(3 downto 0);
        read_address  : std_ulogic_vector(3 downto 0);
    end record;

    -- All members of this constant must be fully specified.
    -- So it's not possible to simply not assign a value.
    constant CONTROL_NOP : control_signals_t := (
        write_enable  => '0',
        write_address => (others => '-'),
        read_address  => (others => '-')
    );
end package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library cfx;
use cfx.mytypes.all;

entity control_unit is
    port(
        instruction : in  std_ulogic_vector(15 downto 0);
        write_data  : out std_ulogic_vector(15 downto 0);
        ctrl        : out control_signals_t
    );
end entity;

architecture rtl of control_unit is
begin
    decode_instruction : process(instruction) is
    begin
        -- Set sensible default values that do nothing.
        -- Especially all "write_enable" signals should be '0'.
        -- Everything else is mostly irrelevant (don't care).
        ctrl       <= CONTROL_NOP;
        write_data <= (others => '-');

        if instruction(15 downto 12) = "1100" then
            -- Load 8 bit of data into the register file
            ctrl.write_enable  <= '1';
            write_data         <= std_ulogic_vector(resize(signed(instruction(7 downto 0)), 16));
            ctrl.write_address <= instruction(11 downto 8);
        elsif instruction(15 downto 8) = "11111001" then
            -- Load 4 bit of data into the register file
            write_data         <= std_ulogic_vector(resize(signed(instruction(7 downto 4)), 16));
            ctrl.write_address <= instruction(3 downto 0);
        elsif instruction(15 downto 8) = "10110101" then
            -- Read from the register file. Don't use the write signals at all.
            ctrl.read_address <= instruction(3 downto 0);
        end if;
    end process;
end architecture;

আপনি কী write_addressএবং write_dataকী করার চেষ্টা করছেন তার বিশদটি বলতে পারেন ? আপনি কোন অপ্টিমাইজেশন হওয়ার আশা করছেন?
fru1tbat

আমি আশা করি উদাহরণটি এটি আরও স্পষ্ট করেছে যে আমি কী অর্জন করতে চাই।
ফ্রিটজ

উত্তর:


9

আরও বিশদ উত্তর দেওয়ার জন্য আমি এটিকে একটি এলআরএম বিশেষজ্ঞের কাছে রেখে দেব, তবে সংক্ষেপে, আপনার পদ্ধতির বৈধতা হওয়া উচিত - আমি কোয়ার্টাসের সাম্প্রতিক সংস্করণ সহ একটি দ্রুত পরীক্ষা চালিয়েছি, এবং এটি হ্যান্ডেল করার '-'মতো বলে মনে হচ্ছে - উত্পন্ন যুক্তিটি হ্রাস পেয়েছে প্রত্যাশিত হিসাবে যখন আউটপুট ডিফল্ট হয় '-'( 'X'উপায় দ্বারা, খুব কাজ করে)। আপনি তালিকাভুক্ত পদ্ধতি সম্পর্কে আরও:

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

  • '-'যেমন পূর্বে উল্লিখিত হয়েছে, সম্ভবত শব্দার্থক এবং ব্যবহারিক কারণে উভয়ই সর্বোত্তম বিকল্প।

  • আপনি "অপরিজ্ঞাত" বলতে কী বোঝাতে চান তার উপর নির্ভর করে। 'X'প্রযুক্তিগতভাবে "অজানা"। 'U'মডেলসিম "X"হেক্স উপস্থাপনা হিসাবে প্রদর্শন করে যা অবিচ্ছিন্ন সিগন্যাল জন্য হয়। 'X'আমি উপরে উল্লিখিত হিসাবে, যদিও, কাজ বলে মনে হচ্ছে না।

আরেকটি বিকল্প হ'ল নিজেই অনুকূলিতকরণ করা এবং একটি কেস পরিষ্কারভাবে পরীক্ষা করা থেকে সরিয়ে দেওয়া:

if instruction(15 downto 8) = "11111001" then
  write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 4)), 16));
else
  write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 0)), 16));
end if;

যদিও এর উল্লেখযোগ্য অসুবিধাগুলি রয়েছে (বেশিরভাগ কোডের স্পষ্টতার সাথে সম্পর্কিত), এবং আমি সম্ভবত আরও আদর্শ সমাধান বেছে নেব।

ঘটনাচক্রে, '-'সাধারণত এটির সাথেও ব্যবহৃত হয় std_match(), যা আমি আপনার ডিকোডিংয়ের জন্য ব্যবহার বিবেচনা করব, যেমন:

if std_match(instruction(15 downto 8), "1100----") then

যদিও এই মুহুর্তে, আপনি কেবল ব্যবহার করা ভাল case?


6

সংক্ষেপে: এটি আইনী ভিএইচডিএল এবং এটি সাধারণত সংশ্লেষণ সরঞ্জামগুলি দ্বারা সমর্থিত।

এটি ব্যবহার করা দেখতে বরং অস্বাভাবিক is আমি জানি না কেন। আপনার কোডটি এটি কখন ব্যবহার করা অর্থবহ হবে তার একটি উত্তম উদাহরণ বলে মনে হচ্ছে।

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

সরঞ্জাম সমর্থন

কমপক্ষে নিম্নলিখিত সরঞ্জামগুলি যত্ন নেবে না এবং অপ্টিমাইজেশন সম্ভাবনাগুলি ব্যবহার করবে না:

  • জিলিনেক্স (রেফারেন্স: "এক্সএসটি ব্যবহারকারী গাইড")
  • আলটিরা (রেফারেন্স: "প্রস্তাবিত এইচডিএল কোডিং স্টাইলগুলি")
  • Synplify (রেফ: "Synplify রেফারেন্স ম্যানুয়াল")

জিলিনেক্স এবং আল্টেরা চিকিত্সা করবে '-'এবং 'X'যেমন যত্ন করে না, Synplify তাদের এবং ততোধিক 'U'এবং 'W'(দুর্বল) যত্ন না হিসাবে চিকিত্সা করবে ।


1
আমার সেই অপূর্ণতার আরেকটি প্রয়োগ ছিল। কোড সিমুলেশন কাজ, কিন্তু না FPGA উপর, কারণ আমার কোড মতো লাগছিল: if signal = '1' then a; else b; end if;। দুর্ভাগ্যক্রমে signalছিল না 1বা 0কিন্তু -। অনুকরণে, elseশাখাটি কার্যকর করা হয়েছিল, তবে হার্ডওয়্যারে -পরিণত হয়েছে এটি 1, তাই সত্য শাখাটি কার্যকর করা হয়েছিল ...
ফ্রেটজ

হ্যাঁ, আমি অনুরূপ বাগ সিমুলেশন পাস করেছি, তবে বেশিরভাগ ক্ষেত্রে আমার ক্ষেত্রে 'U'সিমুলেশনের শুরুতে সাধারণ গুলি থাকে যা কিছু elseকোড ব্লক কার্যকর করার জন্য ব্যবহৃত হয় uted এটি চমত্কার হবে যদি শর্তসাপেক্ষে একরকম বংশ প্রচারের 'U'আচরণের মতো একইভাবে প্রচার করতে পারে ।
কার্ল

আমি যে বাগটি পেয়েছি তার পরে আমি সর্বদা এমন কিছু লিখতে নিশ্চিত করেছিলাম if signal = '1' then output <= '1'; elsif signal='0' then output <= '0'; else output <= '-'; end if;। এবং আমি সমস্ত নিবন্ধ এবং স্মৃতিতে নিম্নলিখিতগুলি যুক্ত করেছি: assert not is_X(write_enable) report "we=" & str(A_write_enable) severity ERROR;এবং if write_enable = '1' then assert not is_X(write_addr) report "write_addr=str(write_addr) severity ERROR; end if;। প্লাস একই জন্য write_data। একসাথে, এটি প্রায় এই সমস্ত ত্রুটি ধরা উচিত।
ফ্রিটজ

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

1
আচ্ছা হ্যাঁ, ভিএইচডিএল কিছুটা ভার্বোজ, তবে এটি কেবল ভিএইচডিএল উপায়। : ডি অন্যদিকে এটিও খুব স্পষ্ট, এবং আমার পিঠের পিছনে "কালো যাদু" করেন না, যা আমি বেশ সুন্দর দেখতে পাই (সিএফ। পাইথনের জেন "স্পষ্টিকর চেয়ে সুস্পষ্ট")।
ফ্রিটজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.