Xilinx FPGA都有一個獨特的 ID ,也就是 Device DNA ,這個 ID 相當於我們的身份證,在 FPGA 芯片生產的時候就已經固定在芯片的 eFuse 寄存器中,具有不可修改的屬性。
在xilinx 7series 和 7series 以前,ID 都是 57bit 的,但是在 Xilinx 的 Ultraslace 架構下是 96bit 。
獲取 Device DNA
JTAG獲取
Vivado 中通過 JTAG 查看 DNA PORT信息。
Primitive 獲取
Xilinx 的提供的 DNA_PORT Primitive模型和時序圖如下
7系列(A7/K7/Z7/V7)的FPGA使用如下原語
DNA_PORT #(
.SIM_DNA_VALUE(57'h000000000000000) // Specifies a sample 57-bit DNA value for simulation
)
DNA_PORT_inst (
.DOUT(DOUT), // 1-bit output: DNA output data.
.CLK(CLK), // 1-bit input: Clock input.
.DIN(DIN), // 1-bit input: User data input pin.
.READ(READ), // 1-bit input: Active high load DNA, active low read input.
.SHIFT(SHIFT) // 1-bit input: Active high shift enable input.
);
Ultraslace系列(VU+/VU/KU+/KU)的FPGA使用如下原語
DNA_PORTE2 #(
.SIM_DNA_VALUE(96'h000000000000000000000000) // Specifies a sample 96-bit DNA value for simulation
)
DNA_PORTE2_inst (
.DOUT(DOUT), // 1-bit output: DNA output data
.CLK(CLK), // 1-bit input: Clock input
.DIN(DIN), // 1-bit input: User data input pin
.READ(READ), // 1-bit input: Active-High load DNA, active-Low read input
.SHIFT(SHIFT) // 1-bit input: Active-High shift enable input
);
仿真
仿真程序如下所示(小編使用 7 系列FPGA)
module DNA_capture(
input sys_clk,
input dna_rdy,
output [56:0] dna_data,
output dna_valid
);
wire dna_dout;
wire dna_read;
wire dna_shift;
reg [56:0] dna_reg = 0;
reg [7:0] dna_cnt = 0;
DNA_PORT #(
.SIM_DNA_VALUE(57'h123456789abcdef) // Specifies a sample 57-bit DNA value for simulation
)
DNA_PORT_inst (
.DOUT(dna_dout), // 1-bit output: DNA output data.
.CLK(sys_clk), // 1-bit input: Clock input.
.DIN(1'b0), // 1-bit input: User data input pin.
.READ(dna_read), // 1-bit input: Active high load DNA, active low read input.
.SHIFT(dna_shift) // 1-bit input: Active high shift enable input.
);
always@(posedge sys_clk)
if(dna_rdy)begin
if(dna_cnt == 7'd103)
dna_cnt <= dna_cnt;
else
dna_cnt <= dna_cnt + 1'b1;
end
assign dna_read = dna_cnt == 8'd20;
//
assign dna_shift = (dna_cnt >= 8'd45) && (dna_cnt <= (8'd45+8'd57-1));
always @ (posedge sys_clk)
begin
if(dna_shift)begin
dna_reg[56:0] <= {dna_reg[55:0],dna_dout};
end
end
assign dna_data = dna_reg;
assign dna_valid = dna_cnt == (8'd45+8'd57-1);
endmodule
實現
小編所使用開發板為zc7035,讀出該芯片的DNA為如下所示,與JTAG讀出一致。
那么 DNA 到底在芯片什么位置呢?
應用
情景1
用戶在邏輯上可以通過特定的接口把這個 Device DNA 讀取出來,經過一系列加密算法之后和預先在外部 Flash 存儲的一串加密后的字節串做比較,這個 flash 存儲的加密后的字節串也是由該DNA經過加密后得到,FPGA 加載程序后可以先從FPGA 讀出該段字節做比較,如果相同,則讓 FPGA 啟動相應的邏輯,如不同,則代表該FPGA沒有經過用戶授權,用戶邏輯上可以關閉FPGA的邏輯功能甚至可以通過一些手段讓硬件損壞。流程如下:
-
器件上電,加載程序,進行FPGA配置。
-
讀取FPGA DNA,並將其發送給加密算法。
-
加密算法生成有效的結果。
-
比較結果和存儲的校驗值,如果結果和存儲的校驗值相同,則程序可以正常運行。否則,禁止程序運行,或設置定時炸彈,破壞外部設備。
情景2
開發項目需雙方公司協作過程中,經常會出現 A 公司向 B 公司申請工程源碼。然而工程源碼中存在商業價值高或保密性較高的軟核部分。傳統的代碼加密機制如 ngc, edif, dcp 等封裝,ip 封裝很難做到將原核保護的作用。A 公司仍然可以拿到 B 公司工程源碼中的高價值軟核,雖然無法知道軟核的內部結構,但是參考外部接口及源碼中的邏輯即可知道其操作用法,將軟核復制,應用於自身公司的其他產品中。在商業競爭過程中,這是十分不利於 B 公司的情況。
所以在所有的高商業價值的軟核或者 dcp 模塊中,再進行封裝一層 DNA 授權小功能塊,該模塊的功能為檢測 FPGA DNA 號,與授權的 DNA 號進行對比,兩者一致后生成授權標志信號,邏輯可以利用此標志信號做到代碼只有在授權時才能正常工作的情況。由於每片 FPGA 的 DNA 號具有唯一性和不可更改性,將該模塊封裝后外部無修改接口,做到用戶即使拿到功能源碼,里面的內核也不可復制到其他 FPGA 上運行,以達到保護知識產權的作用。
參考鏈接
- 關於 Xilinx-FPGA 的 DNA 的使用場景和讀取方法
https://blog.csdn.net/ladywn/article/details/84393123
- Xilinx FPGA的程序加密方法
http://xilinx.eetrend.com/d6-xilinx/article/2018-03/12713.html