ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)(包括:工具及書(shū)籍文檔推薦 、軟件環(huán)境搭建、RTL設(shè)計(jì)、驗(yàn)證、工藝庫(kù)說(shuō)明、形式驗(yàn)證、綜合等共12部分)
之前介紹過(guò)了了芯片設(shè)計(jì)全流程介紹(芯片設(shè)計(jì)全流程詳解包括:正向流程和反向流程)。由于當(dāng)時(shí)的經(jīng)驗(yàn)十分有限,所以對(duì)于正向設(shè)計(jì),特別是對(duì)于從RTL級(jí)代碼開(kāi)始的設(shè)計(jì)介紹得不是很清楚。經(jīng)過(guò)這一段時(shí)間的學(xué)習(xí),對(duì)于從RTL級(jí)代碼開(kāi)始的Asic芯片設(shè)計(jì)有了更多的認(rèn)識(shí),現(xiàn)在總結(jié)一下,一方面給自己整理思路,另一方面也希望拋磚引玉,讓大家各抒己見(jiàn),分享一下各自的設(shè)計(jì)經(jīng)驗(yàn),促進(jìn)我們的共同進(jìn)步。
筆者原本打算詳細(xì)的介紹學(xué)習(xí)中的收獲,將各類知識(shí)點(diǎn)寫(xiě)成文章,但經(jīng)過(guò)反復(fù)考量之后,發(fā)現(xiàn)這種詳細(xì)照搬別人知識(shí)的做法其實(shí)沒(méi)什么意思。與其原封不動(dòng)的轉(zhuǎn)述別人書(shū)中的內(nèi)容,不如直接提供參閱的書(shū)目,這樣就免得在轉(zhuǎn)述別人的知識(shí)的時(shí)候誤解作者想要表達(dá)的真正意義。所以本系列的文章,筆者將個(gè)人學(xué)習(xí)的經(jīng)驗(yàn)加以整合,將經(jīng)驗(yàn)知識(shí)點(diǎn)羅列出來(lái),并附加所參閱的書(shū)籍。另外涉及到實(shí)踐操作過(guò)程的章節(jié),將會(huì)把具體使用的工具羅列出來(lái),并附上一些參考性的代碼和腳本。
本系列文章主要分為十二個(gè)部分,分別為:
(一)工具及書(shū)籍文檔推薦
(二)軟件環(huán)境搭建
(三)RTL設(shè)計(jì)
(四)驗(yàn)證
(五)工藝庫(kù)說(shuō)明
(六)形式驗(yàn)證
(七)綜合
(八)可測(cè)性設(shè)計(jì)
(九)低功耗設(shè)計(jì)
(十)靜態(tài)時(shí)序分析
(十一)數(shù)模混合仿真
(十二)可測(cè)性設(shè)計(jì)
介紹這么多,不是顯得個(gè)人有多少經(jīng)驗(yàn),其實(shí)本人也只是菜鳥(niǎo),關(guān)注這么多內(nèi)容,主要是為了讓自己的知識(shí)儲(chǔ)備更全面一下,這樣考慮設(shè)計(jì)問(wèn)題的時(shí)候遺漏的東西會(huì)更少一些。在本系列文章中,每個(gè)章節(jié)的詳略是不同的,主要是跟個(gè)人工作經(jīng)驗(yàn)有關(guān),有介紹得簡(jiǎn)單的地方,麻煩大家?guī)兔ρa(bǔ)充。每個(gè)部分的內(nèi)容基本采用“理論 工具 示例”的行文結(jié)構(gòu),有些EDA工具筆者沒(méi)有使用過(guò)的就暫不能提供實(shí)例了。
(一)工具及書(shū)籍文檔
一、前言
對(duì)于RTL級(jí)的Asic設(shè)計(jì)所涉及到的軟件是非常之多的,筆者也并沒(méi)有每一個(gè)都使用過(guò)。
二、工具介紹
RTL代碼規(guī)則檢查工具:nlint,spyglass。這兩個(gè)軟件主要是用于檢查代碼的語(yǔ)法和語(yǔ)義錯(cuò)誤的,并且比其他的工具能檢測(cè)出更多的問(wèn)題,比如說(shuō)命名規(guī)格,時(shí)序風(fēng)險(xiǎn),功耗等。詳細(xì)介紹請(qǐng)參考軟件的使用教程,nlint有Windows版和linux版,軟件的linux版本和使用教程可以在eetop上搜索到。
RTL代碼仿真工具:這類仿真工具有較多的組合,比如說(shuō):qustasim/modelsim,NC_verilog Verdi,VCS DVE,VCS Verdi等等。目前筆者使用的組合是VCS Verdi。這兩個(gè)軟件是業(yè)內(nèi)主流的仿真軟件,還可以結(jié)合UVM庫(kù)進(jìn)行仿真,當(dāng)然這是驗(yàn)證方法學(xué)的內(nèi)容。
綜合工具:Design Complier。最常用的綜合工具,沒(méi)有之一,該軟件主要是將RTL代碼“翻譯 優(yōu)化 映射”成與工藝庫(kù)對(duì)應(yīng)的門級(jí)網(wǎng)表。并且還包含功耗分析軟件Power Complier和邊界掃描寄存器插入軟件 BSD Complier。
可測(cè)性設(shè)計(jì):DFT Complier TetraMAX。軟件在DC之后使用,DFT Complier 用于將設(shè)計(jì)的內(nèi)部寄存器替換成掃描寄存器并組成一條或多條掃描鏈,TetraMAX是用于自動(dòng)生成測(cè)試向量的。
形式驗(yàn)證工具:Formality、Conforml(candence出品)。等價(jià)性驗(yàn)證工具,主要是在DFT Complier插入掃描鏈之后進(jìn)行驗(yàn)證,另外,在版圖綜合時(shí)鐘樹(shù),插入BUFFER之后,也需要用該工具進(jìn)行等效性驗(yàn)證。
靜態(tài)時(shí)序分析工具: Prime Time。業(yè)界最常用的時(shí)序分析工具之一,該軟件包括功耗分析PTPX工具,功耗分析必備。cadence也有對(duì)應(yīng)的時(shí)序分析工具——Encounter Timing System。
自動(dòng)布局布線工具(APR):ICC,Enconter。其中Encounter是Cadence公司的。
數(shù)模混合仿真: nanosim VCS,nanosim的升級(jí)版為XA。
這是一篇有關(guān)于synopsysEDA工具軟件的介紹,希望對(duì)于EDA軟件的用途不清楚的伙伴有幫助。http://bbs.eetop.cn/thread-151171-1-1.html
三、書(shū)籍推薦
《Verilog HDL 硬件描述語(yǔ)言》
《設(shè)計(jì)與驗(yàn)證Verilog HDL》
《企業(yè)用verilog代碼風(fēng)格規(guī)范》
《verilog語(yǔ)言編碼風(fēng)格》
《verilogHDL代碼風(fēng)格規(guī)范》
《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》
《Soc設(shè)計(jì)方法與實(shí)現(xiàn)》
《高級(jí)ASIC芯片綜合》
《華為Verilog典型電路設(shè)計(jì)》
《數(shù)字IC系統(tǒng)設(shè)計(jì)》
《數(shù)字集成電路–電路、系統(tǒng)與設(shè)計(jì)》
《專用集成電路設(shè)計(jì)實(shí)用教程》
《集成電路靜態(tài)時(shí)序分析與建模》
《CMOS集成電路后端設(shè)計(jì)與實(shí)戰(zhàn)》
《makefile教程》
《鳥(niǎo)哥的私房菜》
《SystemVerilog與功能驗(yàn)證》
《UVM實(shí)戰(zhàn)》
《通信IC設(shè)計(jì)(上下冊(cè))》
《數(shù)字圖像處理與圖像通信》
《數(shù)字信號(hào)處理的FPGA實(shí)現(xiàn)中文版》
各類Synopsy userguide,EETOP有16年版的。
三、工藝庫(kù)說(shuō)明
使用DC,PT,F(xiàn)M,ICC或者ENCOUNTER軟件需要工藝庫(kù)文件,主要包括數(shù)字邏輯單元文件,符號(hào)庫(kù),綜合庫(kù),寄生電容參數(shù)庫(kù),版圖文件LEF,milkway庫(kù)等等。
有關(guān)工藝庫(kù)各文件夾的作用,筆者將會(huì)在將“工藝庫(kù)說(shuō)明”的章節(jié)進(jìn)行詳細(xì)介紹,如果有遺漏還請(qǐng)大家包涵。
(二)環(huán)境搭建
一、前言
個(gè)人的環(huán)境如下:1、vmware 12;2、RHEL6.5系統(tǒng);3、synopsys軟件,Lib Complier,VCS,Verdi,Desgin Complier,PrimeTime,F(xiàn)ormality,ICC。一共7個(gè)軟件,幾乎都是15年版本的。
二、步驟
環(huán)境搭建需要準(zhǔn)備以下三件事:
1,vmware12虛擬機(jī)安裝;安裝教程如下。https://jingyan.baidu.com/article/215817f78879c21edb142379.html
2, RHEL6.5操作系統(tǒng)安裝,當(dāng)然也可以使用CentOs6.5,安裝教程如下。http://www.linuxidc.com/Linux/2016-05/131701.htm ——》RHEL6.5
https://www.kafan.cn/edu/488101.html ——》Centos6.5
a、安裝vmware tools。在虛擬機(jī)中把系統(tǒng)安裝好了之后,需要安裝vmware tools,安裝教程如下,http://www.linuxidc.com/Linux/2015-08/122031.htm ,安裝該軟件之后才可以啟用共享文件夾以利于RHEL6.5與windows系統(tǒng)進(jìn)行文件交換。
b、更新YUM源,RHEL和Centos都需要更新YUM源,操作步驟一致,YUM是一個(gè)鏈接到軟件庫(kù)的一個(gè)軟件,隨后安裝軟件需要用到。https://jingyan.baidu.com/article/b24f6c8239c6aa86bee5da60.html
注意:該教程某些步驟可能會(huì)失效,需要結(jié)合自己具體的情況使用。安裝好YUM之后,可以使用yum install gvim命令測(cè)試一下。
c、安裝GCC,G ,這兩個(gè)軟件在VCS Verdi仿真時(shí)會(huì)調(diào)用到。命令:yum install gcc
命令:yum install gcc-c
3、 Synopsys軟件安裝
Synopsys軟件安裝教程,鏈接如下:https://wenku.baidu.com/view/c02c271d9b6648d7c0c74670.html
http://bbs.eetop.cn/thread-553702-1-1.html
高版本和低版本的Synopsy軟件安裝步驟一致,區(qū)別在于license的問(wèn)題。用EETOP上的最新license即可使用15版的軟件。在使用RHEL操作系統(tǒng)需要懂一些SHELL腳本,makefile腳本,這樣便于提高操作效率,后文會(huì)提到。
注意:此外還需要修改四個(gè)文件的hostname,使得這四處的hostname保持一致。
a、synopsys.dat中的第一行hostname;
b、synopsys.bashrc中的export SNPSLMD_LICENSE_FILE=27000@localhost行,“@”符號(hào)后的hostname;
c、/etc/sysconfig/network配置文件中hostname;
d、/etc/hosts配置文件中的127.0.0.1這一行的 ,第三個(gè)參數(shù)hostname;
這四個(gè)hostname一定要一致,才能正確啟動(dòng)DC,PT,FM,ICC,VCS,VERDI軟件。
在啟動(dòng)DC,PT,FM,ICC,VCS,VERDI軟件之前需要先啟動(dòng)Synopsys的license管理器。
有關(guān)軟件的使用教程可以參考官方的userguide?;蛘逧ETOP上,小伙伴們的教程。
(三)工藝庫(kù)說(shuō)明
(略,請(qǐng)點(diǎn)擊閱讀原文查看)
(四)RTL設(shè)計(jì)
數(shù)字電路設(shè)計(jì)
RTL設(shè)計(jì)所需要的理論知識(shí)龐雜而繁多,本文所介紹的內(nèi)容均由個(gè)人參閱了許多書(shū)籍之后加以整合的,很多內(nèi)容本人也不是很熟,只是羅列出來(lái)作為參考學(xué)習(xí)的資料。主要有三個(gè)部分的內(nèi)容,第一部分主要是數(shù)字電路設(shè)計(jì)的基礎(chǔ),這是在大學(xué)時(shí)期應(yīng)該予以掌握的內(nèi)容,第二部分是進(jìn)階的學(xué)習(xí)內(nèi)容附帶一個(gè)專業(yè)方向——MCU,第三部分是有關(guān)于各類算法處理的專業(yè)知識(shí),需要更多的復(fù)合型知識(shí),例如通信方向需要有較好的數(shù)學(xué)功底—傅立葉變換。由于這部分內(nèi)容實(shí)在太多,個(gè)人沒(méi)有能力也沒(méi)有必要將每一部分的內(nèi)容都詳細(xì)的羅列出來(lái),所以這里只是整理出一些需要把握的關(guān)鍵點(diǎn)。至于具體的內(nèi)容,還請(qǐng)大家按照個(gè)人需求,參閱推薦的各類書(shū)籍。
一、基礎(chǔ)
組合邏輯與時(shí)序邏輯:布爾代數(shù),卡諾圖,基本與非門,鎖存器,觸發(fā)器,沖突與冒險(xiǎn)?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》
Verilog語(yǔ)言基礎(chǔ):數(shù)值類型,表達(dá)式與運(yùn)算符,assign語(yǔ)句,always語(yǔ)句,if-else語(yǔ)句,case語(yǔ)句,阻塞與非阻塞?!禫erilog HDL 硬件描述語(yǔ)言》
狀態(tài)機(jī):一段式、二段式、三段式狀態(tài)機(jī)的區(qū)別;獨(dú)熱碼、二進(jìn)制碼、格雷碼的區(qū)別及應(yīng)用場(chǎng)合。——《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》
同步電路和異步電路:兩者的本質(zhì),異步電路跨時(shí)鐘域,亞穩(wěn)態(tài)?!狪C_learner博客
復(fù)位與時(shí)鐘:同步復(fù)位、異步復(fù)位、異步復(fù)位同步釋放的區(qū)別,時(shí)鐘分頻——二分頻、三分頻、任意整數(shù)分頻,門控時(shí)鐘,時(shí)鐘切換?!渡钊霚\出玩轉(zhuǎn)FPGA》,百度文檔
數(shù)據(jù)通路與控制通路:本質(zhì)上任何數(shù)字電路都可以劃分為簡(jiǎn)單的兩種類型——控制通路與數(shù)據(jù)通路,控制通路的核心是狀態(tài)機(jī),數(shù)據(jù)通路是各類算術(shù)處理算法、并行總線等等?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》
Testbench驗(yàn)證:無(wú)論什么電路,最終都需要驗(yàn)證其功能的正確性。Testbench的結(jié)構(gòu)主要由a,復(fù)位和時(shí)鐘,b,激勵(lì)產(chǎn)生電路,c,系統(tǒng)監(jiān)視器,d,結(jié)果比較電路,e,波形產(chǎn)生函數(shù),f,待驗(yàn)證的MODULE等主要模塊組成,其中,b是最重要的模塊,一切驗(yàn)證都是從激勵(lì)信號(hào)開(kāi)始的?!秜erilogHDL代碼風(fēng)格規(guī)范》。初學(xué)者推薦使用windows版qustasim 或者modelsim 仿真工具,簡(jiǎn)單又方便,以后可學(xué)習(xí)使用VCS Verdi(比較折騰人)。
二、進(jìn)階
代碼風(fēng)格:良好的代碼風(fēng)格很有必要,參考一下企業(yè)用的代碼風(fēng)格,有助于個(gè)人養(yǎng)成良好的編碼習(xí)慣?!镀髽I(yè)用verilog代碼風(fēng)格規(guī)范》《verilog語(yǔ)言編碼風(fēng)格》
基本常用電路:具備以上龐雜的理論基礎(chǔ)之后,需要積累一些常用的基礎(chǔ)電路?!度A為Verilog典型電路設(shè)計(jì)》
接口電路,I2C,UART,SPI:接口電路是中小規(guī)模芯片常用的對(duì)外接口電路,無(wú)論是與上位機(jī)(PC)通信還是控制其它芯片。I2C從機(jī)常用于EEPROM芯片中,主機(jī)可以直接使用單片機(jī)模擬,ARM單片機(jī)直接集成了I2C主機(jī),I2C的IP代碼網(wǎng)絡(luò)上有現(xiàn)成的;UART是全雙工電路,宏晶單片機(jī)通過(guò)UART進(jìn)行燒錄,SPI電路最常用于SD卡上?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》《通信IC設(shè)計(jì)(上下冊(cè))》有簡(jiǎn)單的UART和SPI的代碼。
RISC,8051 MCU ——IP:通過(guò)下載EETOP上相關(guān)的IP及文檔來(lái)學(xué)習(xí)。
三、專業(yè)
數(shù)值的表示方法:浮點(diǎn)數(shù),定點(diǎn)數(shù)的表示辦法——《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》《通信IC設(shè)計(jì)(上下冊(cè))》
算術(shù)處理算法:浮點(diǎn)數(shù)的加法、乘法電路設(shè)計(jì)?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》
通信算法:FIR濾波器,IIR濾波器,傅立葉變換,冗余編碼等等各種通信方向必須掌握的?!锻ㄐ臝C設(shè)計(jì)(上下冊(cè))》《數(shù)字信號(hào)處理的FPGA實(shí)現(xiàn)》
圖像處理算法:靜態(tài)圖像,動(dòng)態(tài)圖像去噪?!稊?shù)字圖像處理與圖像通信》
SOC:SOC類芯片的組成結(jié)構(gòu),AMBA總線,IP復(fù)用,SV驗(yàn)證?!禨oc設(shè)計(jì)方法與實(shí)現(xiàn)》
四、工具:
文檔代碼編輯器:GVIM,Notpad
RTL設(shè)計(jì)規(guī)則檢查:Nlin,spyglass
五、示例
下列代碼為UART全雙工串口示例代碼,代碼來(lái)源于《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》,隨后的章節(jié)將會(huì)使用到該示例代碼,代碼功能細(xì)節(jié)需結(jié)合書(shū)籍了解。
下面的代碼已經(jīng)過(guò)modelsim驗(yàn)證。
UART發(fā)送器:
module UART_XMTR #(
parameter word_size = 8
)(
output Serial_out,
input [word_size – 1 : 0] Data_Bus,
input Load_XMT_datareg,
Byte_ready,
T_byte,
Clock,
rst_b
);
Control_Unit M0( Load_XMT_DR, Load_XMT_shftreg,start,shift,clear,
Load_XMT_datareg,Byte_ready,T_byte,BC_lt_Bcmax,
Clock,rst_b);
Datapath_Unit M1( Serial_out,BC_lt_Bcmax,Data_Bus,Load_XMT_DR,
Load_XMT_shftreg,start,shift,clear,Clock,rst_b);
endmodule
module Control_Unit #(
parameter one_hot_count = 3,
state_count = one_hot_count,
size_bit_count = 3,
idle = 3’b001,
waiting = 3’b010,
sending = 3’b100
// all_ones = 9’b1_1111_11111
)(
output reg Load_XMT_DR,
output reg Load_XMT_shftreg,
output reg start,
output reg shift,
output reg clear,
input Load_XMT_datareg,
input Byte_ready,
input T_byte,
input BC_lt_Bcmax,
input Clock,
input rst_b
);
reg [state_count – 1 : 0] state, next_state;
always @(state, Load_XMT_datareg,Byte_ready,T_byte,BC_lt_Bcmax)
begin:Output_and_next_state
Load_XMT_DR = 0;
Load_XMT_shftreg = 0;
start = 0;
shift = 0;
clear = 0;
next_state = idle;
case(state)
idle: if(Load_XMT_datareg == 1’b1)begin
Load_XMT_DR = 1;
next_state = idle;
end
else if(Byte_ready == 1’b1)begin
Load_XMT_shftreg = 1;
next_state = waiting;
end
waiting: if(T_byte == 1) begin
start = 1;
next_state =sending;
end else
next_state = waiting;
sending: if(BC_lt_Bcmax) begin
shift = 1;
next_state = sending;
end
else begin
clear = 1;
next_state = idle;
end
default: next_state = idle;
endcase
end
always @(posedge Clock,negedge rst_b)
begin: State_Transitions
if(rst_b == 1’b0)
state <= idle;
else
state <= next_state;
end
endmodule
module Datapath_Unit #(
parameter word_size = 8,
size_bit_count = 3,
all_ones = 9’b1_1111_1111
)(
output Serial_out,
BC_lt_Bcmax,
input [word_size -1:0] Data_Bus,
input Load_XMT_DR,
input Load_XMT_shftreg,
input start,
input shift,
input clear,
input Clock,
input rst_b
);
reg [word_size -1:0] XMT_datareg;
reg [word_size :0] XMT_shftreg;
reg [size_bit_count:0] bit_count;
assign Serial_out = XMT_shftreg [0];
assign BC_lt_Bcmax = (bit_count < word_size 1);
always @(posedge Clock,negedge rst_b)
if(rst_b == 0)
begin
XMT_shftreg <= all_ones;
XMT_datareg <= 9’b0_0000_0000;
bit_count <= 0;
end
else begin:Register_Transfers
if(Load_XMT_DR == 1’b1)
XMT_datareg <= Data_Bus;
if(Load_XMT_shftreg == 1’b1)
XMT_shftreg <= {XMT_datareg,1’b1};
if(start == 1’b1)
XMT_shftreg[0] <= 0;
if(clear == 1’b1)
bit_count <= 0;
if(shift ==1’b1)
begin
XMT_shftreg <= {1’b1,XMT_shftreg[word_size:1]};
bit_count <= bit_count 1;
end
end
endmodule
UART接收器:
module UART_RCVR #(
parameter word_size = 8,
half_word =word_size/2
)(
output [word_size – 1 :0] RCV_datareg,
output read_not_ready_out,
Error1,Error2,
input Serial_in,
read_not_ready_in,
Sample_clk,
rst_b
);
Control_Unit2 M0( read_not_ready_out,Error1,Error2,
clr_Sample_counter,inc_Sample_counter,
clr_Bit_counter,inc_Bit_counter,shift,
load,read_not_ready_in,Ser_in_0,SC_eq_3,
SC_lt_7,BC_eq_8,Sample_clk,rst_b);
Datapath_Unit2 M1( RCV_datareg,Ser_in_0,SC_eq_3,SC_lt_7,
BC_eq_8,Serial_in,clr_Sample_counter,
inc_Sample_counter,clr_Bit_counter,
inc_Bit_counter,shift,load,Sample_clk,rst_b);
endmodule
module Control_Unit2 #(
parameter word_size = 8,
half_word = word_size/2,
Num_state_bits = 2,
idle = 2’b00,
starting = 2’b01,
receiving = 2’b10
)(
output reg read_not_ready_out,
Error1,Error2,
clr_Sample_counter,
inc_Sample_counter,
clr_Bit_counter,
inc_Bit_counter,
shift,
load,
input read_not_ready_in,
Ser_in_0,
SC_eq_3,
SC_lt_7,
BC_eq_8,
Sample_clk,
rst_b
);
reg [word_size – 1 :0] RCV_shftreg;
reg [Num_state_bits – 1 : 0] state;
reg [Num_state_bits – 1 : 0] next_state;
always @(posedge Sample_clk or negedge rst_b)
if(rst_b == 1’b0)
state <= idle;
else
state <= next_state;
always @(state,Ser_in_0,SC_eq_3,SC_lt_7,read_not_ready_in)
begin
read_not_ready_out = 0;
clr_Sample_counter = 0;
clr_Bit_counter = 0;
inc_Sample_counter = 0;
inc_Bit_counter = 0;
shift = 0;
Error1 = 0;
Error2 = 0;
load = 0;
next_state = idle;
case(state)
idle: if(Ser_in_0 == 1’b1)
next_state = starting;
else
next_state = idle;
starting: if(Ser_in_0 ==1’b0)
begin
next_state = idle;
clr_Sample_counter = 1;
end else
if(SC_eq_3 == 1’b1)
begin
next_state = receiving;
clr_Sample_counter = 1;
end
else begin
inc_Sample_counter = 1;
next_state = starting;
end
receiving: if(SC_lt_7 == 1’b1)
begin
inc_Sample_counter = 1;
next_state = receiving;
end
else begin
clr_Sample_counter = 1;
if(!BC_eq_8)
begin
&nb
(五)驗(yàn)證(1)
一、前言
借助于前文RTL設(shè)計(jì)中提到的UART代碼,本章節(jié)將在后面給出對(duì)應(yīng)的testbench以及說(shuō)明如何在questa/modelsim、VCS DVE、VCS Verdi工具中使用。推薦書(shū)籍:《vcs User Guide 2016》
二、Testbench
Testbench的結(jié)構(gòu),正如上文提到的,主要由a,復(fù)位和時(shí)鐘,b,激勵(lì)產(chǎn)生電路,c,系統(tǒng)監(jiān)視器,d,結(jié)果比較電路,e,波形產(chǎn)生函數(shù),f,待驗(yàn)證的MODULE,g,控制仿真時(shí)間這幾個(gè)部分組成。本章節(jié)提供的testbench只包含a,b,e,f,g部分,至于c,d更高級(jí)的內(nèi)容,暫時(shí)無(wú)法涉及,questa/modelsim將不會(huì)使用到e部分的代碼,使用questa/modelsim仿真時(shí)要屏蔽掉全部e段的內(nèi)容。同樣,在使用VCS DVE進(jìn)行仿真時(shí)要屏蔽VCS VERDI的e段內(nèi)容
三、工具使用
3.1modelsim仿真
對(duì)于modelsim仿真, 仿真文件包含:1,verilog源文件(前文已全部提供);2,testbench文件(后面會(huì)提供)
modelsim使用教程:https://wenku.baidu.com/view/db638e25b9d528ea81c779cc.html
有關(guān)在modelsim軟件中如何使用本示例請(qǐng)參考以上教程。
仿真結(jié)果圖:
3.2 VCS DVE和VCS VERDI仿真
對(duì)于VCS DVE和VCS VERDI, 仿真文件包含:
1,verilog源文件(前文已全部提供);
2,testbench文件(后面會(huì)提供),
3,包含verilog、testbench文件路徑的uart.f文件(必要時(shí)需自行修改),
4,makefile仿真啟動(dòng)文件。在終端中運(yùn)行make命令即可運(yùn)行仿真,一定要注意文件路徑問(wèn)題。
makefile教程:http://blog.csdn.net/liang13664759/article/details/1771246
VCS DVE 使用教程,https://wenku.baidu.com/view/48912cf558fb770bf68a55b4.html
DVE是VCS軟件自帶的波形查看器。
本章實(shí)例對(duì)應(yīng)的VCS DVE makefile啟動(dòng)腳本:
all:VCS DVE
VCS:
vcs -f uart.f -full64 -debug_all -R
DVE:
dve -vpd wave.vpd -mode64
將以上內(nèi)容復(fù)制到文本文件中,并將該文本文件改名為makeflile。
uart.f內(nèi)容:
/home/Lance/synopsys/UART/testbench.v //必須放在文件中的第一行。
/home/Lance/synopsys/UART/UART_XMTR.v
/home/Lance/synopsys/UART/Control_Unit.v
/home/Lance/synopsys/UART/Datapath_Unit.v
/home/Lance/synopsys/UART/UART_RCVR.v
/home/Lance/synopsys/UART/Control_Unit2.v
/home/Lance/synopsys/UART/Datapath_Unit2.v
DVE波形查看器啟動(dòng)命令:
dve -vpd wave.vpd -mode64
此外,在運(yùn)行makefile啟動(dòng)腳本之前,還需要在testbench中添加如下代碼:
initial
begin
$vcdplusfile(“wave.vpd”);//保存的波形文件名字
$vcdpluson(1,tb);//tb對(duì)應(yīng)testbench文件的內(nèi)的module名字
end
該段代碼為e,波形產(chǎn)生函數(shù),主要是生成DVE波形查看器使用的VPD格式的波形文件。
仿真結(jié)果圖:
VCS Verdi,Verdi是debussy的升級(jí)版,是一個(gè)獨(dú)立的軟件,這對(duì)軟件組合使用方式與VCS DVE差不多。
VCS Verdi makefile啟動(dòng)腳本:
all:VCS VERDI
VCS:
vcs v2k -sverilog -debug_all -P /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/novas.tab /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/pli.a vcs lic wait -f uart.f -y ./ libext .v -full64 -R
VERDI:
verdi -f uart.f -ssf wave.fsdb &
將以上內(nèi)容復(fù)制到文本文件中,并將該文本文件改名為makeflile。
注意:-P /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/novas.tab /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/pli.a主要是調(diào)用Verdi的接口函數(shù)以生成fsdb波形。
Verdi波形查看器啟動(dòng)命令:
verdi -f uart.f -ssf wave.fsdb &
此外,在運(yùn)行makefile啟動(dòng)命令前,還需要在testbench中添加如下代碼:
initial
begin
$fsdbDumpfile(“wave.fsdb”);
$fsdbDumpvars(0,tb);
end
以生成Verdi波形查看器使用的FSDB格式的波形文件。
仿真結(jié)果圖:
注意: 啟動(dòng)腳本相關(guān)問(wèn)題,需要學(xué)習(xí)makefile有關(guān)內(nèi)容,有關(guān)VCS和Verdi的詳細(xì)使用教程,還請(qǐng)參考其它資料。
四、Testbench代碼附件:
`timescale 1ns/1ns
module tb;
parameter num = 500;
reg [7 : 0] Data_Bus;
reg Load_XMT_datareg;
reg Byte_ready;
reg T_byte;
reg read_not_ready_in;
reg Clock;
reg rst_b;
reg Sample_clk;
wire serial;
wire Error1,Error2;
wire [7:0] RCV_datareg;
wire read_not_ready_out;
//a,時(shí)鐘和復(fù)位部分
initial
begin
rst_b = 1;
Sample_clk = 0;
Clock = 0;
#100;
rst_b = 0;
#100;
rst_b = 1;
end
always #(8*num) Clock = ~Clock;
always #num Sample_clk = ~Sample_clk;
//b,激勵(lì)產(chǎn)生部分
initial
begin
Data_Bus = 8’b1110_0101;
Load_XMT_datareg = 1’b1;
Byte_ready = 1’b0;
T_byte = 1’b0;
read_not_ready_in = 1’b0;
//
#(2*8*num);
Load_XMT_datareg = 1’b0;
#(2*8*num);
Byte_ready = 1’b1;
#(2*8*num);
T_byte = 1’b1;
//
#(2*8*num)
Load_XMT_datareg = 1’b1;
Byte_ready = 1’b0;
T_byte = 1’b0;
end
//c,系統(tǒng)監(jiān)視器
//d,結(jié)果比較電路
//e,波形產(chǎn)生函數(shù)
//vpd
initial
begin
$vcdplusfile(“wave.vpd”);
$vcdpluson(1,tb);
end
//fsdb
// initial
// begin
// $fsdbDumpfile(“wave.fsdb”);
// $fsdbDumpvars(0,tb);
// end
//g,控制仿真時(shí)間
initial
begin
$finish;
end
//f,待驗(yàn)證的MODULE
UART_XMTR m0(
.Serial_out(serial),
.Data_Bus(Data_Bus),
.Load_XMT_datareg(Load_XMT_datareg),
.Byte_ready(Byte_ready),
.T_byte(T_byte),
.Clock(Clock),
.rst_b(rst_b)
);
UART_RCVR m1(
.RCV_datareg(RCV_datareg),
.read_not_ready_out(read_not_ready_out),
.Error1(Error1),
.Error2(Error2),
(六)驗(yàn)證(2)
(七) 綜合
(八)形式驗(yàn)證
(九)數(shù)?;旌戏抡?/strong>
(十)靜態(tài)時(shí)序分析
(十一)低功耗設(shè)計(jì)
(十二)可測(cè)性設(shè)計(jì)
(由于篇幅關(guān)系,以上章節(jié)請(qǐng)點(diǎn)擊閱讀原文前往作者博客查看)
推薦閱讀:關(guān)注EETOP公眾號(hào),后臺(tái)輸入 芯片,查看如下文章
-
ASIC前后端設(shè)計(jì)經(jīng)典的細(xì)節(jié)講解
IC大牛10多年的設(shè)計(jì)分享:數(shù)字典型電路知識(shí)結(jié)構(gòu)地圖及代碼實(shí)現(xiàn)
關(guān)于華為海思,這篇文章值得一看
俄國(guó)沒(méi)有高端芯片,為什么卻能造出一流武器?
別攔我,我要做芯片!
芯片春秋·ARM傳
中國(guó)芯酸往事
印度芯酸往事
國(guó)防軍工芯片行業(yè)深度報(bào)告
一位美國(guó)芯片公司華人高管對(duì)中國(guó)芯片行業(yè)的思考
學(xué)習(xí)、積累、交流-IC設(shè)計(jì)高手的成長(zhǎng)之路
女生學(xué)微電子是一種什么體驗(yàn)?
MIPS架構(gòu)開(kāi)放了,10天設(shè)計(jì)一款完全免費(fèi)的MIPS處理器(附源碼)
性能之殤:從馮·諾依曼瓶頸談起
AI芯片設(shè)計(jì)與開(kāi)發(fā)概覽
AI 芯片和傳統(tǒng)芯片有何區(qū)別?
一個(gè)資深工程師老王關(guān)于AI芯片的技術(shù)感悟
隔隔壁老王:AI芯片與她怎么選?
終于有人把云計(jì)算、大數(shù)據(jù)和人工智能講明白了!
尺寸減半、功率翻番!——氮化鎵技術(shù)的現(xiàn)在和未來(lái)
邏輯綜合 Design Compiler 資料大全
集成電路制造技術(shù)簡(jiǎn)史
版圖中Metal專題——線寬選擇
麒麟980內(nèi)核照片:NPU在哪呢?
有哪些只有IC工程師才能get到的梗?
為什么7nm工藝制程這么難?從7nm看芯片行業(yè)的“貧富差距”
什么是臺(tái)積電的SoIC?
RISC-V打入主流市場(chǎng)的諸多問(wèn)題
RISC-V架構(gòu)有何優(yōu)勢(shì)?
關(guān)于RISC-V 終于有人講明白了!
ASIC低功耗設(shè)計(jì)實(shí)例分析及書(shū)籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之可測(cè)性設(shè)計(jì)及書(shū)籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之靜態(tài)時(shí)序分析概要及書(shū)籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之工具及書(shū)籍文檔
小芯片大價(jià)值 | ASIC工程師如此值錢到底為什么?
芯片面積估計(jì)方法簡(jiǎn)介
自主研發(fā)通信芯片有多難?通信行業(yè)老兵告訴你,沒(méi)那么簡(jiǎn)單!
RISC-V精簡(jiǎn)到何種程度?能省的都省了!
多核CPU設(shè)計(jì)及RISC-V相關(guān)資料
時(shí)序設(shè)計(jì)與約束資料匯總
模擬版圖講義
GDSII轉(zhuǎn)DEF的flow簡(jiǎn)介
機(jī)器學(xué)習(xí)將越來(lái)越依賴FPGA和SoC
Verilog基本功之:流水線設(shè)計(jì)Pipeline Design
先進(jìn)封裝發(fā)展趨勢(shì)分析PPT
先進(jìn)封裝發(fā)展現(xiàn)狀分析PPT
可測(cè)試性設(shè)計(jì)與ATPG
麒麟980是如何誕生的?敢于失敗,勇于嘗試?。ǜ剑喝A為早期型號(hào)處理器研發(fā)過(guò)程)
IC模擬版圖設(shè)計(jì)講義
Verilog CPU設(shè)計(jì)實(shí)例
。。。。
(共260篇)
點(diǎn)擊閱讀原文查看作者博客