製品を作る際に、ユーザがカスタマイズできるようにしたいけれども、FPGAのソースコードを公開したくないという場合があります。
そんな場合、どうすればよいでしょうか。ISEのころは、EDIFのネットリストで配ったり難読化を施したコードを配ったりすることもあったと思います。
VivadoではIEEE-1735という暗号化の方法がサポートされています。IEEE-1735を使うとVivadoの公開鍵であなたのソースコードを暗号化し、Vivadoでしかそれを解読できないので、秘密を守ることができるようになります。
やり方を説明します。
① https://japan.xilinx.com/support/answers/68071.htmlのページを参考に、ライセンスが欲しい旨を英語でメールします。しばらくすると、ライセンスが追加された旨のメールが送られてくるので、XILINXのライセンスサイトに行きます。
すると、1735のライセンスが使えるようになっているので、Createします。
② ライセンスを生成するとメールでlicファイルが送られてくるので、これをVivadoに取り込みます。
これでVivadoで暗号化ができるようになります。
③ Vivadoのプロジェクトを作り、暗号化したいソースを作ります。
ここではD:/enctest/project_1/というフォルダにプロジェクトを作ります。
以下は暗号化させたいソースファイルの例です。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity led is
Port ( clk_ip : in std_logic;
din : in STD_LOGIC_VECTOR(3 downto 0);
dout : out STD_LOGIC_VECTOR(3 downto 0));
end led;
architecture Behavioral of led is
begin
process(clk_ip) begin
if(clk_ip'event and clk_ip = '1') then
case din is
when x"0" =>
dout <= "1000";
when x"1" =>
dout <= "0100";
when x"2" =>
dout <= "0010";
when x"3" =>
dout <= "0001";
when others =>
dout <= "0000";
end case;
end if;
end process;
end Behavioral;
④ Keyファイルを作ります。
`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2017"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxngMPQrDv/s/Rz/ED4Ri
j3tGzeObw/Topab4sl+WDRl/up6SWpAfcgdqb2jvLontfkiQS2xnGoq/Ye0JJEp2
h0NYydCB5GtcEBEe+2n5YJxgiHJ5fGaPguuM6pMX2GcBfKpp3dg8hA/KVTGwvX6a
L4ThrFgEyCSRe2zVd4DpayOre1LZlFVO8X207BNIJD29reTGSFzj5fbVsHSyRpPl
kmOpFQiXMjqOtYFAwI9LyVEJpfx2B6GxwA+5zrGC/ZptmaTTj1a3Z815q1GUZu1A
dpBK2uY9B4wXer6M8yKeqGX0uxDAOW1zh7tvzBysCJoWkZD39OJJWaoaddvhq6HU
MwIDAQAB
`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock = ""
中央にある公開鍵の部分(緑色の部分)は、Vivadoをインストールしたフォルダの Vivado\2018.1\data\pubkey にあります。
protect controlの部分は、暗号化したコアがユーザにどのようなアクセスを許可するかを指定します。
- xilinx_configuration_visible・・・VivadoビューワーでLUT値を表示できるかどうかを設定します。
- xilinx_enable_modification・・・Vivadoツールで、保護領域内の情報を変更できるかどうかを設定します。
- xilinx_enable_probing・・・Vivadoデバッグプローブを保護領域内に挿入できるかどうかを設定します。
- xilinx_enable_netlist_export・・・保護領域のネットリストをエクスポートできるかどうかを指定します。
- xilinx_enable_bitstream・・・Vivadoでビットストリームを生成できるようにします。
例えば、ビットストリームの生成を不可にすると、Generate Bitstreamで以下のようなエラーが出ます。
⑤ VivadoのTclコンソールで以下のコマンドを打つ
cd D:/enctest/project_1/src/
encrypt -key keyfile.txt -ext .vhdp -lang vhd led.vhd
こうすると、led.vhdからled.vhdpが生成されます。.vhdpの内容は以下のようになります。
`protect begin_protected
`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2015"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_block
pdjNjyoCm2WBMs0KG3Q+ePaDB6ARbd7Y7H3A26a55OOdnew+1OzTUK2k96Ntxukr+wj/aCI2W080
iHpbvKfzLLHduvQ2c1dY3pwuILRpF/YrHydz3MK+Z2IVWvREP/HYxv29SL9MCchFczqEoILOZLfP
PqBHW8jMADoKFmexdPzUm3dx10P1hOGMQ5/4Twzq9dj1Ff3x0QHNcDwsuPj1ed1DXdXP9LAUlWAa
MSTo8PBOP9BHKipCYhrDYSWJqXrAqFtdwzMyixefO7cSleSt4QYoZ6wXS3cgV7hfxtgjsD+C2eu8
RnTUg7kB/iZJT93cNeLAopn9eFLt6Mo9mu1lMw==
`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock="Gvz94Xjb16LqWZIuHZl19gXgAJUP/A9Ayg7PWzSp71Q="
`protect data_method = "AES128-CBC"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 464)
`protect data_block
vZGEdHA8Zx5d5yGCb7CGj0ZiCC7CbVudUtULGxqOfj8l+1wRnXKQ4uevKFe6wrMj+P8OXGSBZrl4
VPAnc7iJAC5jXR7TwXtDbO9YzXA8d6sPl2PEb9W/gdLZSEoPqcLfi7oG0pxYaSXzSur2BN9LDYX8
jTYhPDwhPQqOEUwDpmxHxYTqIo+lJEKGOkJDE/Gh2VQ1pZnP1huOVn6MD60nZRZ0CnNL2+zFtf8z
BggLumqLrIY+4yWGI/qLgeDL9zo/COv/AWBmJsb9oCRmBrEcPKOS86jX8nmVejTTuQJwxDId2h2p
w+tj7NFlIF3ay1x26G8UVrQvxxtUsqsfgj+IZ1hIiBr7b6Ae11p2zSKRzW9dQTW5nc1E6C7DzqlJ
6eTAnJ29y9AhU/zH4Q1WBVHlutg0wAANMIwEEjLH+9ZicjzZQBpIwG3A65e1ylAnLw8mCP6aeXTt
cSM2Mwfx+GSWOaJCaymED+E1w6qGw6efC2vdeTzIuedN2ejxDGG45uNzW8zhZGrb/oFToDwh2NaB
CAy3AXRgadtedUPE/mt9Jq0MXqDqh1aHv5e3x8Ebqbiq6tQsI8jUi7BhWis9fSG7kVP2jDTB257q
NX/VL7bljOo=
`protect end_protected
この最後にあるprotect data_block~protect end_protectedの間の暗号化された部分が、元のled.vhdに相当します。
このled.vhdは、人間が読んでもわかりませんが、Vivadoには元のled.vhdを復元できるので、論理合成できるというわけです。
⑥ ラッパを作る
上で暗号化した、led.vhd→led.vhdpは暗号化されていて使いにくいので、led_wrap.vhdというラッパを作ります。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity led_wrap is
Port ( clk_ip : in std_logic;
din : in STD_LOGIC_VECTOR(3 downto 0);
dout : out STD_LOGIC_VECTOR(3 downto 0));
end led_wrap;
architecture Behavioral of led_wrap is
component led
Port ( clk_ip : in std_logic;
din : in STD_LOGIC_VECTOR(3 downto 0);
dout : out STD_LOGIC_VECTOR(3 downto 0));
end component;
begin
u0 : led
port map( clk_ip => clk_ip, din => din, dout => dout );
end Behavioral;
これで論理合成すれば、led.vhdが暗号化されたIPとなって、無事に回路が合成されます。
いかがでしたでしょうか?
意外と簡単だったと思います。
ポイントは、
- 暗号化ライセンスを取得してVivadoに機能追加する
- keyファイルを作り、ユーザに与えたい権限を設定し、tclコマンドでVHDLファイルを暗号化する
- vhdpファイルは、人間には読めないが、ツールにはVHDLと同じように使用可能
このような手順で、貴方のつくった回路の秘密が守られるので、ぜひ試してみてください。
最近のコメント