লজিক ডিজাইনের কোর্সে আমরা সকলেই শিখেছি যে লজিক ফাংশনটি ন্যূনতম করা সম্ভব, উদাহরণস্বরূপ একটি কর্নো ম্যাপ বা কুইন – ম্যাকক্লুসকি অ্যালগোরিদম ব্যবহার করে । আমরা এও শিখেছি যে " ডোন কেয়ার" মানগুলি হ্রাস করার সম্ভাবনা বাড়িয়ে তোলে।
উদাহরণস্বরূপ একটি রেজিস্টার ফাইল নিন। write_address
এবং write_data
সংকেত সত্যিই কোন ব্যাপার না তখন write_enable
সংকেত '0'
। সুতরাং, এই সংকেতগুলি চালিত করছে এমন যুক্তিতে আরও অনুকূলিতকরণের জন্য তাদের ( "যত্ন নেই" মান নির্ধারণ করা উচিত (অর্থাত্ রেজিস্টার ফাইলটিতে নয়)।
সম্ভাব্য অপ্টিমাইজেশনের জন্য সংশ্লেষণের সরঞ্জামকে আরও জায়গা দেওয়ার জন্য ভিএইচডিএলে এই জাতীয় "যত্ন করবেন না" মানগুলি নির্দিষ্ট করার সঠিক উপায় কী?
এখনও অবধি আমি নীচের জিনিসগুলি খুঁজে পেয়েছি যা উপযুক্ত হতে পারে। তবে আমি নিশ্চিত না যে প্রতিটি পদ্ধতির উপকারিতা এবং বিপরীতগুলি কী:
- কেবল সংকেত বরাদ্দ করা হচ্ছে না। দেখে মনে হচ্ছে এটি কাজ করতে পারে। তবে আমি দেখতে পেয়েছি যে আপনি যখন কোনও
record
ধরণের "ধ্রুবক কিছু না করেন" সংজ্ঞায়িত করতে চান তখন এটি কাজ করে না , কারণ রেকর্ড ধ্রুবকগুলি সম্পূর্ণরূপে নির্দিষ্ট করা দরকার (কমপক্ষে মডেলসিম আমাকে তাই বলে)। std_logic_1164
প্যাকেজ মূল্য নির্ধারণ'-' -- Don't care
জন্যstd_ulogic
। এটিকে দেখে মনে হচ্ছে এটি স্পষ্ট "যত্নশীল নয়" এর জন্য শব্দার্থগতভাবে সঠিক পছন্দ, তবে আমি এটি কোথাও কখনও ব্যবহার করতে দেখিনি (সম্পর্কিত সম্পর্কযুক্ত ভিএইচডিএল -2008 এরcase?
নির্মাণ ব্যতীত)।- মডেলসিম নির্ধারিত
'X'
সংকেত প্রদর্শনের জন্য মানটি ব্যবহার করে । তবে আমি নিশ্চিত নই যে সংশ্লেষের সরঞ্জামগুলি একটি'X'
" স্পষ্ট করে না" হিসাবে একটি স্পষ্ট- নির্ধারিত বিষয়টি বোঝে ।
এখানে স্পষ্টকরণের জন্য একটি ওভারসিম্প্লিফাইড কোড স্নিপেট রয়েছে, যেখানে আমি যত্নের সাথে সংকেতগুলি না দিয়ে ইনিশিয়েল করেছি '-'
।
যেহেতু আপনি দেখতে পারেন, সিগন্যাল control.reg_write_address
3 এর মান আলাদা করতে পারেন: "----"
, 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
কী করার চেষ্টা করছেন তার বিশদটি বলতে পারেন ? আপনি কোন অপ্টিমাইজেশন হওয়ার আশা করছেন?