信号の保持

[] [] []


RTL記述に書いた信号(wire変数)は、論理合成したネットリスト中に対応する信号が存在するとはかぎらないが、特定の信号を保持したい場合は合成制約keepwire変数に指定す

制約

QuartusII

XST

Vivado

信号の保持

syn_keep=1

keep="true"

keep="true"

dont_touch="true"とすると

合成だけでなく配置配線でも

効く

(1) ディレイライン

FPGAの出力信号に遅延をつけたいときはインバータを何段も直列につなげばよいが、そのままでは冗長な回路として削除されてしまうので、次のように書けばよい。

// ディレイライン

(* syn_keep=1 *) wire[10:0] d_dly;

(* syn_keep=1 *) wire[10:0] d_inv;

assign d_inv[9:0] = ~d_ dly[9:0];

assign d_dly[10:0] = ~{d_inv[9:0],d_reg};

インバータでディレイラインを作る方法は配置配線によって遅延が変わるので精度はよくない。FPGAならばPLLDCMでクロックを遅延させる方が精度がよいが、簡易的にディレイラインが欲しいときにはこういう方法もある。

(2) 非同期バスのアドレスデコード

イネーブル=1の期間のみアドレスが有効というインターフェイス仕様のとき、次のように書いてしまうとイネーブル=0の期間でもアドレスが変化するタイミングでハザードが出る可能性がある。

always @(posedge clk or posedge rst)

    begin

    if(rst)

        hit_reg <= 1'b0;

    else

        hit_reg <= (enable & (address[23:16]==8'h15))? 1'b1:1'b0;

    end

そこで確実にイネーブル信号でANDをとるには次のように書けばよい。

(* syn_keep=1 *) wire match;

assign match = (address[23:16]==8'h15);

always @(posedge clk or posedge rst)

    begin

    if(rst)

        hit_reg <= 1'b0;

    else

        hit_reg <= (enable & match)? 1'b1:1'b0;

    end


[] [] []