ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)(包括:工具及書籍文檔推薦 、軟件環(huán)境搭建、RTL設(shè)計(jì)、驗(yàn)證、工藝庫說明、形式驗(yàn)證、綜合等共12部分)
之前介紹過了了芯片設(shè)計(jì)全流程介紹(芯片設(shè)計(jì)全流程詳解包括:正向流程和反向流程)。由于當(dāng)時(shí)的經(jīng)驗(yàn)十分有限,所以對(duì)于正向設(shè)計(jì),特別是對(duì)于從RTL級(jí)代碼開始的設(shè)計(jì)介紹得不是很清楚。經(jīng)過這一段時(shí)間的學(xué)習(xí),對(duì)于從RTL級(jí)代碼開始的Asic芯片設(shè)計(jì)有了更多的認(rèn)識(shí),現(xiàn)在總結(jié)一下,一方面給自己整理思路,另一方面也希望拋磚引玉,讓大家各抒己見,分享一下各自的設(shè)計(jì)經(jīng)驗(yàn),促進(jìn)我們的共同進(jìn)步。
筆者原本打算詳細(xì)的介紹學(xué)習(xí)中的收獲,將各類知識(shí)點(diǎn)寫成文章,但經(jīng)過反復(fù)考量之后,發(fā)現(xiàn)這種詳細(xì)照搬別人知識(shí)的做法其實(shí)沒什么意思。與其原封不動(dòng)的轉(zhuǎn)述別人書中的內(nèi)容,不如直接提供參閱的書目,這樣就免得在轉(zhuǎn)述別人的知識(shí)的時(shí)候誤解作者想要表達(dá)的真正意義。所以本系列的文章,筆者將個(gè)人學(xué)習(xí)的經(jīng)驗(yàn)加以整合,將經(jīng)驗(yàn)知識(shí)點(diǎn)羅列出來,并附加所參閱的書籍。另外涉及到實(shí)踐操作過程的章節(jié),將會(huì)把具體使用的工具羅列出來,并附上一些參考性的代碼和腳本。
本系列文章主要分為十二個(gè)部分,分別為:
(一)工具及書籍文檔推薦
(二)軟件環(huán)境搭建
(三)RTL設(shè)計(jì)
(四)驗(yàn)證
(五)工藝庫說明
(六)形式驗(yàn)證
(七)綜合
(八)可測性設(shè)計(jì)
(九)低功耗設(shè)計(jì)
(十)靜態(tài)時(shí)序分析
(十一)數(shù)?;旌戏抡?/p>
(十二)可測性設(shè)計(jì)
介紹這么多,不是顯得個(gè)人有多少經(jīng)驗(yàn),其實(shí)本人也只是菜鳥,關(guān)注這么多內(nèi)容,主要是為了讓自己的知識(shí)儲(chǔ)備更全面一下,這樣考慮設(shè)計(jì)問題的時(shí)候遺漏的東西會(huì)更少一些。在本系列文章中,每個(gè)章節(jié)的詳略是不同的,主要是跟個(gè)人工作經(jīng)驗(yàn)有關(guān),有介紹得簡單的地方,麻煩大家?guī)兔ρa(bǔ)充。每個(gè)部分的內(nèi)容基本采用“理論 工具 示例”的行文結(jié)構(gòu),有些EDA工具筆者沒有使用過的就暫不能提供實(shí)例了。
(一)工具及書籍文檔
一、前言
對(duì)于RTL級(jí)的Asic設(shè)計(jì)所涉及到的軟件是非常之多的,筆者也并沒有每一個(gè)都使用過。
二、工具介紹
RTL代碼規(guī)則檢查工具:nlint,spyglass。這兩個(gè)軟件主要是用于檢查代碼的語法和語義錯(cuò)誤的,并且比其他的工具能檢測出更多的問題,比如說命名規(guī)格,時(shí)序風(fēng)險(xiǎn),功耗等。詳細(xì)介紹請(qǐng)參考軟件的使用教程,nlint有Windows版和linux版,軟件的linux版本和使用教程可以在eetop上搜索到。
RTL代碼仿真工具:這類仿真工具有較多的組合,比如說:qustasim/modelsim,NC_verilog Verdi,VCS DVE,VCS Verdi等等。目前筆者使用的組合是VCS Verdi。這兩個(gè)軟件是業(yè)內(nèi)主流的仿真軟件,還可以結(jié)合UVM庫進(jìn)行仿真,當(dāng)然這是驗(yàn)證方法學(xué)的內(nèi)容。
綜合工具:Design Complier。最常用的綜合工具,沒有之一,該軟件主要是將RTL代碼“翻譯 優(yōu)化 映射”成與工藝庫對(duì)應(yīng)的門級(jí)網(wǎng)表。并且還包含功耗分析軟件Power Complier和邊界掃描寄存器插入軟件 BSD Complier。
可測性設(shè)計(jì):DFT Complier TetraMAX。軟件在DC之后使用,DFT Complier 用于將設(shè)計(jì)的內(nèi)部寄存器替換成掃描寄存器并組成一條或多條掃描鏈,TetraMAX是用于自動(dòng)生成測試向量的。
形式驗(yàn)證工具:Formality、Conforml(candence出品)。等價(jià)性驗(yàn)證工具,主要是在DFT Complier插入掃描鏈之后進(jìn)行驗(yàn)證,另外,在版圖綜合時(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
三、書籍推薦
《Verilog HDL 硬件描述語言》
《設(shè)計(jì)與驗(yàn)證Verilog HDL》
《企業(yè)用verilog代碼風(fēng)格規(guī)范》
《verilog語言編碼風(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í)序分析與建?!?/p>
《CMOS集成電路后端設(shè)計(jì)與實(shí)戰(zhàn)》
《makefile教程》
《鳥哥的私房菜》
《SystemVerilog與功能驗(yàn)證》
《UVM實(shí)戰(zhàn)》
《通信IC設(shè)計(jì)(上下冊(cè))》
《數(shù)字圖像處理與圖像通信》
《數(shù)字信號(hào)處理的FPGA實(shí)現(xiàn)中文版》
各類Synopsy userguide,EETOP有16年版的。
三、工藝庫說明
使用DC,PT,F(xiàn)M,ICC或者ENCOUNTER軟件需要工藝庫文件,主要包括數(shù)字邏輯單元文件,符號(hào)庫,綜合庫,寄生電容參數(shù)庫,版圖文件LEF,milkway庫等等。
有關(guān)工藝庫各文件夾的作用,筆者將會(huì)在將“工藝庫說明”的章節(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è)鏈接到軟件庫的一個(gè)軟件,隨后安裝軟件需要用到。https://jingyan.baidu.com/article/b24f6c8239c6aa86bee5da60.html
注意:該教程某些步驟可能會(huì)失效,需要結(jié)合自己具體的情況使用。安裝好YUM之后,可以使用yum install gvim命令測試一下。
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的問題。用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上,小伙伴們的教程。
(三)工藝庫說明
(略,請(qǐng)點(diǎn)擊閱讀原文查看)
(四)RTL設(shè)計(jì)
數(shù)字電路設(shè)計(jì)
RTL設(shè)計(jì)所需要的理論知識(shí)龐雜而繁多,本文所介紹的內(nèi)容均由個(gè)人參閱了許多書籍之后加以整合的,很多內(nè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è)人沒有能力也沒有必要將每一部分的內(nèi)容都詳細(xì)的羅列出來,所以這里只是整理出一些需要把握的關(guān)鍵點(diǎn)。至于具體的內(nèi)容,還請(qǐng)大家按照個(gè)人需求,參閱推薦的各類書籍。
一、基礎(chǔ)
組合邏輯與時(shí)序邏輯:布爾代數(shù),卡諾圖,基本與非門,鎖存器,觸發(fā)器,沖突與冒險(xiǎn)?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》
Verilog語言基礎(chǔ):數(shù)值類型,表達(dá)式與運(yùn)算符,assign語句,always語句,if-else語句,case語句,阻塞與非阻塞。——《Verilog HDL 硬件描述語言》
狀態(tài)機(jī):一段式、二段式、三段式狀態(tài)機(jī)的區(qū)別;獨(dú)熱碼、二進(jìn)制碼、格雷碼的區(qū)別及應(yīng)用場合?!禫erilog 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ù)字電路都可以劃分為簡單的兩種類型——控制通路與數(shù)據(jù)通路,控制通路的核心是狀態(tài)機(jī),數(shù)據(jù)通路是各類算術(shù)處理算法、并行總線等等。——《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》
Testbench驗(yàn)證:無論什么電路,最終都需要驗(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)開始的?!秜erilogHDL代碼風(fēng)格規(guī)范》。初學(xué)者推薦使用windows版qustasim 或者modelsim 仿真工具,簡單又方便,以后可學(xué)習(xí)使用VCS Verdi(比較折騰人)。
二、進(jìn)階
代碼風(fēng)格:良好的代碼風(fēng)格很有必要,參考一下企業(yè)用的代碼風(fēng)格,有助于個(gè)人養(yǎng)成良好的編碼習(xí)慣?!镀髽I(yè)用verilog代碼風(fēng)格規(guī)范》《verilog語言編碼風(fēng)格》
基本常用電路:具備以上龐雜的理論基礎(chǔ)之后,需要積累一些常用的基礎(chǔ)電路。——《華為Verilog典型電路設(shè)計(jì)》
接口電路,I2C,UART,SPI:接口電路是中小規(guī)模芯片常用的對(duì)外接口電路,無論是與上位機(jī)(PC)通信還是控制其它芯片。I2C從機(jī)常用于EEPROM芯片中,主機(jī)可以直接使用單片機(jī)模擬,ARM單片機(jī)直接集成了I2C主機(jī),I2C的IP代碼網(wǎng)絡(luò)上有現(xiàn)成的;UART是全雙工電路,宏晶單片機(jī)通過UART進(jìn)行燒錄,SPI電路最常用于SD卡上?!禫erilog HDL高級(jí)數(shù)字設(shè)計(jì)》《通信IC設(shè)計(jì)(上下冊(cè))》有簡單的UART和SPI的代碼。
RISC,8051 MCU ——IP:通過下載EETOP上相關(guān)的IP及文檔來學(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全雙工串口示例代碼,代碼來源于《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》,隨后的章節(jié)將會(huì)使用到該示例代碼,代碼功能細(xì)節(jié)需結(jié)合書籍了解。
下面的代碼已經(jīng)過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以及說明如何在questa/modelsim、VCS DVE、VCS Verdi工具中使用。推薦書籍:《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í)無法涉及,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)行仿真,一定要注意文件路徑問題。
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)問題,需要學(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ì)
(十二)可測性設(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)于華為海思,這篇文章值得一看
俄國沒有高端芯片,為什么卻能造出一流武器?
別攔我,我要做芯片!
芯片春秋·ARM傳
中國芯酸往事
印度芯酸往事
國防軍工芯片行業(yè)深度報(bào)告
一位美國芯片公司華人高管對(duì)中國芯片行業(yè)的思考
學(xué)習(xí)、積累、交流-IC設(shè)計(jì)高手的成長之路
女生學(xué)微電子是一種什么體驗(yàn)?
MIPS架構(gòu)開放了,10天設(shè)計(jì)一款完全免費(fèi)的MIPS處理器(附源碼)
性能之殤:從馮·諾依曼瓶頸談起
AI芯片設(shè)計(jì)與開發(fā)概覽
AI 芯片和傳統(tǒng)芯片有何區(qū)別?
一個(gè)資深工程師老王關(guān)于AI芯片的技術(shù)感悟
隔隔壁老王:AI芯片與她怎么選?
終于有人把云計(jì)算、大數(shù)據(jù)和人工智能講明白了!
尺寸減半、功率翻番!——氮化鎵技術(shù)的現(xiàn)在和未來
邏輯綜合 Design Compiler 資料大全
集成電路制造技術(shù)簡史
版圖中Metal專題——線寬選擇
麒麟980內(nèi)核照片:NPU在哪呢?
有哪些只有IC工程師才能get到的梗?
為什么7nm工藝制程這么難?從7nm看芯片行業(yè)的“貧富差距”
什么是臺(tái)積電的SoIC?
RISC-V打入主流市場的諸多問題
RISC-V架構(gòu)有何優(yōu)勢?
關(guān)于RISC-V 終于有人講明白了!
ASIC低功耗設(shè)計(jì)實(shí)例分析及書籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之可測性設(shè)計(jì)及書籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之靜態(tài)時(shí)序分析概要及書籍推薦
ASIC設(shè)計(jì)學(xué)習(xí)總結(jié)之工具及書籍文檔
小芯片大價(jià)值 | ASIC工程師如此值錢到底為什么?
芯片面積估計(jì)方法簡介
自主研發(fā)通信芯片有多難?通信行業(yè)老兵告訴你,沒那么簡單!
RISC-V精簡到何種程度?能省的都省了!
多核CPU設(shè)計(jì)及RISC-V相關(guān)資料
時(shí)序設(shè)計(jì)與約束資料匯總
模擬版圖講義
GDSII轉(zhuǎn)DEF的flow簡介
機(jī)器學(xué)習(xí)將越來越依賴FPGA和SoC
Verilog基本功之:流水線設(shè)計(jì)Pipeline Design
先進(jìn)封裝發(fā)展趨勢分析PPT
先進(jìn)封裝發(fā)展現(xiàn)狀分析PPT
可測試性設(shè)計(jì)與ATPG
麒麟980是如何誕生的?敢于失敗,勇于嘗試?。ǜ剑喝A為早期型號(hào)處理器研發(fā)過程)
IC模擬版圖設(shè)計(jì)講義
Verilog CPU設(shè)計(jì)實(shí)例
。。。。
(共260篇)
點(diǎn)擊閱讀原文查看作者博客