|
個(gè)人學(xué)習(xí)筆記,不喜勿噴。

緒論:
1.計(jì)算:算法和數(shù)據(jù)結(jié)構(gòu)、編程語(yǔ)言、體系結(jié)構(gòu)、軟件、硬件設(shè)計(jì)方法。
2.算法:解決特定問(wèn)題的有序步驟。
3.數(shù)據(jù)結(jié)構(gòu):解決特定問(wèn)題的相應(yīng)模型。
4.C程序是一行接一行依次執(zhí)行的,屬于順序結(jié)構(gòu);而Verilog描述的硬件是可以在同一時(shí)間同時(shí)運(yùn)行的,屬于并行結(jié)構(gòu)。
第一部分:Verilog數(shù)字設(shè)計(jì)基礎(chǔ)
基本概念:
1.元件的輸出口都規(guī)定在第一個(gè)端口;
2.#1表示延時(shí)1個(gè)時(shí)間單位;
3.并行性,層次結(jié)構(gòu)性、可綜合性、測(cè)試平臺(tái);
4.實(shí)例化或?qū)嵗茫?br />
5.verilog程序由模塊構(gòu)成。每個(gè)模塊的內(nèi)容都是位于module和endmodule兩個(gè)語(yǔ)句之間。每個(gè)模塊實(shí)現(xiàn)特定的功能;
6.模塊是可以進(jìn)行層次嵌套的;
7.如果每個(gè)模塊都是可以綜合的,則通過(guò)綜合工具可以把他們的功能描述全部轉(zhuǎn)換為最基本的邏輯單元描述,最后可以用一個(gè)上層模塊通過(guò)實(shí)例引用把這些模塊連接起來(lái),把他們整合成一個(gè)很大的邏輯系統(tǒng);
8.模塊分為兩種:一種是為了讓模塊最終生成電路的結(jié)構(gòu),另一種只是為了測(cè)試所設(shè)計(jì)電路的邏輯功能是否正確;
9.每個(gè)模塊要進(jìn)行端口定義,并說(shuō)明輸入口、輸出口,然后對(duì)模塊的功能進(jìn)行描述;
10.除了endmodule語(yǔ)句外,每個(gè)語(yǔ)句和數(shù)據(jù)定義的最后必須用分號(hào)。
11.注釋:用//和/**/
模塊的結(jié)構(gòu)、數(shù)據(jù)類型、變量和基本運(yùn)算符號(hào):
1.模塊中所有過(guò)程塊、連續(xù)賦值語(yǔ)句、實(shí)例引用都是并行的;
2.他們表示的是一種通過(guò)變量名互相連接的關(guān)系;
3.同一模塊中各個(gè)過(guò)程塊、各條連續(xù)賦值語(yǔ)句和各條實(shí)例引用語(yǔ)句這三者出現(xiàn)的先后次序沒(méi)有關(guān)系;
4.只有連續(xù)賦值語(yǔ)句(assign)和實(shí)例引用語(yǔ)句可以獨(dú)立于過(guò)程塊而存在于模塊的功能定義部分;
5.被實(shí)例引用的模塊,其端口可以通過(guò)不同名的連線或寄存器類型變量連接到別的模塊相應(yīng)的輸出、輸入信號(hào)端;
6.在always模塊內(nèi)被賦值的每一個(gè)信號(hào)必須定義成reg型。
7.模塊的端口定義:
模塊名(連接端口1信號(hào)名,連接端口2信號(hào)名,連接端口3信號(hào)名,......);
模塊名(.端口1名(連接信號(hào)1名),.端口2名(連接信號(hào)2名),......);
8.輸入口 input[信號(hào)位寬-1:0]端口名1;
輸出口output[信號(hào)位寬-1:0]端口名1;
輸入/輸出口inout[信號(hào)位寬-1:0]端口名1;
IO說(shuō)明也可以寫(xiě)在端口聲明語(yǔ)句中;
9.內(nèi)部信號(hào)說(shuō)明:
reg [width-1:0] R變量1,R變量2...;
wire[width-1:0] W變量1,W變量2...;
10.功能定義:用assign聲明語(yǔ)句;用實(shí)例元件;用always塊;
11.數(shù)字的表達(dá)方式:<位寬><進(jìn)制><數(shù)字>;
12.X不定值,Z高阻值;
13.參數(shù)型常數(shù)經(jīng)常用于定義延遲時(shí)間和變量寬度;
14.wire變量用來(lái)表示單個(gè)門(mén)驅(qū)動(dòng)或連續(xù)賦值語(yǔ)句驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù),常用來(lái)表示以assign 關(guān)鍵字指定的組合邏輯信號(hào);tir變量用來(lái)表示多驅(qū)動(dòng)器驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù);
15.reg型變量是數(shù)據(jù)存儲(chǔ)單元的抽象,其作用與改變觸發(fā)器存儲(chǔ)的值相當(dāng);常用來(lái)表示always模塊內(nèi)的指定信號(hào),常代表觸發(fā)器;在always模塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義為reg型;
16.Verilog中沒(méi)有多維數(shù)組存在;用memory型變量說(shuō)明;
運(yùn)算符、賦值語(yǔ)句和結(jié)構(gòu)說(shuō)明語(yǔ)句:
1.位拼接運(yùn)算符{},用一個(gè)信號(hào)名來(lái)表示由多位組成的復(fù)雜信號(hào),其中每個(gè)功能信號(hào)可以有自己獨(dú)立的名字和位寬;
2.阻塞語(yǔ)句有先有后;非阻塞語(yǔ)句在begin end之間的所有非阻塞語(yǔ)句都在同一時(shí)刻被賦值;
3.縮減運(yùn)算符為單目運(yùn)算符,第一步將操作數(shù)的第1位與第2位進(jìn)行或、與、非運(yùn)算;第2步將運(yùn)算結(jié)果與第3位進(jìn)行或、與、非運(yùn)算,以此類推,直至最后一位。
4.非阻塞語(yǔ)句所賦的變量值不能立即就為下面的語(yǔ)句所用,塊結(jié)束以后才能完成這次賦值操作,而所賦的變量值是上一次賦值所得到的,在編寫(xiě)可綜合的時(shí)序邏輯模塊時(shí),這是最常用的賦值方法;
5.阻塞語(yǔ)句的賦值語(yǔ)句執(zhí)行完成后,塊才結(jié)束,在賦值語(yǔ)句執(zhí)行完后立刻就改變,在時(shí)序邏輯中使用可能會(huì)產(chǎn)生意想不到的結(jié)果;
6. begin end語(yǔ)句用來(lái)表示順序語(yǔ)句的,每條語(yǔ)句的延時(shí)時(shí)間是相對(duì)于前一條語(yǔ)句的仿真時(shí)間而言的;fork join語(yǔ)句用來(lái)標(biāo)識(shí)并行執(zhí)行的語(yǔ)句,塊內(nèi)每條語(yǔ)句的延時(shí)時(shí)間是相對(duì)于程序流程控制進(jìn)入到塊內(nèi)的仿真時(shí)間而言的;
條件語(yǔ)句、循環(huán)語(yǔ)句、塊語(yǔ)句與生成語(yǔ)句:
1.條件語(yǔ)句必須在過(guò)程塊語(yǔ)句中使用。所謂的過(guò)程塊語(yǔ)句是指initial和always語(yǔ)句引導(dǎo)的執(zhí)行語(yǔ)句集合;
2.else總是與它最近的if配對(duì);
3.casez用來(lái)處理不用考慮高阻值z(mì)的比較過(guò)程;casex則將高阻值z(mì)和不定值都視為不必關(guān)心的情況;
4.在always塊內(nèi),如果在給定條件下變量沒(méi)有賦值,這個(gè)變量將保持原值,也就是會(huì)生成一個(gè)鎖存器;
5.forever語(yǔ)句連續(xù)執(zhí)行的語(yǔ)句,用于產(chǎn)生周期性的波形作為仿真測(cè)試信號(hào)且必須寫(xiě)在initial塊中;
6.repeat語(yǔ)句連續(xù)執(zhí)行一條語(yǔ)句N次;
7.生成塊:生成語(yǔ)句可以動(dòng)態(tài)地生成Verilog代碼,這一聲明語(yǔ)句方便了參數(shù)化模塊的生成。當(dāng)對(duì)矢量中的多個(gè)位進(jìn)行重復(fù)操作時(shí),或當(dāng)進(jìn)行多個(gè)模塊的實(shí)例引用的重復(fù)操作時(shí),或在根據(jù)參數(shù)的定義來(lái)確定程序中是否應(yīng)該包含某段Verilog代碼時(shí),使用生成語(yǔ)句能夠大大簡(jiǎn)化程序的編寫(xiě)過(guò)程;
生成語(yǔ)句能夠控制變量的聲明、任務(wù)或函數(shù)的調(diào)用,還能對(duì)實(shí)例引用進(jìn)行全面的控制。編寫(xiě)代碼時(shí)必須在模塊中說(shuō)明生成的實(shí)例范圍,關(guān)鍵字generate endgenerate用來(lái)指定該范圍;
結(jié)構(gòu)語(yǔ)句、系統(tǒng)任務(wù)、函數(shù)語(yǔ)句和顯示系統(tǒng)任務(wù):
1.沿觸發(fā)的always塊常常描敘時(shí)序行為,如有限狀態(tài)機(jī);電平觸發(fā)的always塊常常用來(lái)描述組合邏輯行為;
2.always的OR事件控制,用“or”或“,”;
3.@*和@(*)都表示對(duì)其后面的語(yǔ)句塊中所有輸入變量的變化是敏感的。
4.函數(shù)和任務(wù)的區(qū)別:
函數(shù)只能與主模塊共用同一個(gè)仿真的時(shí)間單位,而任務(wù)可以定義自己的仿真時(shí)間單位;
函數(shù)不能啟動(dòng)任務(wù),而任務(wù)可以啟動(dòng)其他任務(wù)和函數(shù);
函數(shù)至少要有一個(gè)輸入變量,而任務(wù)可以沒(méi)有或有多個(gè)任何類型的變量;
函數(shù)返回一個(gè)值,而任務(wù)不返回值;
不管有多少任務(wù)啟動(dòng),只有當(dāng)所有的任務(wù)都完成后,控制才能返回;
5.函數(shù)的使用規(guī)則:
函數(shù)的定義不能包含有任何的時(shí)間控制語(yǔ)句;
函數(shù)不能啟動(dòng)任務(wù);
定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘浚?br />
在函數(shù)的定義中必須有一條賦值語(yǔ)句給函數(shù)中的一個(gè)內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字;
6.自動(dòng)(遞歸)函數(shù):automatic;自動(dòng)函數(shù)中聲明的局部變量不能通過(guò)層次名進(jìn)行訪問(wèn)。而自動(dòng)函數(shù)本身可以通過(guò)層次名進(jìn)行訪問(wèn);
7.$display(p1,p2,...,pn):p1 格式控制;p2,...,pn 輸出表列 自動(dòng)換行;%和表示進(jìn)制的字符中間輸入一個(gè)0自動(dòng)調(diào)整顯示輸出數(shù)據(jù)寬度的方式。
8.$write(p1,p2,...,pn):p1 格式控制;p2,...,pn 輸出表列 多行;
9.所有位不定值x;所有位高阻值z(mì);部分位不定值X;部分位高阻值Z;
10.選通顯示$strobe總是在同時(shí)刻的其他賦值語(yǔ)句執(zhí)行完成后才執(zhí)行,可以確保所有在同一時(shí)鐘沿賦值的其他語(yǔ)句在執(zhí)行完畢之后才顯示數(shù)據(jù);
調(diào)試用系統(tǒng)任務(wù)和常用的編譯預(yù)處理語(yǔ)句:
1.在多模塊調(diào)試的情況下,$monitor需配合$monitoron與$monitoroff使用;
2.$monitor是連續(xù)監(jiān)測(cè)數(shù)據(jù)的變化,只要在測(cè)試模塊initial塊中調(diào)用一次就可以監(jiān)視被測(cè)試模塊的所有感興趣的信號(hào);
3. $time用在$monitor中,用來(lái)做時(shí)間標(biāo)記;
4.$stop和$finish用在測(cè)試模塊的initial模塊中,配合時(shí)間延遲用來(lái)控制仿真的持續(xù)時(shí)間;
5.$random用來(lái)產(chǎn)生邊沿不穩(wěn)定的波形和隨機(jī)出現(xiàn)的脈沖;
6.$readmem用來(lái)生成給定的復(fù)雜數(shù)據(jù)流。復(fù)雜數(shù)據(jù)可以用c語(yǔ)言產(chǎn)生,存在文件中。用 $readmem取出存入存儲(chǔ)器,再按節(jié)拍輸出,這在驗(yàn)證算法邏輯時(shí)特別有用;
7.當(dāng)多個(gè)‘timescale定義的模塊包含在一起時(shí),只有最后一個(gè)才能起作用;
8 .宏定義字符串引用時(shí)或include等編譯預(yù)處理必須用‘引導(dǎo);
9.預(yù)處理命令以符號(hào)”`”開(kāi)頭;
10.宏定義命令的有效范圍為定義命令之后到源文件結(jié)束; 在引用已定義的宏名時(shí),必須在宏名的前面加上“`”,表示該名字是一個(gè)經(jīng)過(guò)宏定義的名字;宏定義不必在宏名后面加分號(hào);
11.條件執(zhí)行僅能用于行為語(yǔ)句,系統(tǒng)任務(wù)關(guān)鍵字$test$plusargs ,用于測(cè)試調(diào)用的參數(shù)值;
第二部分:設(shè)計(jì)和驗(yàn)證部分
只有經(jīng)過(guò)艱苦的練習(xí)才能掌握設(shè)計(jì)的訣竅;
Verilog HDL模型的不同抽象級(jí)別:
1.nand #10 nd1(a,data,clock,clear);在模塊中使用了一個(gè)名為nd1的與非門(mén),輸入為data\clock\clear,輸出為a,輸出與輸入的延時(shí)為10個(gè)單位時(shí)間;
2.D型主從觸發(fā)器模塊
3.能把行為級(jí)的Verilog模塊自動(dòng)轉(zhuǎn)換為門(mén)級(jí)結(jié)構(gòu)的工具叫做綜合器;
4.#time(觸發(fā)的時(shí)刻)->(時(shí)間名)
5.UDP只能有一個(gè)輸出端,而且必定是端口說(shuō)明列表的第一項(xiàng);可以有多個(gè)輸入端,最多允許10個(gè)輸入端;所有端口變量必須是標(biāo)量,也就是必須是1位的;在UDP的真值表中,只允許出現(xiàn)0,1,X三種邏輯值;只有輸出端口才可以被定義為寄存器類型變量;initial語(yǔ)句用于為時(shí)序電路寄存器賦初值,只允許賦0,1,X的3種邏輯值,默認(rèn)為X.
如何編寫(xiě)和驗(yàn)證簡(jiǎn)單的純組合邏輯模塊:
1.加法器
module add_4(X,Y,sum,C);
input[3:0] X,Y;
output[3:0]sum;
output C;
assign {C,sum}=X+Y;
endmodule
2.乘法器
module mult_4(X,Y,Product);
input[3:0]X,Y;
output[3:0] Product;
assign Product=X*Y;
endmodule
3.比較器
module compare_n(X,Y,XGY,XSY,XEY);
input[width-1:0] X,Y;
output XGY,XSY,XEY;
reg XGY,XSY,XEY;
parameter width=8;
always@(X or Y)
begin
if(X==Y)
XEY=1;
else XEY=0;
if(X>Y)
XGY=1;
else XGY=0;
if(X<Y)
XSY=1;
else XSY=0;
end
endmodule
4.多路選擇器
module Mux_8 (addr,in1,in2,in3,in4,in5,in6,in7,in8,Mout,nCS);
input[2:0]addr;
input[width-1:0]in1,in2,in3,in4,in5,in6,in7,in8;
input nCS;
output[width-1:0]Mout;
reg[width-1:0]Mout;
parameter width=8;
always@(addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or nCS)
begin
if(!nCS)
case(addr)
3`b000:Mout=in1;
3`b001:Mout=in2;
3`b010:Mout=in3;
3`b011:Mout=in4;
3`b100:Mout=in5;
3`b101:Mout=in6;
3`b110:Mout=in7;
3`b111:Mout=in8;
endcase
else
Mout=0;
end
endmodule
5.總線和總線操作
module SampleOfBus(DataBus,link_bus,wirte);
inout[11:0] DataBus;
input link_bus;
reg[11:0]outsigs;
reg[13:0]insigs;
assign DataBus=(link_bus)?outsigs:12`hzzz;
always@(posedge write)
begin
insigs<=DataBus*3;
end;
endmodule;
6.流水線
復(fù)雜數(shù)字系統(tǒng)構(gòu)成:
1.組合邏輯:邏輯電路沒(méi)有記憶部件;時(shí)序邏輯:邏輯電路有記憶部分;
2.同步有限狀態(tài)機(jī);
3.數(shù)據(jù)流動(dòng)的控制;
4.在VerilogHDL設(shè)計(jì)中啟用同步時(shí)序邏輯;確定下一個(gè)狀態(tài)所使用的組合電路的延遲與時(shí)鐘到各觸發(fā)器的差值必須小于一個(gè)時(shí)鐘周期的寬度:全局時(shí)鐘網(wǎng)絡(luò)布線時(shí)盡量使各分支的時(shí)鐘保持一致;采用平衡樹(shù)結(jié)構(gòu),在每一級(jí)加入緩沖器,使到達(dá)每個(gè)觸發(fā)器時(shí)鐘端的時(shí)鐘同步。
在后防真時(shí),若邏輯與預(yù)想設(shè)計(jì)的不一樣,可降低時(shí)鐘頻率,這就可能消除由于時(shí)鐘過(guò)快引起的觸發(fā)器輸入端由延遲和冒險(xiǎn)競(jìng)爭(zhēng)造成的不穩(wěn)定,從而使邏輯正確。
5.數(shù)據(jù)接口的同步方法:
前級(jí)輸出的延時(shí)是隨機(jī)的,或者有可能變動(dòng),如何在后級(jí)完成數(shù)據(jù)的同步?可以使用使數(shù)據(jù)通過(guò)RAM或者FIFO的緩存再讀取的方法,達(dá)到數(shù)據(jù)的同步的目的,這種做法的關(guān)鍵是必須要有堆棧滿和空的指示信號(hào)來(lái)管理數(shù)據(jù)的寫(xiě)入和讀取,以防止數(shù)據(jù)的丟失;
數(shù)據(jù)有固定的幀格式,數(shù)據(jù)的起始位置如何確定?用同步頭表示數(shù)據(jù)信號(hào)的起始,或者使用RAM\FIFO來(lái)緩存數(shù)據(jù)再傳送到下一級(jí)。找到數(shù)據(jù)頭的方法有兩個(gè),一個(gè)增加一條表示數(shù)據(jù)起始位置的信號(hào)線,第二種對(duì)于異步系統(tǒng),在數(shù)據(jù)中插入一段有特殊碼型的同步碼,接收端通關(guān)相關(guān)運(yùn)算檢測(cè)到同步頭。
級(jí)聯(lián)的兩個(gè)模塊的基本時(shí)鐘是異步時(shí)域的,如何把前級(jí)輸出的數(shù)據(jù)準(zhǔn)確地傳送到下一級(jí)模塊中?對(duì)輸入數(shù)據(jù)做兩次以上的采樣寄存。 只適用于允許發(fā)生少量錯(cuò)誤的電路功能單元;
為避免由異步時(shí)鐘域產(chǎn)生的錯(cuò)誤,經(jīng)常使用雙口的RAM、FIFO緩存的方法完成異步時(shí)鐘域之間的數(shù)據(jù)傳送。在輸入端口使用前級(jí)時(shí)鐘寫(xiě)數(shù)據(jù),在輸出端口使用本級(jí)時(shí)鐘讀數(shù)據(jù),并有緩沖器空或滿的控制信號(hào)來(lái)管理數(shù)據(jù)的讀寫(xiě)。
同步狀態(tài)機(jī)的原理、結(jié)構(gòu)和設(shè)計(jì):
1. 如果時(shí)序邏輯的輸出不但取決于狀態(tài)還取決于輸入,成為Mealy狀態(tài)機(jī);而有些時(shí)序邏輯的輸出只取決于當(dāng)前狀態(tài),這樣的電路稱為Moore狀態(tài)機(jī);
2.在設(shè)計(jì)高速電路時(shí),常常有必要使?fàn)顟B(tài)機(jī)的輸出與時(shí)鐘幾乎完全同步。第一種方法是把狀態(tài)變量直接用作輸出;輸出編碼的狀態(tài)指定;其輸出組合邏輯部分只有連線,沒(méi)有其他組合邏輯部件;第二種方法是在輸出邏輯后面在加一組與時(shí)鐘同步的寄存器輸出流水線寄存器,讓所有的輸出信號(hào)在下一個(gè)信號(hào)時(shí)鐘跳變沿同時(shí)存入寄存器組,即完全同步的輸出,把這種輸出稱為流水線化的輸出;
3.獨(dú)熱碼;
4.在比較復(fù)雜的狀態(tài)機(jī)設(shè)計(jì)過(guò)程中,往往把狀態(tài)的變化與輸出開(kāi)關(guān)的控制分成兩個(gè)部分來(lái)考慮;把每一個(gè)輸出開(kāi)關(guān)寫(xiě)成一個(gè)個(gè)獨(dú)立的always組合塊;
5.有限狀態(tài)機(jī)設(shè)計(jì)的一般步驟:
1】邏輯抽象,得出狀態(tài)轉(zhuǎn)換圖 分析給定的邏輯問(wèn)題,確定輸入量和輸出量以及電路的狀態(tài)數(shù);取原因?yàn)檩斎,取結(jié)果為輸出;定義輸入、輸出邏輯狀態(tài)的含義,并將電路狀態(tài)順序編號(hào);按照要求列出電路的狀態(tài)轉(zhuǎn)換表或畫(huà)出狀態(tài)轉(zhuǎn)換圖;
2】狀態(tài)化簡(jiǎn)
3】狀態(tài)分配 狀態(tài)編碼 獨(dú)熱碼
4】選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動(dòng)方程和輸出方程
5】按照方程得到邏輯圖
設(shè)計(jì)可綜合的狀態(tài)機(jī)的指導(dǎo)原則:
1.綜合的一般原則:
1】綜合之前一定要進(jìn)行仿真;
2】每一次布局布線之后都要進(jìn)行仿真,在器件編程或流片之前要做最后的仿真;
3】避免用綜合器來(lái)設(shè)計(jì)異步狀態(tài)機(jī);用電路圖輸入的方法來(lái)設(shè)計(jì);
4】如果要為電平敏感的鎖存器建模,使用連續(xù)賦值語(yǔ)句是最簡(jiǎn)單的方法;
2.語(yǔ)言指導(dǎo)原則:
1】每個(gè)always塊只能有一個(gè)事件控制“@(event-expression)”,而且要跟在always關(guān)鍵字的后面;
2】不推薦使用always塊即表示電平敏感的透明鎖存器有同時(shí)表示組合邏輯;
3】帶有posedge或negedge關(guān)鍵字的事件表達(dá)式表示沿觸發(fā)的時(shí)序邏輯,沒(méi)有該關(guān)鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時(shí)序和組合邏輯的事件控制表達(dá)式中,如有多個(gè)沿和多個(gè)電平,期間必須用關(guān)鍵字“or”連接;
4】每個(gè)表示時(shí)序always塊只能由一個(gè)時(shí)鐘跳變沿觸發(fā),置位或復(fù)位最好也有該時(shí)鐘跳變沿觸發(fā);
5】每個(gè)在always塊中賦值飛信號(hào)都必須定義為reg型或整型;
6】always塊中應(yīng)該避免組合反饋回路,也就是說(shuō),用always塊設(shè)計(jì)組合邏輯電路時(shí),在生成組合邏輯的always塊中參與賦值的所有信號(hào)都必須有明確的值;
7】對(duì)一個(gè)寄存器和整型變量給定位的賦值,只允許在一個(gè)always塊內(nèi)進(jìn)行,如在另一always塊中也對(duì)其賦值,這是非法的;
8】把某一信號(hào)值賦為·bx,綜合器就把他解釋成無(wú)關(guān)狀態(tài),因而綜合器為其生成的硬件電路最簡(jiǎn)潔;
3.狀態(tài)機(jī)的異步復(fù)位與置位:列入always塊的事件控制括號(hào)內(nèi)就能觸發(fā)always塊的執(zhí)行;
4.狀態(tài)機(jī)的同步復(fù)位與置位:不要把set和reset信號(hào)列入always塊的事件控制表達(dá)式,always塊的執(zhí)行只由時(shí)鐘有效跳變沿觸發(fā)。set和reset的電平持續(xù)時(shí)間必須大于時(shí)鐘沿的間隔時(shí)間;
深入理解阻塞和非阻塞賦值的不同:
1.時(shí)序電路建模時(shí)用非阻塞賦值語(yǔ)句;
2.鎖存器電路建模時(shí)使用非阻塞賦值語(yǔ)句;
3.用always塊寫(xiě)組合邏輯時(shí)使用阻塞賦值語(yǔ)句;
4.在同一個(gè)always塊中同時(shí)建立組合和時(shí)序邏輯電路時(shí)適應(yīng)非阻塞賦值語(yǔ)句;
5.在同一個(gè)always塊中不用同時(shí)使用阻塞語(yǔ)句和非阻塞賦值語(yǔ)句;
6.不要在多個(gè)always塊中為同一個(gè)變量賦值;
7.用$strobe系統(tǒng)任務(wù)來(lái)顯示用非阻塞賦值的變量值;
8.在賦值時(shí)不用#0延遲;
9.非阻塞賦值的操作 只能用于對(duì)寄存器類型變量進(jìn)行賦值,只能用于initial塊和always塊等過(guò)程中,而非阻塞賦值不允許用于連續(xù)賦值;
對(duì)于大多數(shù)的電路系統(tǒng)工程師來(lái)說(shuō),應(yīng)嘎盡量利用商業(yè)化的虛擬模塊來(lái)設(shè)計(jì)自己的電路系統(tǒng)。
詞匯代碼的編寫(xiě)標(biāo)準(zhǔn):
1. 每一個(gè)Verilog源文件中只準(zhǔn)編寫(xiě)一個(gè)模塊,也不要把一個(gè)模塊分成幾部分或?qū)懺趲讉(gè)源文件中;
2. 源文件的名字應(yīng)該與文件內(nèi)容有關(guān),最好一致;
3.每行只寫(xiě)一個(gè)聲明語(yǔ)句或說(shuō)明;
4.用一層層縮進(jìn)的格式來(lái)寫(xiě);
5. 用戶定義變量名的大小寫(xiě)應(yīng)該自始至終一致(例如,變量名第一個(gè)字母大寫(xiě));
6.用戶定義變量名應(yīng)該有意義,而且含有一定的有關(guān)信息。而局部變量名可以簡(jiǎn)單扼要的;
7.通過(guò)注釋對(duì)Verilog源代碼作必要的說(shuō)明,對(duì)接口做必要的注釋很重要;
8.盡可能多的使用參數(shù)和宏定義,而不要在源代碼的語(yǔ)句中直接使用字母、數(shù)字和字符串;
可綜合代碼的編寫(xiě)標(biāo)準(zhǔn):
1. 把設(shè)計(jì)分割成較小的功能塊,每一塊用行為風(fēng)格去設(shè)計(jì)這些塊。除了設(shè)計(jì)中對(duì)速度相應(yīng)要求比較臨界的部分外,都應(yīng)避免使用門(mén)級(jí)描述;
2.應(yīng)建立一個(gè)定義得很好的時(shí)鐘策略,并在verilog源代碼中清洗的體現(xiàn)這些策略(例如采用單時(shí)鐘、多相位時(shí)鐘、經(jīng)過(guò)門(mén)產(chǎn)生的時(shí)鐘和多時(shí)鐘域等)。保證在Verilog源代碼中的時(shí)鐘和復(fù)位信號(hào)是干凈的(即不是由組合邏輯或沒(méi)有考慮到的門(mén)產(chǎn)生的);
3.要建立一個(gè)定義的很好的測(cè)試策略,并認(rèn)真編寫(xiě)其Verilog代碼,使所有的觸發(fā)器都是可復(fù)位的,使測(cè)試能通過(guò)外部引腳進(jìn)行,又沒(méi)有冗余的功能;
4.每個(gè)源代碼都必須遵守并符合在always聲明語(yǔ)句中介紹過(guò)的某一種可綜合標(biāo)準(zhǔn)模板;
5. 描述組合和鎖存邏輯的always塊,必須在always塊開(kāi)頭的控制事件列表中列出所有的輸入信號(hào);
6. 描述組合邏輯的always塊一定不能有不完全賦值,也就是說(shuō)所有的輸出變量必須被各輸入值的組合賦值,不能有例外;
7.描述組合和鎖存邏輯的always塊一定不能包含反饋,也就是說(shuō)在always快中已被定義為輸出的寄存器變量絕不能在該always塊中讀進(jìn)來(lái)作為輸入信號(hào);
8. 時(shí)鐘沿觸發(fā)的always必須是單時(shí)鐘的,并且任何異步控制輸入(通常為復(fù)位或置位信號(hào))必須在控制事件列表中列出;
9.避免生成不需要的鎖存器。在無(wú)時(shí)鐘的always塊中,由于有的輸出變量被賦予某個(gè)信號(hào)的變量值,而該信號(hào)變量沒(méi)有在always塊的電平敏感控制事件中列出,這會(huì)在綜合中生成不想要的鎖存器;
10.避免不想要的觸發(fā)器。在時(shí)鐘邊沿觸發(fā)的always塊中,用非阻塞語(yǔ)句對(duì)寄存器類型的變量賦值,綜合后會(huì)生成觸發(fā)器;或者當(dāng)寄存器類型的變量在時(shí)鐘邊沿觸發(fā)的always塊中經(jīng)過(guò)多次循環(huán)其值保持不變,綜合后也會(huì)生成觸發(fā)器;
11.所有內(nèi)部寄存器必須是可復(fù)位的,這是為了使RTL級(jí)和門(mén)級(jí)描述能夠被復(fù)位成同一個(gè)已知的狀態(tài)以便進(jìn)行門(mén)級(jí)邏輯驗(yàn)證,但這并不適用于流水線或同步寄存器;
12.對(duì)存在無(wú)效狀態(tài)的有限狀態(tài)機(jī)和其他時(shí)序電路,如果想要在這些無(wú)效狀態(tài)下,硬件的行為也能夠被完全被控制,那么必須用Verilog明確地描述所有的2的n次冪種狀態(tài)下的行為,當(dāng)然要包括無(wú)效狀態(tài)。
13.賦值語(yǔ)句中不要使用延遲,而在Verilog塊的RTL級(jí)描述中需要解決零延遲時(shí)鐘的傾斜問(wèn)題例外;
14.不要使用整型和time型寄存器,否則將分別綜合成32位和64位總線;
15.仔細(xì)檢查Verilog代碼中使用動(dòng)態(tài)指針、循環(huán)聲明或算術(shù)運(yùn)算部分,因?yàn)檫@類代碼在綜合后會(huì)生成大量的門(mén),而且很難進(jìn)行優(yōu)化;
設(shè)計(jì)流程:
1 系統(tǒng)分析和指標(biāo)確定
2 系統(tǒng)劃分
頂級(jí)模塊
模塊大小估計(jì)
預(yù)布局
3 模塊級(jí)設(shè)計(jì),對(duì)每一模塊
寫(xiě)RTL級(jí)Verilog
綜合代碼檢測(cè)
寫(xiě)測(cè)試文件
仿真
寫(xiě)綜合約束、邊界條件和層次
預(yù)綜合以分析門(mén)的數(shù)量和延時(shí)
4 芯片綜合
寫(xiě)測(cè)試文件
仿真
綜合
門(mén)級(jí)仿真
5 測(cè)試
修改門(mén)級(jí)網(wǎng)表以便進(jìn)行測(cè)試;
產(chǎn)生測(cè)試矢量;
對(duì)可測(cè)試網(wǎng)表進(jìn)行仿真;
6 布局布線以使設(shè)計(jì)的邏輯電路能放入芯片;
7 布局布線后仿真、故障覆蓋仿真和定時(shí)分析;
|
|