




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Verilog初學(xué)者必看先記下來(lái):1、不使用初始化語(yǔ)句;2、不使用延時(shí)語(yǔ)句;3、不使用循環(huán)次數(shù)不確定的語(yǔ)句,如:forever,while等;4、盡量采用同步方式設(shè)計(jì)電路;5、盡量采用行為語(yǔ)句完成設(shè)計(jì);6、always過(guò)程塊描述組合邏輯,應(yīng)在敏感信號(hào)表中列出所有的輸入信號(hào);7、所有的內(nèi)部寄存器都應(yīng)該可以被復(fù)位;8、用戶(hù)自定義原件(UDP元件)是不能被綜合的。一:基本Verilog中的變量有線網(wǎng)類(lèi)型和寄存器類(lèi)型。線網(wǎng)型變量綜合成wire,而寄存器可能綜合成WIRE,鎖存器和觸發(fā)器,還有可能被優(yōu)化掉。二:verilog語(yǔ)句結(jié)構(gòu)到門(mén)級(jí)的映射1、連續(xù)性賦值:assign連續(xù)性賦值語(yǔ)句邏輯結(jié)構(gòu)上就是將等
2、式右邊的驅(qū)動(dòng)左邊的結(jié)點(diǎn)。因此連續(xù)性賦值的目標(biāo)結(jié)點(diǎn)總是綜合成由組合邏輯驅(qū)動(dòng)的結(jié)點(diǎn)。Assign語(yǔ)句中的延時(shí)綜合時(shí)都將忽視。2、過(guò)程性賦值:過(guò)程性賦值只出現(xiàn)在always語(yǔ)句中。阻塞賦值和非阻塞賦值就該賦值本身是沒(méi)有區(qū)別的,只是對(duì)后面的語(yǔ)句有不同的影響。建議設(shè)計(jì)組合邏輯電路時(shí)用阻塞賦值,設(shè)計(jì)時(shí)序電路時(shí)用非阻塞賦值。過(guò)程性賦值的賦值對(duì)象有可能綜合成wire, latch,和flip-flop,取決于具體狀況。如,時(shí)鐘控制下的非阻塞賦值綜合成flip-flop。過(guò)程性賦值語(yǔ)句中的任何延時(shí)在綜合時(shí)都將忽略。建議同一個(gè)變量單一地使用阻塞或者非阻塞賦值。3、邏輯操作符:邏輯操作符對(duì)應(yīng)于硬件中已有的邏輯門(mén),一
3、些操作符不能被綜合:=、!=。4、算術(shù)操作符:Verilog中將reg視為無(wú)符號(hào)數(shù),而integer視為有符號(hào)數(shù)。因此,進(jìn)行有符號(hào)操作時(shí)使用integer,使用無(wú)符號(hào)操作時(shí)使用reg。5、進(jìn)位:通常會(huì)將進(jìn)行運(yùn)算操作的結(jié)果比原操作數(shù)擴(kuò)展一位,用來(lái)存放進(jìn)位或者借位。如:Wire 3:0 A,B;Wire 4:0 C;Assign C=A+B;C的最高位用來(lái)存放進(jìn)位。6、關(guān)系運(yùn)算符:關(guān)系運(yùn)算符:<,>,<=,>=和算術(shù)操作符一樣,可以進(jìn)行有符號(hào)和無(wú)符號(hào)運(yùn)算,取決于數(shù)據(jù)類(lèi)型是reg,net還是integer。7、相等運(yùn)算符:=,!=注意:=和!=是不可綜合的??梢赃M(jìn)行有符號(hào)或無(wú)
4、符號(hào)操作,取決于數(shù)據(jù)類(lèi)型8、移位運(yùn)算符:左移,右移,右邊操作數(shù)可以是常數(shù)或者是變量,二者綜合出來(lái)的結(jié)果不同。9、部分選擇:部分選擇索引必須是常量。10、BIT選擇:BIT選擇中的索引可以用變量,這樣將綜合成多路(復(fù)用)器。11、敏感表:Always過(guò)程中,所有被讀取的數(shù)據(jù),即等號(hào)右邊的變量都要應(yīng)放在敏感表中,不然,綜合時(shí)不能正確地映射到所用的門(mén)。12、IF:如果變量沒(méi)有在IF語(yǔ)句的每個(gè)分支中進(jìn)行賦值,將會(huì)產(chǎn)生latch。如果IF語(yǔ)句中產(chǎn)生了latch,則IF的條件中最好不要用到算術(shù)操作。Case語(yǔ)句類(lèi)似。Case的條款可以是變量。如果一個(gè)變量在同一個(gè)IF條件分支中先贖值然后讀取,則不會(huì)產(chǎn)生la
5、tch。如果先讀取,后贖值,則會(huì)產(chǎn)生latch。13、循環(huán):只有for-loop語(yǔ)句是可以綜合的。14、設(shè)計(jì)時(shí)序電路時(shí),建議變量在always語(yǔ)句中賦值,而在該always語(yǔ)句外使用,使綜合時(shí)能準(zhǔn)確地匹配。建議不要使用局部變量。15、不能在多個(gè)always塊中對(duì)同一個(gè)變量贖值16、函數(shù)函數(shù)代表一個(gè)組合邏輯,所有內(nèi)部定義的變量都是臨時(shí)的,這些變量綜合后為wire。17、任務(wù):任務(wù)可能是組合邏輯或者時(shí)序邏輯,取決于何種情況下調(diào)用任務(wù)。18、Z:Z會(huì)綜合成一個(gè)三態(tài)門(mén),必須在條件語(yǔ)句中賦值19、參數(shù)化設(shè)計(jì):優(yōu)點(diǎn):參數(shù)可重載,不需要多次定義模塊四:模塊優(yōu)化1、資源共享:當(dāng)進(jìn)程涉及到共用ALU時(shí),要考慮資
6、源分配問(wèn)題。可以共享的操作符主要有:關(guān)系操作符、加減乘除操作符。通常乘和加不共用ALU,乘除通常在其內(nèi)部共用。2、共用表達(dá)式:如:C=A+B; D=G+(A+B);兩者雖然有共用的,但是有些綜合工具不能識(shí)別可以將第二句改為:D=G+C;這樣只需兩個(gè)加法器3、轉(zhuǎn)移代碼:如循環(huán)語(yǔ)句中沒(méi)有發(fā)生變化的語(yǔ)句移出循環(huán)4、避免latch:兩種方法:1、在每一個(gè)IF分支中對(duì)變量賦值。2、在每一個(gè)IF語(yǔ)句中都對(duì)變量賦初值。5:模塊:綜合生成的存儲(chǔ)器如ROM或RAM不是一種好方法,只是成堆的寄存器,很費(fèi)資源。最好用庫(kù)自帶的存儲(chǔ)器模塊。五、驗(yàn)證:、敏感表:在always語(yǔ)句中,如果敏感表不
7、含時(shí)鐘,最好將所有的被讀取的信號(hào)都放在敏感表中。、異步復(fù)位:建議不要在異步時(shí)對(duì)變量讀取,即異步復(fù)位時(shí),對(duì)信號(hào)賦以常數(shù)值。Averilog的流行,有兩方面的原因;B verilog與VHDL相比的優(yōu)點(diǎn)C典型的verilog模塊D verilog語(yǔ)法要點(diǎn)A) verilog的流行,有兩方面的原因:1它是cadence的模擬器verilog-XL的基礎(chǔ),cadence的廣泛流行使得verilog在90年代深入人心;2它在硅谷獲得廣泛使用;B) verilog與VHDL相比的優(yōu)點(diǎn)二者的關(guān)系仿佛C與FORTRAN,具體而言:1 verilog的代碼效率更高: 比較明顯的對(duì)比:VHDL在描述一個(gè)
8、實(shí)體時(shí)采用entity/architecture模式,verilog在描述一個(gè)實(shí)體時(shí)只需用一個(gè)"module/edumodule"語(yǔ)句塊.此外verilog的高效性還在很多地方體現(xiàn)出來(lái);2 verilog支持二進(jìn)制的加減運(yùn)算:VHDL在進(jìn)行二進(jìn)制的加減運(yùn)算時(shí)使用conv_*函數(shù)或者進(jìn)行其他的定義,總之必須通知編譯器;verilog直接用形如"c=a+b"的表示二進(jìn)制的加減運(yùn)算;3綜合時(shí)可控制性好:VHDL對(duì)信號(hào)不加區(qū)分地定義為"signal",而verilog區(qū)分為register類(lèi)型的和wire類(lèi)型的;但是也有人支持VHDL,認(rèn)為v
9、erilog和VHDL的關(guān)系仿佛C和C+.C)典型的verilog模塊討論以下典型電路的verilog描述:*與非門(mén);*加法器; /即全加器* D觸發(fā)器;*計(jì)數(shù)器; /*分頻的counter* latch;*時(shí)序機(jī);*RAM; /用synopsys的*模塊引用;*預(yù)編譯;*與非門(mén)的verilog描述如下:/verilog使用和C語(yǔ)言相同的注釋方法module nd02(a1,a2,zn);/一個(gè)verilog模塊總是以module開(kāi)始,以endmodule 結(jié)束,nd02是模塊名,a1,a2,zn是模塊的3個(gè)輸入輸出信號(hào)input a1,a2; /告訴編譯器a1,a2對(duì)此模塊而言是
10、輸入,并且數(shù)據(jù)類(lèi)型是"bit"output zn; /告訴編譯器zn對(duì)此模塊而言是輸出,數(shù)據(jù)類(lèi)型也是"bit"nand (zn,a1,a2); /我理解nand是運(yùn)算符,我們不必深究verilog中的正式術(shù)語(yǔ)是什么了吧,總之這種形式表示zn=(a1 && a2);你一定已經(jīng)想到類(lèi)似的運(yùn)算符還有"not","and","or","nor","xor"了吧;除了"not",括號(hào)里的信號(hào)數(shù)可以任意,例如
11、or (z,f,g,h)表示z=f | g | h,并且延時(shí)是3個(gè)單位時(shí)間,#x表示延時(shí)x個(gè)單位時(shí)間;endmodule*加法器的verilog描述如下:module ad03d1(A,B,CI,S,CO) ;input 2:0 A,B; /表示A,B是輸入信號(hào),并且是3位矢量,上界是2,下界是0input CI;output 2:0 S;output CO;assign CO,S=A+B+CI;/一對(duì)""和""表示鏈接,即將CO和S合并成4位矢量endmodule*帶異步清零端的D觸發(fā)器的verilog描述如下:module df
12、ctnb (d,cp,cdn,q,qn);input d,cp,cdn;output q,qn;reg q,qn; /關(guān)鍵字"reg"表示q和qn是"register"類(lèi)型的信號(hào);verilog中有兩種類(lèi)型的信號(hào):"register"類(lèi)型和"wire"類(lèi)型.你可以簡(jiǎn)單地把register類(lèi)型的信號(hào)想象為某個(gè)D觸發(fā)器的輸出,而wire類(lèi)型的的信號(hào)是組合邏輯的輸出.二者的最大區(qū)別在于:你可以對(duì)register類(lèi)型的信號(hào)進(jìn)行定時(shí)賦值(用wait語(yǔ)句在特定時(shí)刻的賦值,詳見(jiàn)下面always
13、語(yǔ)句),而對(duì)于wire類(lèi)型的信號(hào)則不可.always wait (cdn=0) /表示每當(dāng)cdn=0時(shí),將要對(duì)D觸發(fā)器清零,"always"和"wait"嵌套,"wait"和""是verilog的兩個(gè)關(guān)鍵字,表示一旦有某事發(fā)生;則執(zhí)行下面的語(yǔ)句塊,"always"有點(diǎn)象C語(yǔ)言中的"if . then.","wait"和""的區(qū)別:請(qǐng)參考本模塊.wait表示本語(yǔ)句塊的進(jìn)程停止,直到"cdn=0"的條件出現(xiàn)才繼續(xù);我理解
14、在verilog中,每個(gè)最外層語(yǔ)句塊都是一個(gè)*的進(jìn)程;""(請(qǐng)看下個(gè)always語(yǔ)句)也表示本語(yǔ)句塊的進(jìn)程停止,直到后面定義"posedge cp"(即出現(xiàn)cp的上升沿)的事件出現(xiàn)才繼續(xù);也許wait和可以合二為一吧,但至少到目前verilog中wait表示"條件",表示"事件"具體運(yùn)用中,wait總是用于類(lèi)似"wait(xxx=1)"之類(lèi)的場(chǎng)合,總是用于類(lèi)似"(xxx)"或"(posedge/negedge xxx)"之類(lèi)的場(chǎng)合整句話(huà)的意思是"
15、每當(dāng)cdn等于0時(shí),則作以下事情"begin /begin.end結(jié)構(gòu)的用法類(lèi)似于pascal語(yǔ)言 q=0; qn=1; wait (cdn=1);endalways (posedge cp)/"(posedge cp)"中有兩個(gè)關(guān)鍵字:" (x)"
16、表示"每當(dāng)事件x發(fā)生","posedge x"表示"x的上升沿,"negedge x"表示"x的下降沿",整句話(huà)的意思是"每當(dāng)cp的上升沿,則作以下事情" if (cdn) /如果cdn=1(意味著清零端無(wú)效) begin
17、160; q=d; qn=q;/""表示反相 endendmodule*計(jì)數(shù)器的verilog描述如下:module count(in,set,cp,out) ;/此計(jì)數(shù)器,在cp的上升沿將輸入賦給輸出,在c
18、p的上升沿使輸出加一input 15:0 in;input set,cp;output 15:0 out;reg 15:0 out;always (posedge set) out = in;always (posedge cp) out = out+1; /verilog容許一個(gè)信號(hào)同時(shí)出現(xiàn)在等號(hào)兩端,只要它是reg類(lèi)型的endmodule*latch的描述如下:always (clk or d) if (clk) q = d;*時(shí)序機(jī)的verilog描述如下:always (posedge CLK) /D是下一
19、個(gè)狀態(tài),Q是當(dāng)前狀態(tài),e1,e2是輸入,a,b是輸出Q=D;always (Q or othercase) begin /當(dāng)Q變化或輸入e1,e2變化時(shí)D要相應(yīng)變化D = Q; /note1a = 0;b = 0;.case(Q) q1:begin q1 action; if(e1)D=d1; if(e2)D=d2; else D=d3; a = 1; /note 2 end q2:begin b = 1
20、; . end default:begin a = 0; b = 0; .endend-annotations-note 1: This is a custom expression,after reset,D should be equal to Q;note 2: In this state machine,a is only equal to 1 at state q1,in other state,a is equal
21、to 0;* RAM的verilog描述如下:module ram(din,ain,dout,aout,rd,wr);/這是一個(gè)雙口RAM,分別有:輸入端:輸入地址ain;輸入數(shù)據(jù)din;上升沿有效的寫(xiě)信號(hào)wr;/輸出端:輸出地址aout;輸出數(shù)據(jù)dout;高電平有效的讀信號(hào)rd; inout 7:0 din; input 7:0 ain,aout; input rd,wr; output 7:0 dout; reg 7:0 memory 0:255; /請(qǐng)注意這是存儲(chǔ)陣列的描述方法,描述了一個(gè)共有256個(gè)字的
22、存儲(chǔ)陣列,每個(gè)字是8位 assign dout = rd ? memoryaout : 8'bz; /"assign"關(guān)鍵字表示并行賦值語(yǔ)句的開(kāi)始"?"運(yùn)算符的作用和在C語(yǔ)言中一樣"8'bz"是一個(gè)常量,表示一個(gè)字節(jié)的高阻態(tài),其中8表示長(zhǎng)度是8bit,"'"是固定分割符,"b"表示后面的數(shù)據(jù)是以比特形式給出的,"z"表示高阻;舉例:4'ha表示長(zhǎng)4bit的數(shù)"1010"。類(lèi)似的還可舉出5'b10111,6
23、'o33等等 always (posedge wr)memoryain = din;endmodule*模塊引用假設(shè)在前面(可以是別的模塊)定義了module ram(din,ain,dout,aout,rd,wr),則引用此模塊時(shí)只需寫(xiě)ram myram(din_in_map,ain_in_map,dout_in_map,aout_in_map,rd_in_map,wr_in_map);/其中"ram"是所引用的module名,"myram"是你起的instance名,"din_in_map"等等是圖中的節(jié)點(diǎn)名,
24、和器件(module)中的"din."進(jìn)行"虛實(shí)結(jié)合"*預(yù)編譯類(lèi)似C語(yǔ)言,只需寫(xiě)include "<pathname:filename>",反上撇號(hào)""是verilog的預(yù)編譯符,類(lèi)似C中的"#".D) verilog語(yǔ)法要點(diǎn)*基本原則設(shè)計(jì)時(shí)應(yīng)該把你的系統(tǒng)劃分為計(jì)數(shù)器,觸發(fā)器,時(shí)序機(jī),組合邏輯等等可綜合的單元,對(duì)此不同的IC公司和EDA開(kāi)發(fā)商可能根據(jù)自己的見(jiàn)解和經(jīng)驗(yàn)提出不同的要求,并且對(duì)verilog程序的細(xì)節(jié)進(jìn)行自己的規(guī)定,但有一點(diǎn)是對(duì)的:即寫(xiě)硬件描述語(yǔ)言不象寫(xiě)C語(yǔ)言那樣符合語(yǔ)法就
25、行.單單符合verilog語(yǔ)法的程序可能被拒絕綜合,甚至被拒絕模擬;*最外層可以寫(xiě)什么?這里所說(shuō)的最外層是指module語(yǔ)句后的第一層,在這一層可以寫(xiě)這些可執(zhí)行語(yǔ)句:assign和nand等定義組合邏輯的語(yǔ)句,always語(yǔ)句,模塊引用語(yǔ)句,一些以"$"開(kāi)頭的系統(tǒng)定義語(yǔ)句.特別注意不可以寫(xiě)if語(yǔ)句.if語(yǔ)句只能放在always內(nèi)部.不推薦寫(xiě)wait語(yǔ)句,因?yàn)椴荒芫C合.*不可以在多個(gè)always語(yǔ)句中對(duì)一個(gè)信號(hào)賦值.1. 強(qiáng)烈建議用同步設(shè)計(jì)2.在設(shè)計(jì)時(shí)總是記住時(shí)序問(wèn)題3.在一個(gè)設(shè)計(jì)開(kāi)始就要考慮到地電平或高電平復(fù)位、同步或異步復(fù)位、上升沿或下降沿觸發(fā)等問(wèn)題,在所有模塊中都要遵守
26、它4.在不同的情況下用if和case,最好少用if的多層嵌套(1層或2層比較合適,當(dāng)在3層以上時(shí),最好修改寫(xiě)法,因?yàn)檫@樣不僅可以reduce area,而且可以獲得好的timing)5.在鎖存一個(gè)信號(hào)或總線時(shí)要小心,對(duì)于整個(gè)design,盡量避免使用latch,因?yàn)樵贒FT時(shí)很難test。6.確信所有的信號(hào)被復(fù)位,在DFT時(shí),所有的FlipFlop都是controllable,7.永遠(yuǎn)不要再寫(xiě)入之前讀取任何內(nèi)部存儲(chǔ)器(如SRAM)8.從一個(gè)時(shí)鐘到另一個(gè)不同的時(shí)鐘傳輸數(shù)據(jù)時(shí)用數(shù)據(jù)緩沖,他工作像一個(gè)雙時(shí)鐘FIFO(是異步的),可以用Async SRAM搭建Async FIFO。9.在VHDL中二維
27、數(shù)組可以使用,它是非常有用的。在VERILOG中他僅僅可以使用在測(cè)試模塊中,不能被綜合10.遵守register-in register-out規(guī)則11.像synopsys的DC的綜合工具是非常穩(wěn)定的,任何bugs都不會(huì)從綜合工具中產(chǎn)生12.確保FPGA版本與ASIC的版本盡可能的相似,特別是SRAM類(lèi)型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自帶的SRAM,ASIC版本一般用廠商提供的SRAM。13.在嵌入式存儲(chǔ)器中使用BIST14.虛單元和一些修正電路是必需的15.一些簡(jiǎn)單的測(cè)試電路也是需要的,經(jīng)常在一個(gè)芯片中有許多測(cè)試模塊16.除非低功耗不要用門(mén)控時(shí)鐘,強(qiáng)烈建議不要
28、在design中使用gate clock17.不要依靠腳本來(lái)保證設(shè)計(jì)。但是在腳本中的一些好的約束能夠起到更好的性能(例如前向加法器)18.如果時(shí)間充裕,通過(guò)時(shí)鐘做一個(gè)多鎖存器來(lái)取代用MUX19.不要用內(nèi)部tri-state, ASIC需要總線保持器來(lái)處理內(nèi)部tri-state,如IO cell。20.在top level中作pad insertion21.選擇pad時(shí)要小心(如上拉能力,施密特觸發(fā)器,5伏耐壓等),選擇合適的IO cell22.小心由時(shí)鐘偏差引起的問(wèn)題23.不要試著產(chǎn)生半周期信號(hào)24.如果有很多函數(shù)要修正,請(qǐng)一個(gè)一個(gè)地作,修正一個(gè)函數(shù)檢查一個(gè)函數(shù)25.在一個(gè)計(jì)算等式中排列每個(gè)信
29、號(hào)的位數(shù)是一個(gè)好習(xí)慣,即使綜合工具能做26.不要使用HDL提供的除法器27.削減不必要的時(shí)鐘。它會(huì)在設(shè)計(jì)和布局中引起很多麻煩,大多數(shù)FPGA有14個(gè)專(zhuān)門(mén)的時(shí)鐘通道良好代碼編寫(xiě)風(fēng)格可以滿(mǎn)足信、達(dá)、雅的要求。在滿(mǎn)足功能和性能目標(biāo)的前提下,增強(qiáng)代碼的可讀性、可移植性,首要的工作是在項(xiàng)目開(kāi)發(fā)之前為整個(gè)設(shè)計(jì)團(tuán)隊(duì)建立一個(gè)命名約定和縮略語(yǔ)清單,以文檔的形式記錄下來(lái),并要求每位設(shè)計(jì)人員在代碼編寫(xiě)過(guò)程中都要嚴(yán)格遵守。良好代碼編寫(xiě)風(fēng)格的通則概括如下: (1) 對(duì)所有的信號(hào)名、變量名和端口名都用小寫(xiě),這樣做是為了和業(yè)界的習(xí)慣保持一致;對(duì)常量名和用戶(hù)定義的類(lèi)型用大寫(xiě); (2
30、) 使用有意義的信號(hào)名、端口名、函數(shù)名和參數(shù)名; (3) 信號(hào)名長(zhǎng)度不要太長(zhǎng); (4) 對(duì)于時(shí)鐘信號(hào)使用clk 作為信號(hào)名,如果設(shè)計(jì)中存在多個(gè)時(shí)鐘,使用clk 作為時(shí)鐘信號(hào)的前綴; (5) 對(duì)來(lái)自同一驅(qū)動(dòng)源的信號(hào)在不同的子模塊中采用相同的名字,這要求在芯片總體設(shè)計(jì)時(shí)就定義好頂層子模塊間連線的名字,端口和連接端口的信號(hào)盡可能采用相同的名字; (6) 對(duì)于低電平有效的信號(hào),應(yīng)該以一個(gè)下劃線跟一個(gè)小寫(xiě)字母b 或n 表示。注意在同一個(gè)設(shè)計(jì)中要使用同一個(gè)小寫(xiě)字母表示低電平有效; (7) 對(duì)于復(fù)位
31、信號(hào)使用rst 作為信號(hào)名,如果復(fù)位信號(hào)是低電平有效,建議使用rst_n; (8) 當(dāng)描述多比特總線時(shí),使用一致的定義順序,對(duì)于verilog 建議采用bus_signalx:0的表示; (9) 盡量遵循業(yè)界已經(jīng)習(xí)慣的一些約定。如*_r 表示寄存器輸出,*_a 表示異步信號(hào),*_pn 表示多周期路徑第n 個(gè)周期使用的信號(hào),*_nxt 表示鎖存前的信號(hào),*_z 表示三態(tài)信號(hào)等; (10)在源文件、批處理文件的開(kāi)始應(yīng)該包含一個(gè)文件頭、文件頭一般包含的內(nèi)容如下例所示:文件名,作者,模塊的實(shí)現(xiàn)功能概述和關(guān)鍵特性描述,文件創(chuàng)建和修改的記錄
32、,包括修改時(shí)間,修改的內(nèi)容等; (11)使用適當(dāng)?shù)淖⑨寔?lái)解釋所有的always 進(jìn)程、函數(shù)、端口定義、信號(hào)含義、變量含義或信號(hào)組、變量組的意義等。注釋?xiě)?yīng)該放在它所注釋的代碼附近,要求簡(jiǎn)明扼要,只要足夠說(shuō)明設(shè)計(jì)意圖即可,避免過(guò)于復(fù)雜; (12)每一行語(yǔ)句獨(dú)立成行。盡管VHDL 和Verilog 都允許一行可以寫(xiě)多個(gè)語(yǔ)句,當(dāng)時(shí)每個(gè)語(yǔ)句獨(dú)立成行可以增加可讀性和可維護(hù)性。同時(shí)保持每行小于或等于72 個(gè)字符,這樣做都是為了提高代碼得可讀性; (13)建議采用縮進(jìn)提高續(xù)行和嵌套語(yǔ)句得可讀性。縮進(jìn)一般采用兩個(gè)空格,如西安交通大學(xué)SOC 設(shè)計(jì)中
33、心2 如果空格太多則在深層嵌套時(shí)限制行長(zhǎng)。同時(shí)縮進(jìn)避免使用TAB 鍵,這樣可以避免不同機(jī)器TAB 鍵得設(shè)置不同限制代碼得可移植能力; (14)在RTL 源碼的設(shè)計(jì)中任何元素包括端口、信號(hào)、變量、函數(shù)、任務(wù)、模塊等的命名都不能取Verilog 和VHDL 語(yǔ)言的關(guān)鍵字; (15)在進(jìn)行模塊的端口申明時(shí),每行只申明一個(gè)端口,并建議采用以下順序: 輸入信號(hào)的clk、rst、enables other control signals、data and address signals。然后再申明輸出信號(hào)的clk、rst、enalbes o
34、ther control signals、data signals; (16)在例化模塊時(shí),使用名字相關(guān)的顯式映射而不要采用位置相關(guān)的映射,這樣可以提高代碼的可讀性和方便debug 連線錯(cuò)誤; (17)如果同一段代碼需要重復(fù)多次,盡可能使用函數(shù),如果有可能,可以將函數(shù)通用化,以使得它可以復(fù)用。注意,內(nèi)部函數(shù)的定義一般要添加注釋?zhuān)@樣可以提高代碼的可讀性; (18)盡可能使用循環(huán)語(yǔ)句和寄存器組來(lái)提高源代碼的可讀性,這樣可以有效地減少代碼行數(shù); (19)對(duì)一些重要的always 語(yǔ)句塊定義一個(gè)有意義的標(biāo)號(hào),這樣
35、有助于調(diào)試。注意標(biāo)號(hào)名不要與信號(hào)名、變量名重復(fù); (20)代碼編寫(xiě)時(shí)的數(shù)據(jù)類(lèi)型只使用IEEE 定義的標(biāo)準(zhǔn)類(lèi)型,在VHDL 語(yǔ)言中,設(shè)計(jì)者可以定義新的類(lèi)型和子類(lèi)型,但是所有這些都必須基于IEEE 的標(biāo)準(zhǔn); (21)在設(shè)計(jì)中不要直接使用數(shù)字,作為例外,可以使用0 和1。建議采用參數(shù)定義代替直接的數(shù)字。同時(shí),在定義常量時(shí),如果一個(gè)常量依賴(lài)于另一個(gè)常量,建議在定義該常量時(shí)用表達(dá)式表示出這種關(guān)系; (22)不要在源代碼中使用嵌入式的dc_shell 綜合命令。這是因?yàn)槠渌木C合工具并不認(rèn)得這些隱含命令,從而導(dǎo)致錯(cuò)誤的或較差的綜合結(jié)果。即使
36、使用Design Compiler,當(dāng)綜合策略改變時(shí),嵌入式的綜合命令也不如放到批處理綜合文件中易于維護(hù)。這個(gè)規(guī)則有一個(gè)例外的綜合命令,即編譯開(kāi)關(guān)的打開(kāi)和關(guān)閉可以嵌入到代碼中; (23)在設(shè)計(jì)中避免實(shí)例化具體的門(mén)級(jí)電路。門(mén)級(jí)電路可讀性差,且難于理解和維護(hù),如果使用特定工藝的門(mén)電路,設(shè)計(jì)將變得不可移植。如果必須實(shí)例化門(mén)電路,我們建議采用獨(dú)立于工藝庫(kù)的門(mén)電路,如SYNOPSYS 公司提供的GTECH 庫(kù)包含了高質(zhì)量的常用的門(mén)級(jí)電路; (24)避免冗長(zhǎng)的邏輯和子表達(dá)式; (25)避免采用內(nèi)部三態(tài)電路,建議用多路選擇電路代替內(nèi)部三態(tài)電路
37、。規(guī)則 #1: 建立時(shí)序邏輯模型時(shí),采用非阻塞賦值語(yǔ)句。zC&q,sF4RE0規(guī)則 #2: 建立latch模型時(shí),采用非阻塞賦值語(yǔ)句。EDA中國(guó)門(mén)戶(hù)網(wǎng)站1X!y4m0r O B規(guī)則 #3: 在always塊中建立組合邏輯模型時(shí),采用阻塞賦值語(yǔ)句。2n$DW8?$6W0規(guī)則 #4: 在一個(gè)always塊中同時(shí)有組合和時(shí)序邏輯時(shí)時(shí),采用非阻塞賦值語(yǔ)句。'r"z T2x4p'n4U 0規(guī)則 #5: 不要在一個(gè)always塊中同時(shí)采用阻塞和非阻塞賦值語(yǔ)句。p/ulTO+
38、B0規(guī)則 #6: 同一個(gè)變量不要在多個(gè)always塊中賦值。EDA中國(guó)門(mén)戶(hù)網(wǎng)站8q%UOC%yX b:Ma規(guī)則 #7: 調(diào)用$strobe系統(tǒng)函數(shù)顯示用非阻塞賦值語(yǔ)句賦的值。EDA中國(guó)門(mén)戶(hù)網(wǎng)站$U&&wg4w-FE5a規(guī)則 #8: 不要使用#0延時(shí)賦值。組合邏輯1,敏感變量的描述完備性Verilog中,用always塊設(shè)計(jì)組合邏輯電路時(shí),在賦值表達(dá)式右端參與賦值的所有信號(hào)都必須在always (敏感電平列表)中列出,always中if語(yǔ)句的判斷表達(dá)式必須在敏感電平列表中列出。如果在賦值表達(dá)式右端引用了敏感電平列表中沒(méi)有
39、列出的信號(hào),在綜合時(shí)將會(huì)為沒(méi)有列出的信號(hào)隱含地產(chǎn)生一個(gè)透明鎖存器。這是因?yàn)樵撔盘?hào)的變化不會(huì)立刻引起所賦值的變化,而必須等到敏感電平列表中的某一個(gè)信號(hào)變化時(shí),它的作用才表現(xiàn)出來(lái),即相當(dāng)于存在一個(gè)透明鎖存器,把該信號(hào)的變化暫存起來(lái),待敏感電平列表中的某一個(gè)信號(hào)變化時(shí)再起作用,純組合邏輯電路不可能作到這一點(diǎn)。綜合器會(huì)發(fā)出警告。Example1:input a,b,c;reg e,d;always (a or b or c) begin e=d&a&b; /*d沒(méi)有在敏感電平列表中,d變化時(shí)e不會(huì)立刻變化,直到a,
40、b,c中某一個(gè)變化*/ d=e |c; endExample2:input a,b,c;reg e,d;always (a or b or c or d) begin e=d&a&b; /*d在敏感電平列表中,d變化時(shí)e立刻變化*/ d=e |c; end2,條件的描述完備性如果if語(yǔ)句和case語(yǔ)句的條件描述不完備,也會(huì)造成不必要的鎖存器。Example1:if
41、(a=1'b1) q=1'b1;/如果a=1'b0,q=? q將保持原值不變,生成鎖存器!Example2:if (a=1'b1) q=1'b1;else q=1'b0;/q有明確的值。不會(huì)生成鎖存器!Example3: reg1:0 a,q; . case (a) 2'b00 : q=2'b00;
42、0; 2'b01 : q=2'b11;/如果a=2'b10或a=2'b11,q=? q將保持原值不變,鎖存器! endcaseExample4: reg1:0 a,q; . case (a) 2'b00 : q=2'b00; 2'b01 : q=2'b11; &
43、#160; default: q=2'b00;/q有明確的值。不會(huì)生成鎖存器! endcase Verilog中端口的描述1,端口的位寬最好定義在I/O說(shuō)明中,不要放在數(shù)據(jù)類(lèi)型定義中;Example1:module test(addr,read,write,datain,dataout)input7:0 datain;input15:0 addr;input read,write;output7:
44、0 dataout; /要這樣定義端口的位寬!wire addr,read,write,datain;reg dataout;Example2:module test(addr,read,write,datain,dataout)input datain,addr,read,write;output dataout;wire15:0 addr;wire7:0 datain;wire read,write;reg7:0 dataout;
45、60; /不要這樣定義端口的位寬!2,端口的I/O與數(shù)據(jù)類(lèi)型的關(guān)系: 端口的I/O 端口的數(shù)據(jù)類(lèi)型 module內(nèi)部
46、0; module外部 input wire wire或reg output wire或reg &
47、#160; wire inout wire wire3,assign語(yǔ)句的左端變量必須是wire;直接用"="給變量賦值時(shí)左端變量必須是reg!Ex
48、ample:assign a=b; /a必須被定義為wire!*begin a=b; /a必須被定義為reg!end VHDL中STD_LOGIC_VECTOR和INTEGER的區(qū)別例如A是INTEGER型,范圍從0到255;B是STD_LOGIC_VECTOR,定義為8位。A累加到255時(shí),再加1就一直保持255不變,不會(huì)自動(dòng)反轉(zhuǎn)到0,除非令其為0;而B(niǎo)累加到255時(shí),再加1就會(huì)自動(dòng)反轉(zhuǎn)到0。所以在使用時(shí)要特別注意!以觸發(fā)器為例說(shuō)明描述的規(guī)范性1,無(wú)置位/清零的時(shí)序邏輯 always ( posedge CLK)
49、0; begin Q<=D; end2,有異步置位/清零的時(shí)序邏輯 異步置位/清零是與時(shí)鐘無(wú)關(guān)的,當(dāng)異步置位/清零信號(hào)到來(lái)時(shí),觸發(fā)器的輸出立即 被置為1或0,不需要等到時(shí)鐘沿到來(lái)才置位/清零。所以,必須要把置位/清零信號(hào) 列入always塊的事件控制表達(dá)式。 always ( posed
50、ge CLK or negedge RESET) begin if (!RESET) Q=0; else Q<=D;
51、; end3,有同步置位/清零的時(shí)序邏輯 同步置位/清零是指只有在時(shí)鐘的有效跳變時(shí)刻置位/清零,才能使觸發(fā)器的輸出分 別轉(zhuǎn)換為1或0。所以,不要把置位/清零信號(hào)列入always塊的事件控制表達(dá)式。但是 必須在always塊中首先檢查置位/清零信號(hào)的電平。 always ( posedge CLK ) begin if (!RES
52、ET) Q=0; else Q<=D; end 結(jié)構(gòu)規(guī)范性 在整個(gè)芯片設(shè)計(jì)項(xiàng)目中,行為設(shè)計(jì)和結(jié)構(gòu)設(shè)計(jì)的編碼是最重要的一個(gè)步驟。 它對(duì)邏輯綜合和布線結(jié)果、時(shí)序測(cè)定、校驗(yàn)?zāi)芰Αy(cè)試能力甚至產(chǎn)品支持
53、都有重要的影響??紤]到仿真器和真實(shí)的邏輯電路之間的差異,為了有效的 進(jìn)行仿真測(cè)試: 1,避免使用內(nèi)部生成的時(shí)鐘 內(nèi)部生成的時(shí)鐘稱(chēng)為門(mén)生時(shí)鐘(gated clock)。如果外部輸入時(shí)鐘和門(mén)生時(shí)鐘同時(shí)驅(qū)動(dòng), 則不可避免的兩者的步調(diào)不一致,造成邏輯混亂。而且,門(mén)生時(shí)鐘將會(huì)增加測(cè)試的難度 和時(shí)間。 2,絕對(duì)避免使用內(nèi)部生成的異步置位/清零信號(hào) 內(nèi)部生成的置位/清零信號(hào)會(huì)引起測(cè)試問(wèn)題。使某
54、些輸出信號(hào)被置位或清零,無(wú)法正常 測(cè)試。3,避免使用鎖存器 鎖存器可能引起測(cè)試問(wèn)題。對(duì)于測(cè)試向量自動(dòng)生成(ATPG), 為了使掃描進(jìn)行,鎖存器需要置為透明模式(transparent mode), 反過(guò)來(lái),測(cè)試鎖存器需要構(gòu)造特定的向量,這可非同一般。 4,時(shí)序過(guò)程要有明確的復(fù)位值 使觸發(fā)器帶有復(fù)位端,在制造測(cè)試、ATPG以及模擬初始化時(shí),可以對(duì)整個(gè)電路進(jìn)行
55、 快速?gòu)?fù)位。 5,避免模塊內(nèi)的三態(tài)/雙向 內(nèi)部三態(tài)信號(hào)在制造測(cè)試和邏輯綜合過(guò)程中難于處理.近日讀 J.Bhasker 的<verilog synthesis practical primer> , 受益匪淺,理清了不少基礎(chǔ)電路知識(shí) , 記下一些 tips :1. 過(guò)程賦值(always 中觸發(fā)賦值)的變量,可能會(huì)被綜合成連線 或觸發(fā)器 或鎖存器.2.綜合成鎖存器的規(guī)則:a. 變量在條件語(yǔ)句(if 或case)中,被賦值.b. 變量未在條件語(yǔ)句的所有分支中被賦值.c. 在alway
56、s語(yǔ)句多次調(diào)用之間需要保持變量值 .以上三個(gè)條件必須同時(shí)滿(mǎn)足.3.綜合成觸發(fā)器的規(guī)則:變量在時(shí)鐘沿的控制下被賦值。例外情況:變量的賦值和引用都僅出現(xiàn)在一條always語(yǔ)句中,則該變量被視為中間變量而不是觸發(fā)器。4. 對(duì)于無(wú)時(shí)鐘事情的always語(yǔ)句(即組合邏輯建模),其時(shí)間表應(yīng)包括該alwa語(yǔ)句引用的所有變量,否則會(huì)出現(xiàn)RTL與Netlist的不一致芯片外部引腳很多都使用inout類(lèi)型的,為的是節(jié)省管腿。一般信號(hào)線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r(shí)候就要用到INOUT類(lèi)型了。就是一個(gè)端口同時(shí)做輸入和輸出。 inout在具體實(shí)現(xiàn)上一般用三態(tài)門(mén)來(lái)實(shí)現(xiàn)。三態(tài)門(mén)的第三個(gè)狀態(tài)就是高阻'Z'。 當(dāng)
57、inout端口不輸出時(shí),將三態(tài)門(mén)置高阻。這樣信號(hào)就不會(huì)因?yàn)閮啥送瑫r(shí)輸出而出錯(cuò)了,更詳細(xì)的內(nèi)容可以搜索一下三態(tài)門(mén)tri-state的資料.1 使用inout類(lèi)型數(shù)據(jù),可以用如下寫(xiě)法:inout data_inout;input data_in;reg data_reg;/data_inout的映象寄存器reg link_data;assign data_inout=link_data?data_reg:1bz;/link_data控制三態(tài)門(mén)/對(duì)于data_reg,可以通過(guò)組合邏輯或者時(shí)序邏輯根據(jù)data_in對(duì)其賦值.通過(guò)控制link_data的高低電平,從而設(shè)置data_inout是輸出數(shù)據(jù)還
58、是處于高阻態(tài),如果處于高阻態(tài),則此時(shí)當(dāng)作輸入端口使用.link_data可以通過(guò)相關(guān)電路來(lái)控制.2 編寫(xiě)測(cè)試模塊時(shí),對(duì)于inout類(lèi)型的端口,需要定義成wire類(lèi)型變量,而其它輸入端口都定義成reg類(lèi)型,這兩者是有區(qū)別的.當(dāng)上面例子中的data_inout用作輸入時(shí),需要賦值給data_inout,其余情況可以斷開(kāi).此時(shí)可以用assign語(yǔ)句實(shí)現(xiàn):assign data_inout=link?data_in_t:1bz;其中的link ,data_in_t是reg類(lèi)型變量,在測(cè)試模塊中賦值.另外,可以設(shè)置一個(gè)輸出端口觀察data_inout用作輸出的情況:Wire data_out;Assig
59、n data_out_t=(!link)?data_inout:1bz;else,in RTLinout use in top module(PAD)dont use inout(tri) in sub module也就是說(shuō),在內(nèi)部模塊最好不要出現(xiàn)inout,如果確實(shí)需要,那么用兩個(gè)port實(shí)現(xiàn),到頂層的時(shí)候再用三態(tài)實(shí)現(xiàn)。理由是:在非頂層模塊用雙向口的話(huà),該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個(gè)輸入口和一個(gè)輸出口聯(lián)到該雙向口上,則發(fā)生兩個(gè)內(nèi)部輸出單元連接到一起的情況出現(xiàn),這樣在綜合時(shí)往往會(huì)出錯(cuò)。對(duì)雙向口,我們可以將其理解為2個(gè)分量:一個(gè)輸入分量,一個(gè)輸出分量。另外還需要一
60、個(gè)控制信號(hào)控制輸出分量何時(shí)輸出。此時(shí),我們就可以很容易地對(duì)雙向端口建模。例子:CODE:module dual_port (.inout_pin,.);inout inout_pin;wire inout_pin;wire input_of_inout;wire output_of_inout;wire out_en;assign input_of_inout = inout_pin;assign inout_pin = out_en ? output_of_inout : 高阻;endmodule可見(jiàn),此時(shí)input_of_inout和output_of_inout就可以當(dāng)作普通信號(hào)使用了。
61、在仿真的時(shí)候,需要注意雙向口的處理。如果是直接與另外一個(gè)模塊的雙向口連接,那么只要保證一個(gè)模塊在輸出的時(shí)候,另外一個(gè)模塊沒(méi)有輸出(處于高阻態(tài))就可以了。如果是在ModelSim中作為單獨(dú)的模塊仿真,那么在模塊輸出的時(shí)候,不能使用force命令將其設(shè)為高阻態(tài),而是使用release命令將總線釋放掉很多初學(xué)者在寫(xiě)testbench進(jìn)行仿真和驗(yàn)證的時(shí)候,被inout雙向口難住了。仿真器老是提示錯(cuò)誤不能進(jìn)行。下面是我個(gè)人對(duì)inout端口寫(xiě)testbench仿真的一些總結(jié),并舉例進(jìn)行說(shuō)明。在這里先要說(shuō)明一下inout口在testbench中要定義為wire型變量。先假設(shè)有一源代碼為:module xx(
62、data_inout , .);inout data_inout;.assign data_inout=(! link)?datareg:1'bz;endmodule方法一:使用相反控制信號(hào)inout口,等于兩個(gè)模塊之間用inout雙向口互連。這種方法要注意assign 語(yǔ)句只能放在initial和always塊內(nèi)。module test();wire data_inout;reg data_reg;reg link;initial begin.endassign data_inout=link?data_reg:1'bz;endmodule方法二:使用force和releas
63、e語(yǔ)句,但這種方法不能準(zhǔn)確反映雙向端口的信號(hào)變化,但這種方法可以反在塊內(nèi)。module test();wire data_inout;reg data_reg;reg link;#xx; /延時(shí)force data_inout=1'bx; /強(qiáng)制作為輸入端口.#xx;release data_inout;
64、; /釋放輸入端口endmodule很多讀者反映仿真雙向端口的時(shí)候遇到困難,這里介紹一下雙向端口的仿真方法。一個(gè)典型的雙向端口如圖1所示。其中inner_port與芯片內(nèi)部其他邏輯相連,outer_port為芯片外部管腳,out_en用于控制雙向端口的方向,out_en為1時(shí),端口為輸出方向,out_en為0時(shí),端口為輸入方向。用Verilog語(yǔ)言描述如下:module bidirection_io(inner_port,out_en,outer_port);input out_en;inout7:0 inner_port;inout7:0 outer_port;ass
65、ign outer_port=(out_en=1)?inner_port:8'hzz;assign inner_port=(out_en=0)?outer_port:8'hzz;endmodule用VHDL語(yǔ)言描述雙向端口如下:library ieee;use IEEE.STD_LOGIC_1164.ALL;entity bidirection_io isport ( inner_port : inout std_logic_vector(7 downto 0);out_en : in std_logic;outer_port : inout std_logic_vector(
66、7 downto 0) );end bidirection_io;architecture behavioral of bidirection_io isbeginouter_port<=inner_port when out_en='1' else (OTHERS=>'Z');inner_port<=outer_port when out_en='0' else (OTHERS=>'Z');end behavioral;仿真時(shí)需要驗(yàn)證雙向端口能正確輸出數(shù)據(jù),以及正確讀入數(shù)據(jù),因此需要驅(qū)動(dòng)out_en端口,
67、當(dāng)out_en端口為1時(shí),testbench驅(qū)動(dòng)inner_port端口,然后檢查outer_port端口輸出的數(shù)據(jù)是否正確;當(dāng)out_en端口為0時(shí),testbench驅(qū)動(dòng)outer_port端口,然后檢查inner_port端口讀入的數(shù)據(jù)是否正確。由于inner_port和outer_port端口都是雙向端口(在VHDL和Verilog語(yǔ)言中都用inout定義),因此驅(qū)動(dòng)方法與單向端口有所不同。驗(yàn)證該雙向端口的testbench結(jié)構(gòu)如圖2所示。這是一個(gè)self-checking testbench,可以自動(dòng)檢查仿真結(jié)果是否正確,并在Modelsim控制臺(tái)上打印出提示信息。圖中Monitor
68、完成信號(hào)采樣、結(jié)果自動(dòng)比較的功能。testbench的工作過(guò)程為1)out_en=1時(shí),雙向端口處于輸出狀態(tài),testbench給inner_port_tb_reg信號(hào)賦值,然后讀取outer_port_tb_wire的值,如果兩者一致,雙向端口工作正常。2)out_en=0時(shí),雙向端口處于輸如狀態(tài),testbench給outer_port_tb_reg信號(hào)賦值,然后讀取inner_port_tb_wire的值,如果兩者一致,雙向端口工作正常。用Verilog代碼編寫(xiě)的testbench如下,其中使用了自動(dòng)結(jié)果比較,隨機(jī)化激勵(lì)產(chǎn)生等技術(shù)。timescale 1ns/10psmodule tb();reg7:0 inner_port_tb_reg;wire7:0 inner_port_tb
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年園藝師備考能力提升試題及答案
- 大學(xué)生離譜試題及答案
- 潛力激發(fā)福建事業(yè)單位考試試題及答案
- 福建事業(yè)單位考試知識(shí)脈絡(luò)試題及答案
- 脫穎而出關(guān)鍵福建事業(yè)單位考試試題及答案
- 2024花藝師考試的思維拓展試題及答案
- 農(nóng)村開(kāi)荒保潔合同樣本
- 個(gè)人鋼材采購(gòu)合同樣本
- 產(chǎn)品進(jìn)場(chǎng)合同標(biāo)準(zhǔn)文本
- 博士文化測(cè)試題及答案解析
- 2025年中國(guó)藥學(xué)會(huì)公開(kāi)招聘工作人員3人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 機(jī)器學(xué)習(xí)(完整版課件)
- AEO貿(mào)易安全培訓(xùn)
- 《簡(jiǎn)歷制作培訓(xùn)》課件
- 食品安全案例-課件-案例十二-蘇丹紅事件
- 肝硬化失代償期
- 2023年非車(chē)險(xiǎn)核??荚囌骖}模擬匯編(共396題)
- 2024年中國(guó)分析儀器市場(chǎng)調(diào)查研究報(bào)告
- “龍崗青年”微信公眾號(hào)代運(yùn)營(yíng)方案
- DB11-T 478-2022 古樹(shù)名木評(píng)價(jià)規(guī)范
- 施工現(xiàn)場(chǎng)揚(yáng)塵控制專(zhuān)項(xiàng)方案
評(píng)論
0/150
提交評(píng)論