ユーザー定義属性

p.236

インバーターを4つ直列につないだ回路を作る。LEを4個消費した。

entity delay_line is
    port(
        x : in  bit;
        y : out bit
    );
end entity;

architecture rtl of delay_line is
   -- a, b, cという名前の信号を中間ノードの信号をとして宣言して、
    signal a, b, c : bit;
    
   -- keepという名前の属性を宣言して、
    attribute keep : boolean;
    
   -- その属性を信号a, b, cに割り当てる。
    attribute keep of a, b, c : signal is true;
begin
    a <= not x;
    b <= not a;
    c <= not b;
    y <= not c;
end architecture;

RTLビュー:
f:id:ti-nspire:20210405110125p:plain:w500

ためしに上のkeep属性の定義を外してみる。途中のゲートが最適化されて消えた。消費したLEは1個であった。

entity delay_line is
    port(
        x : in  bit;
        y : out bit
    );
end entity;

architecture rtl of delay_line is
   -- a, b, cという名前の信号を中間ノードの信号をとして宣言して、
    signal a, b, c : bit;
    /*
   -- keepという名前の属性を宣言して、
   attribute keep : boolean;
   
   -- その属性を信号a, b, cに割り当てる。
   attribute keep of a, b, c : signal is true;
   */
begin
    a <= not x;
    b <= not a;
    c <= not b;
    y <= not c;
end architecture;

RTLビュー:
f:id:ti-nspire:20210405110351p:plain