隨著設(shè)計(jì)需求的不斷復(fù)雜化,設(shè)計(jì)工程規(guī)模的越來越大,整個(gè)設(shè)計(jì)會(huì)分給多個(gè)人,甚至多組人來協(xié)同開發(fā)。每個(gè)部分由擅長(zhǎng)的人來處理。
如果一個(gè)設(shè)計(jì)是由多個(gè)組/公司來協(xié)同完成的,通常會(huì)引入一個(gè)新問題:知識(shí)版權(quán)的保護(hù)。有些創(chuàng)新的設(shè)計(jì)方案并不想讓對(duì)方簡(jiǎn)單獲取。這樣,就有對(duì)原始設(shè)計(jì)進(jìn)行保護(hù)的一些方案。
還有一種情況是,整個(gè)FPGA設(shè)計(jì)都由一個(gè)組來進(jìn)行設(shè)計(jì),但是不希望硬件層面上被簡(jiǎn)單復(fù)制(防止抄板),所以對(duì)整個(gè)FPGA的設(shè)計(jì)及交付的配置鏡像,也需要一些保護(hù)方案。
文本簡(jiǎn)單討論一下相關(guān)的保護(hù)方案。請(qǐng)注意,沒有一種方案可以百分之百保護(hù)設(shè)計(jì)的安全。大部分方案只是提高破解成本。當(dāng)破解成本比較高的時(shí)候就足夠了。
關(guān)于子模塊的方案保護(hù)
這種情況常見于兩組(或者更多組)協(xié)同開發(fā)一個(gè)工程,其中一組設(shè)計(jì)一個(gè)子模塊,并將設(shè)計(jì)交予另一組進(jìn)行系統(tǒng)集成,同時(shí)不希望系統(tǒng)集成的人員獲取原始設(shè)計(jì)思路。
這種情況最常見的方案就是IP。FPGA的EDA工具ISE、Vivado和Quartus都提供了大量IP,其中的不少IP都是不提供底層源碼的。用戶可以使用但是并不能獲取原始設(shè)計(jì)。
比較常見的做法是提供綜合后的網(wǎng)表。ISE使用綜合后的ngc文件,Vivado的網(wǎng)表文件都是dcp文件。Quartus中使用過qxb和qdb文件。另外Vivado也是支持通用的EDIF格式文件,Quartus沒有確認(rèn)過,不過道理上應(yīng)該也是支持EDIF的。
Vivado dcp文件就是一個(gè)zip壓縮包
使用網(wǎng)表就可以正常進(jìn)行布局布線。優(yōu)點(diǎn)是制作/提供網(wǎng)表的操作上手方便,使用簡(jiǎn)單。弊端是:
1.不方便調(diào)式,尤其是不方便在系統(tǒng)集成時(shí)使用嵌入式邏輯分析儀;
2.如果時(shí)序有問題,不容易做優(yōu)化;
不過使用IP、網(wǎng)表和其他原設(shè)計(jì)保護(hù)方案都有這個(gè)問題,所以算是通病,也沒有很好的辦法解決。
使用網(wǎng)表的另一個(gè)問題是無法仿真,尤其是ngc/dcp這樣EDA工具自己定義的網(wǎng)表格式。IP內(nèi)部除了包含網(wǎng)表文件還有仿真需要的文件。綜合/布局布線時(shí)使用對(duì)應(yīng)的網(wǎng)表,仿真時(shí)使用仿真專用的文件/網(wǎng)表。所以單單提供網(wǎng)表,對(duì)仿真是個(gè)大問題。如果有額外的人力,可以提供相關(guān)仿真文件。但是為了保證網(wǎng)表和仿真文件行為一致,并且需要依據(jù)項(xiàng)目的進(jìn)度進(jìn)行網(wǎng)表文件與仿真文件的同步更新,這個(gè)工作量并不小。通常只有專業(yè)的團(tuán)隊(duì),才會(huì)有足夠的人員來做這件事情。
這其實(shí)也就是版本管理的困難,當(dāng)版本中的文件越來越多,版本管理的難度就越來越來。通常子模塊的設(shè)計(jì)團(tuán)隊(duì)都很難有足夠的人力/時(shí)間來很好的處理可綜合設(shè)計(jì)和不可綜合的仿真版本之間的版本管理。這里需要注意的是
仿真版本設(shè)計(jì)的難度并不比可綜合設(shè)計(jì)簡(jiǎn)單。
1.如果簡(jiǎn)單的提供可綜合版本的源代碼,則無法起到保護(hù)原始設(shè)計(jì)的作用。
2.如果使用加密或者仿真工具支持的非源代碼格式,首先要保證仿真工具支持這個(gè)功能,其次綁定了工具對(duì)版本管理也是增加了負(fù)擔(dān)。
3.比較常用的方法是使用不可綜合的仿真代碼來實(shí)現(xiàn)一樣的功能。這就需要較為復(fù)雜的設(shè)計(jì)。代碼中要盡量做到不涉及原始設(shè)計(jì)思路,等于是要徹底換一個(gè)思路來設(shè)計(jì)一樣的東西,而且還要盡量做到難看懂。
還有一種做法就是用C語(yǔ)言實(shí)現(xiàn)功能,然后用Verilog和C語(yǔ)言的接口來實(shí)現(xiàn)仿真。這樣核心功能是C語(yǔ)言實(shí)現(xiàn)的,自然保證了無法綜合。同時(shí),軟件語(yǔ)言也更加容易做到無法獲取原始設(shè)計(jì)思路。這部分可以參考Verilog PLI。
這里要插一句,Vivado工具可以將dcp文件,進(jìn)行適當(dāng)分析并生成Verilog文件。生成的文件可讀性很差,但是可以用于仿真。不過從功能角度說,工具反推回來的Verilog是否正確,就不太容易保證了。本人曾經(jīng)嘗試過這種方法,在仿真階段遇到了諸多問題,雖然最終可以解決問題并且實(shí)現(xiàn)仿真,但需要修改和調(diào)整的地方還是非常多的,有一定的工作量。
目前Xilinx Vivado工具提供了一種加密方式來對(duì)源代碼進(jìn)行加密。使用這種方法后,可以直接提供加密后的源代碼。這樣的好處很多:1.源代碼不綁定器件,所以跨器件的移植更容易;2.原代碼參與綜合,這樣綜合工具可以在綜合階段就有機(jī)會(huì)進(jìn)行合適的優(yōu)化;3.不影響仿真。
這種方法幾乎和源代碼一樣、唯一的問題是需要解密。由于Vivado是全功能的工具(Quartus的仿真功能使用的是Modelsim,所以嚴(yán)格說不是全功能的工具),所以只要購(gòu)買了這一功能的license,就可以用Vivado工具來進(jìn)行設(shè)計(jì)。不過同時(shí)帶來的問題是,只能使用Vivado。具體的影響是:
1.使用的器件必須是Vivado所支持的,也就是說如果設(shè)計(jì)需要在Spartan-6或者Altera的器件上運(yùn)行,就需要另外的加密手段,也就無法統(tǒng)一保護(hù)代碼/設(shè)計(jì)的手段,從公司和項(xiàng)目角度來看,這種方法會(huì)增加維護(hù)的成本。
2.部分公司的開發(fā)流程是使用獨(dú)立的仿真工具/綜合工具,這樣就需要第三方工具也支持這個(gè)加密與解密,可能會(huì)一定程度上限制使用。
第三種保護(hù)原始設(shè)計(jì)的方法,擁有之前兩種方法的幾乎全部缺點(diǎn),而且更加麻煩。但是相對(duì)的,保護(hù)原始設(shè)計(jì)的程度最高。這種方法就是,部分動(dòng)態(tài)重配置。
這種方法的做法是子模塊的設(shè)計(jì)團(tuán)隊(duì)可以獲取頂層工程,然后依據(jù)工程設(shè)計(jì)出子模塊的部分動(dòng)態(tài)重配置的配置文件。FPGA最終加載的時(shí)候,先加載不包含子模塊的靜態(tài)部分配置文件,然后加載子模塊的配置文件,通過兩次加載來組合出完整的功能。
這種方法的優(yōu)點(diǎn)是最終提供的是配置文件,所以幾乎不可能恢復(fù)出原始設(shè)計(jì),而且部分的配置文件和整體工程是相關(guān)聯(lián)的,導(dǎo)致一個(gè)配置文件只適配一個(gè)工程(甚至只適配一個(gè)工程的一個(gè)版本)。這樣就非常容易控制好子模塊的使用情況。但缺點(diǎn)就是過于復(fù)雜和麻煩,不僅僅無法仿真,無法調(diào)試,而且也固定器件型號(hào),并固定EDA工具版本。同時(shí)還需要做大量的時(shí)序優(yōu)化來減少設(shè)計(jì)分區(qū)對(duì)時(shí)序的影響。由于這一方案的成本過高,所以只有極為少數(shù)的公司在非常看重保密的條件下,才會(huì)使用動(dòng)態(tài)重配置技術(shù)。
最后一種方案是從可讀性入手。如果源代碼的功能正常,但是可讀性非常非常差,就可以既保證源代碼的使用,同時(shí)又可以一定程度來保護(hù)原始設(shè)計(jì)。這種方法可以稱之為代碼加擾,或者代碼混淆。(下文會(huì)使用代碼混淆這個(gè)稱呼)
代碼混淆是在不違反語(yǔ)法錯(cuò)誤的條件下對(duì)信號(hào)名和代碼結(jié)構(gòu)進(jìn)行重新處理,處理后的代碼可讀性非常非常低。通常情況下,在不熟悉代碼結(jié)構(gòu)的時(shí)候就直接讀沒有文檔沒有注釋代碼,本身就是一個(gè)非常辛苦的工作(所以基本上寫代碼的童鞋都不愿意讀別人寫的代碼)。如果再對(duì)變量名和代碼結(jié)構(gòu)做一定程度的調(diào)整,可以大大增加讀代碼的困難。通讀代碼、理清結(jié)構(gòu)的成本已經(jīng)和完全重新設(shè)計(jì)差不多高,以此來達(dá)到保護(hù)設(shè)計(jì)的目的。
通常代碼混淆分為變量混淆和格式混淆。變量混淆是將信號(hào)名全部替換成無意義的字符串。格式混淆是將代碼格式進(jìn)行打亂,不容易理解代碼的“分段”,從而增加理解代碼結(jié)構(gòu)的難度。從最終出來的效果看,想要讀懂代碼的難度實(shí)在太大了。
這種方法交付的依然是原始代碼,擁有源代碼的所有優(yōu)點(diǎn),可以進(jìn)行仿真,便于移植。同時(shí)由于是合乎語(yǔ)法的處理,所以對(duì)工具沒有任何限制。所以呢,如果看到一個(gè)寫的很糟糕的代碼,不要直接下定義認(rèn)為是作者太隨意或者水平太差,也許是故意寫出來不想讓別人看懂呢。
FPGA配置文件的保護(hù)方式
通常配置文件是保存在FPGA片外Flash中。FPGA和Flash之間的連接是通過PCB連線。這樣的問題是,很容易獲取Flash中的原始數(shù)據(jù)(取下Flash或者截取加載時(shí)的原始數(shù)據(jù))。為了對(duì)配置文件進(jìn)行保護(hù),Xilinx平臺(tái)的FPGA可以有以下幾種方案可以考慮。Altera平臺(tái)沒有深入的研究過,猜測(cè)推想,應(yīng)該是有類似的加密功能。
內(nèi)置Flash
部分FPGA芯片內(nèi)置了配置用的Flash,這樣很好的保護(hù)了Flash和其于FPGA的連接。一般來說很難獲取Flash中的數(shù)據(jù)。目前這一類芯片有Xilinx Spartan-3AN和Altera Max10。這一方案比較大的問題是,可選芯片太少。
AES加密
Xilinx的FPGA提供了AES加密功能,具體就是由用戶定義一個(gè)(或者用工具隨機(jī)生成一個(gè))密鑰,存儲(chǔ)在FPGA中,同時(shí)對(duì)bit文件進(jìn)行加密。由加密后的bit文件衍生的MCS/BIN文件都是經(jīng)過了加密的,所以最終Flash中存儲(chǔ)的版本也是經(jīng)過加密的。這樣即使Flash中的數(shù)據(jù)被獲取,沒有密鑰也無法使用。根據(jù)密鑰存儲(chǔ)的不同分為AES-BRAM和AES-EFUSE。
AES-BRAM是將密鑰存儲(chǔ)在一個(gè)特殊的BRAM中,這個(gè)BRAM可以用單獨(dú)的電源供電。當(dāng)徹底掉電時(shí),密鑰立即丟失,無法回復(fù)。所以這一方案需要為存儲(chǔ)密鑰的BRAM電源提供一個(gè)紐扣電池進(jìn)行供電。
AES-EFUSE是將密鑰存儲(chǔ)在FPGA內(nèi)置的,只能寫入一次的EFUSE寄存器中,同時(shí)必須使用原廠的JTAG Cable。寫入后密鑰將永遠(yuǎn)保存在EFUSE中,用于解密。
DNA加密
Xilinx的FPGA,每一個(gè)芯片都有一個(gè)唯一的編碼,成為eFuse ID。這個(gè)eFuse ID是64bit,其中57bit作為DNA提供給客戶使用。大部分情況下,用戶拿到的量產(chǎn)芯片中,DNA是不會(huì)重復(fù)的。此時(shí)可以作為一個(gè)加密的方法。
DNA加密的原理是在設(shè)計(jì)中加入讀取DNA的模塊,讀取DNA后和內(nèi)置存儲(chǔ)的數(shù)據(jù)作對(duì)比,如果發(fā)現(xiàn)不一樣則停止工作。
由于這種方法是寫入設(shè)計(jì)中的,所以如果沒有原始工程,幾乎無法破解。另外DNA又幾乎不會(huì)重復(fù),所以一個(gè)bit文件對(duì)應(yīng)一個(gè)FPGA芯片,可控性非常好。但是麻煩的是,對(duì)于量產(chǎn)的產(chǎn)片,每個(gè)產(chǎn)品都需要準(zhǔn)備一個(gè)bit文件,這很大程度上加大了生產(chǎn)成本。
由于這個(gè)問題,出現(xiàn)了幾種DNA用法的變種。
1.自動(dòng)處理DNA
這種方法是在設(shè)計(jì)中先查看Flash特定的區(qū)域,是否有需要的標(biāo)識(shí)符。如果沒有,則自動(dòng)讀取DNA,并通過一定的加密計(jì)算(當(dāng)然也可以直接使用原始數(shù)據(jù))換算出另一個(gè)值,然后將數(shù)據(jù)寫入Flash,并填充標(biāo)志位。如果發(fā)現(xiàn)有標(biāo)志位,則按規(guī)定的地址讀取DNA數(shù)據(jù),進(jìn)行解密,然后和DNA進(jìn)行對(duì)比。這種方案及利用了DNA的唯一性,又便于批量生產(chǎn)。但是代價(jià)是DNA數(shù)據(jù)是存儲(chǔ)在Flash中的。如果檢查Flash的數(shù)據(jù),是有機(jī)會(huì)找到DNA的數(shù)據(jù),此時(shí)結(jié)合FPGA的DNA原始數(shù)據(jù),在加密算法不麻煩的情況下有機(jī)會(huì)做解密。這樣是可以進(jìn)行破解的。如果使用更強(qiáng)大的加密算法,又會(huì)增加設(shè)計(jì)的成本。
2.部分動(dòng)態(tài)重配置
主體設(shè)計(jì)中不包含DNA信息,將DNA的讀取和識(shí)別放入一個(gè)占用資源極少、交互接口最簡(jiǎn)單的動(dòng)態(tài)重配置部分,這樣極大的降低使用部分動(dòng)態(tài)重配置的難度。在生產(chǎn)環(huán)節(jié),交付統(tǒng)一的配置文件進(jìn)行生產(chǎn)。在測(cè)試環(huán)節(jié),如果產(chǎn)品需要逐一進(jìn)行測(cè)試(現(xiàn)在很多電子產(chǎn)品都是100%測(cè)試而不是抽查),選擇合適的動(dòng)態(tài)配置文件寫入Flash進(jìn)行測(cè)試。這樣一定程度上降低了使用成本并有較高的保密性。這種方案僅適合需要對(duì)產(chǎn)品進(jìn)行100%充分測(cè)試的生產(chǎn)流程,否則依然會(huì)極大的提高生產(chǎn)成本。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21798瀏覽量
606038
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FPGA設(shè)計(jì)大賽設(shè)計(jì)方案提交規(guī)則和截止時(shí)間須知
提交FPGA設(shè)計(jì)方案,贏取賽靈思FPGA開發(fā)板
基于FPGA的變頻器設(shè)計(jì)方案,利用simulink仿真
鍋爐汽包水位保護(hù)設(shè)計(jì)方案
USB電路保護(hù)設(shè)計(jì)方案
![USB電路<b class='flag-5'>保護(hù)</b><b class='flag-5'>設(shè)計(jì)方案</b>](https://file1.elecfans.com//web2/M00/A5/90/wKgZomUMOQOAYnfOAAA2Lkmt6WA420.jpg)
多種EDA工具的FPGA設(shè)計(jì)方案
![多種EDA工具的<b class='flag-5'>FPGA</b><b class='flag-5'>設(shè)計(jì)方案</b>](https://file1.elecfans.com//web2/M00/A5/9A/wKgZomUMOTCAbTxaAABmWRwZY1w890.gif)
基于CPLD/FPGA的半整數(shù)分頻器設(shè)計(jì)方案
基于FPGA的偽隨機(jī)數(shù)發(fā)生器設(shè)計(jì)方案
基于CPLD/FPGA的多串口擴(kuò)展設(shè)計(jì)方案
![基于CPLD/<b class='flag-5'>FPGA</b>的多串口擴(kuò)展<b class='flag-5'>設(shè)計(jì)方案</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論