একটি ভিএইচডিএল সাক্ষাত্কার প্রশ্নের ফলে কিছু ভিএইচডিএল কোডের ফলাফল হওয়া উচিত।
ডেভ টোয়েডের রাষ্ট্রীয় রূপান্তর সারণীর বাস্তবায়নের সাথে একটি গডল এলএলভিএম ব্যাকএন্ড বাগটি সন্ধান করার সুযোগ পেয়েছিলাম যেখানে ডিএইচডিএল এর লেখক একটি ফাংশনটিতে 17 টি লাইনে প্রয়োগটি নিঃশেষ করেছিলেন:
type remains is (r0, r1, r2, r3, r4); -- remainder values
function mod5 (dividend: bit_vector) return boolean is
type remain_array is array (NBITS downto 0) of remains;
type branch is array (remains, bit) of remains;
constant br_table: branch := ( r0 => ('0' => r0, '1' => r1),
r1 => ('0' => r2, '1' => r3),
r2 => ('0' => r4, '1' => r0),
r3 => ('0' => r1, '1' => r2),
r4 => ('0' => r3, '1' => r4)
);
variable remaind: remains := r0;
variable tbit: bit_vector (NBITS - 1 downto 0) := dividend;
begin
for i in dividend'length - 1 downto 0 loop
remaind := br_table(remaind,tbit(i));
end loop;
return remaind = r0;
end function;
সম্পর্কিত পরীক্ষার কেসটি খুব সহজেই সহজ ডিবাগিংয়ের অনুমতি দেয় এবং এনুম্যারেটেড প্রকারের মধ্যে VHDL এর সাথে সামঞ্জস্যপূর্ণ রাষ্ট্রের নাম ব্যবহার করে:
(দিয়া দিয়ে তৈরি)
এখানে ধারণাটি হ'ল ফাংশনটি (বা 27 লাইনের একটি উদাহরণ ভিএইচডিএল প্রোগ্রাম) একটি সাক্ষাত্কারের সময় কোনও ভিএইচডিএল উত্তর লেখার পক্ষে যথেষ্ট কম। জ্ঞান এবং দক্ষতা উভয়ই প্রদর্শনের জন্য একটি সাক্ষাত্কারের প্রশ্নটি নষ্ট করার বিষয়ে চিন্তা করার দরকার নেই, একজন ইন্টারভিউয়ের কাছে জিজ্ঞাসা করা হলে একটি বাস্তবায়ন রক্ষার জন্য আশা করা হবে।
( Llvm ব্যাকএন্ড বাগটি কমিট 1f5df6e এ স্থির করা হয়েছে আজ আগে ))
নোটের জিনিসগুলির মধ্যে একটি হ'ল রাষ্ট্রের রূপান্তর টেবিলটি আমাদের জানিয়েছে যে লভ্যাংশ থেকে ৫ টি বিয়োগের সময় একটি নিম্ন বিস্মরণকৃত মান (বা আর 4-র জন্য উভয় ট্রানজিশন) দ্বারা একটি রাজ্যে স্থানান্তর দ্বারা দেখানো হবে যেখানে 'বিট' বিট হবে '1'। এটি একটি পৃথক সারণিতে এনকোড করা যেতে পারে (বা রেকর্ড টাইপের একটি টেবিল যা অসুবিধাজনক মনে হয়)। আমরা historতিহাসিকভাবে গ্রাফিক্স হার্ডওয়্যারে অনুভূমিক স্ক্রিন রেজোলিউশনগুলির সাথে ডিল করি যা 5 পিক্সেলের গুণিত হয়।
এটি করা আমাদের একটি ডিভ / মোড 5 দেয় যা একটি ভাগফল এবং বাকী অংশ উত্পাদন করে:
library ieee;
use ieee.std_logic_1164.all;
entity divmod5 is
generic (
NBITS: natural := 13
);
port (
clk: in std_logic;
dividend: in std_logic_vector (NBITS - 1 downto 0);
load: in std_logic;
quotient: out std_logic_vector (NBITS - 3 downto 0);
remainder: out std_logic_vector (2 downto 0);
remzero: out std_logic
);
end entity;
architecture foo of divmod5 is
type remains is (r0, r1, r2, r3, r4); -- remainder values
type remain_array is array (NBITS downto 0) of remains;
signal remaindr: remain_array := (others => r0);
signal dividendreg: std_logic_vector (NBITS - 1 downto 0);
signal quot: std_logic_vector (NBITS - 3 downto 0);
begin
parallel:
for i in NBITS - 1 downto 0 generate
type branch is array (remains, bit) of remains;
-- Dave Tweeds state transition table:
constant br_table: branch := ( r0 => ('0' => r0, '1' => r1),
r1 => ('0' => r2, '1' => r3),
r2 => ('0' => r4, '1' => r0),
r3 => ('0' => r1, '1' => r2),
r4 => ('0' => r3, '1' => r4)
);
type qt is array (remains, bit) of std_ulogic;
-- Generate quotient bits from Dave Tweeds state machine using q_table.
-- A '1' when a remainder goes to a lower remainder or for both branches
-- of r4. A '0' for all other branches.
constant q_table: qt := ( r0 => (others => '0'),
r1 => (others => '0'),
r2 => ('0' => '0', '1' => '1'),
r3 => (others => '1'),
r4 => (others => '1')
);
signal tbit: bit;
begin
tbit <= to_bit(dividendreg(i));
remaindr(i) <= br_table(remaindr(i + 1),tbit);
do_quotient:
if i < quot'length generate
quot(i) <= q_table(remaindr(i + 1),tbit);
end generate;
end generate;
dividend_reg:
process (clk)
begin
if rising_edge(clk) then
if load = '1' then
dividendreg <= dividend;
end if;
end if;
end process;
quotient_reg:
process (clk)
begin
if rising_edge (clk) then
quotient <= quot;
end if;
end process;
remainders:
process (clk)
begin
if rising_edge(clk) then
remzero <= '0';
case remaindr(0) is
when r0 =>
remainder <= "000";
remzero <= '1';
when r1 =>
remainder <= "001";
when r2 =>
remainder <= "010";
when r3 =>
remainder <= "011";
when r4 =>
remainder <= "100";
end case;
end if;
end process;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity divmod5_tb is
end entity;
architecture foo of divmod5_tb is
constant NBITS: integer range 0 to 13 := 8;
signal clk: std_logic := '0';
signal dividend: std_logic_vector (NBITS - 1 downto 0);
signal load: std_logic := '0';
signal quotient: std_logic_vector (NBITS - 3 downto 0);
signal remainder: std_logic_vector (2 downto 0);
signal remzero: std_logic;
signal psample: std_ulogic;
signal sample: std_ulogic;
signal done: boolean;
begin
DUT:
entity work.divmod5
generic map (NBITS)
port map (
clk => clk,
dividend => dividend,
load => load,
quotient => quotient,
remainder => remainder,
remzero => remzero
);
CLOCK:
process
begin
wait for 5 ns;
clk <= not clk;
if done'delayed(30 ns) then
wait;
end if;
end process;
STIMULI:
process
begin
for i in 0 to 2 ** NBITS - 1 loop
wait for 10 ns;
dividend <= std_logic_vector(to_unsigned(i,NBITS));
wait for 10 ns;
load <= '1';
wait for 10 ns;
load <= '0';
end loop;
wait for 15 ns;
done <= true;
wait;
end process;
SAMPLER:
process (clk)
begin
if rising_edge(clk) then
psample <= load;
sample <= psample after 4 ns;
end if;
end process;
MONITOR:
process (sample)
variable i: integer;
variable div5: integer;
variable rem5: integer;
begin
if rising_edge (sample) then
i := to_integer(unsigned(dividend));
div5 := i / 5;
assert div5 = unsigned(quotient)
report LF & HT &
"i = " & integer'image(i) &
" div 5 expected " & integer'image(div5) &
" got " & integer'image(to_integer(unsigned(quotient)))
SEVERITY ERROR;
rem5 := i mod 5;
assert rem5 = unsigned(remainder)
report LF & HT &
"i = " & integer'image(i) &
" rem 5 expected " & integer'image(rem5) &
" got " & integer'image(to_integer(unsigned(remainder)))
SEVERITY ERROR;
end if;
end process;
end architecture;
জেনারেট স্টেটমেন্ট দিয়ে এখানে প্রয়োগ করা হয়েছে, কোটেন্ট বিট উত্পাদনকারী একটি অভ্যন্তরীণ জেনারেট স্টেটমেন্ট। বাকী রেকর্ডার অ্যারে একটি রাষ্ট্রের স্থানান্তর ট্রেস সরবরাহ করে:
একটি গাণিতিক অপারেশন ছাড়া সব।
মোড আউট পরামিতিগুলির সুযোগ না নিলে সমস্ত রেজিস্টার ছাড়াই কোনও পদ্ধতিতে এটি প্রয়োগ করাও সম্ভব। এটি একটি সাক্ষাত্কারের জন্য ন্যূনতম সংখ্যক লাইনের কাছে যেতে চাই।
একটি ক্লকড ক্রমিক ক্রিয়াকলাপের জন্য কিছুটা পাল্টা এবং প্রবাহ নিয়ন্ত্রণের প্রয়োজন হবে (জে জে ফ্লিপ ফ্লপ এবং কয়েকটি গেট)।
লভ্যাংশের আকারের উপর নির্ভর করে একটি সময় / জটিলতা বাণিজ্য বন্ধ রয়েছে যা আপনাকে সম্ভবত কোনও সাক্ষাত্কারে রক্ষা করতে হবে।