計(jì)算機(jī)流水線處理機(jī)及其設(shè)計(jì)_第1頁(yè)
計(jì)算機(jī)流水線處理機(jī)及其設(shè)計(jì)_第2頁(yè)
計(jì)算機(jī)流水線處理機(jī)及其設(shè)計(jì)_第3頁(yè)
計(jì)算機(jī)流水線處理機(jī)及其設(shè)計(jì)_第4頁(yè)
計(jì)算機(jī)流水線處理機(jī)及其設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、6 流水線處理機(jī)及其設(shè)計(jì)61 引 言流水線(pipeline)是一種能夠使多條指令重疊操作的處理機(jī)的實(shí)現(xiàn)技術(shù),它已成為現(xiàn)代處理機(jī)設(shè)計(jì)中最為關(guān)鍵的技術(shù)。流水線技術(shù)并不是處理機(jī)設(shè)計(jì)領(lǐng)域所獨(dú)有的。早在計(jì)算機(jī)還沒有出現(xiàn)之前,流水線技術(shù)已被廣泛應(yīng)用于工業(yè)生產(chǎn)中了。尤其是現(xiàn)在,幾乎所有的現(xiàn)代化工廠的生產(chǎn)線都采用流水線技術(shù)。一件產(chǎn)品往往需要幾道工序才能完成。每道工序只完成生產(chǎn)過(guò)程中的一小部分操作,即送往下道工序。如果單從件產(chǎn)品從開始到完成來(lái)看,生產(chǎn)所需要的時(shí)間,與非流水線相比,似乎并沒有縮短。但從整體來(lái)看,產(chǎn)品的出產(chǎn)率卻大大提高了。流水線處理機(jī)也是這樣,單條指令的執(zhí)行時(shí)間沒有縮短,但每個(gè)時(shí)鐘周期都會(huì)有一條指

2、令執(zhí)行完畢。試想,非流水線多周期處理機(jī)執(zhí)行一條指令平均要花費(fèi)大約4個(gè)時(shí)鐘周期。假設(shè)執(zhí)行1萬(wàn)條指令,就要用4萬(wàn)個(gè)時(shí)鐘周期。而流水線處理機(jī)執(zhí)行一條指令可能需要5個(gè)時(shí)鐘周期,但由于多條指令,例如5條,可以重疊操作,總體上,平均每條指令所花費(fèi)的時(shí)間大致為1個(gè)時(shí)鐘周期,總共只需要大約1萬(wàn)個(gè)時(shí)鐘周期。這就是所謂的“吞吐率”的提高。流水線處理機(jī)把一條指令的執(zhí)行分成幾個(gè)步驟,或稱級(jí)(stages)。每一級(jí)在一個(gè)時(shí)鐘周期內(nèi)完成。在每個(gè)時(shí)鐘周期,處理機(jī)啟動(dòng)執(zhí)行一條指令。如果處理機(jī)的流水線有m級(jí),則同時(shí)可重疊執(zhí)行的指令總條數(shù)將為m,每條指令處在不同的執(zhí)行階段。如果分級(jí)分得好的話,那么每級(jí)都沒有時(shí)間上的浪費(fèi)。這是最理

3、想的情況。流水線處理機(jī)在這種理想的情況下,與非流水線處理機(jī)的性能加速比為其中,I為一個(gè)程序被執(zhí)行的總的指令條數(shù)。它在流水線處理機(jī)和非流水線處理機(jī)中是相等的。CPI是每條指令總體平均所需的時(shí)鐘周期數(shù)。CPInp是非流水線處理機(jī)的CPI,CPIn是流水線處理機(jī)的CPI。因?yàn)榱魉€處理機(jī)把一條指令的執(zhí)行時(shí)間理想地分成了陰級(jí),有m條指令在同時(shí)(重疊)執(zhí)行,則CPIpCPInp/m。也可理解為CPIp1,而CPInp=m。T是每個(gè)時(shí)鐘周期的時(shí)間長(zhǎng)度,假設(shè)它在兩種處理機(jī)中也是相同的。最后總的加速比為m,即等于流水線的級(jí)數(shù)。 這豈不是說(shuō),把流水線級(jí)數(shù)分得越多處理機(jī)的性能就越好?但是,實(shí)際的情況往往要受很多條

4、件的限制。流水線處理機(jī)性能提高的關(guān)鍵在于每個(gè)時(shí)鐘周期處理機(jī)都能啟動(dòng)一條指令的執(zhí)行。這意味者流水線每級(jí)中的執(zhí)行部件要有能力在每個(gè)時(shí)鐘周期接收一條新的指令。例如,如果ALU完成一次操作要用10ns的話,那么一個(gè)ALU接收一條指令操作的周期不能短于10ns。指令存儲(chǔ)器以及數(shù)據(jù)存儲(chǔ)器也有這樣的限制。也假設(shè)它們的訪問周期是10ns,則每隔10ns才能從指令存儲(chǔ)器取出一條指令,或者每隔10ns才能讀寫一次數(shù)據(jù)存儲(chǔ)器。 在本章以下的討論中,我們?nèi)允褂?章中定義的指令系統(tǒng)。它們是,ALU操作類型的指令,包括and,of,add和:sub;存儲(chǔ)器訪問指令10ad和store;條件轉(zhuǎn)移指令bne和beq,以及無(wú)條

5、件轉(zhuǎn)移指令branch,共9條。ALU指令除了把運(yùn)算結(jié)果寫入寄存器堆之外,也把ZERO標(biāo)志寫入Z寄存器。條件轉(zhuǎn)移指令使用Z標(biāo)志決定是否轉(zhuǎn)移,其它指令不影響Z寄存器。處理機(jī)的指令系統(tǒng)及指令格式如表61所示。表6.1 流水線處理機(jī)的指令系統(tǒng)和指令格式31 2625 2120 1615 54 0指令意義00 0000rdrs1rs2And rd,rs1,rs2寄存器與寄存器00 0001rdrs1immeAndi rd,rs1,imme寄存器與立即數(shù)00 0010rdrs1Rs2or rd rs1,rs2寄存器或寄存器00 0011rdrs1immeori rd,rs1,imme寄存器或立即數(shù)00

6、0100rdrs1rs2add rd,rs1,rs2寄存器加寄存器00 0101rdrs1immeaddi rd,rs1,imme寄存器加立即數(shù)00 0110rdrs1rs2sub rb,rs1 rs2寄存器減寄存器00 011100 100000 1001rdrdrdrs1rs1rs1immeimmeimmesubi rd,rs1,immeload rd,immme(rs1)store rd,imme(rs1)寄存器減立即數(shù)從存儲(chǔ)器讀數(shù)據(jù)向存儲(chǔ)器寫數(shù)據(jù)00 101000 101100 1100dispdispdispbne dispbeq dispbranch disp結(jié)果非0時(shí)轉(zhuǎn)移結(jié)果為0

7、時(shí)轉(zhuǎn)移無(wú)條件轉(zhuǎn)移 這些指令執(zhí)行時(shí)用到的主要功能部件和它們所需的時(shí)間如下: 指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器:10ns;ALU和地址加法器:10ns;寄存器堆:5ns;假定其它部件,如PC寄存器、多路器、控制部件等花費(fèi)的時(shí)間為o。表62列出了各指令執(zhí)行時(shí)所需要的時(shí)間。 表6.2 各類指令執(zhí)行時(shí)所需要的時(shí)間 ns10510105ALU指令指令存儲(chǔ)器寄存器堆ALU寄存器堆30load指令指令存儲(chǔ)器寄存器堆ALU數(shù)據(jù)存儲(chǔ)器寄存器堆40store指令指令存儲(chǔ)器寄存器堆ALU數(shù)據(jù)存儲(chǔ)器35轉(zhuǎn)移指令指令存儲(chǔ)器加法器(10)20在設(shè)計(jì)非流水線單周期處理機(jī)時(shí),定義時(shí)鐘周期長(zhǎng)度要以執(zhí)行時(shí)間最長(zhǎng)的指令為基準(zhǔn)。以上的指令系統(tǒng)中

8、,load指令執(zhí)行時(shí)間最長(zhǎng),需要40ns,因此我們定義時(shí)鐘周期長(zhǎng)度為40ns。在5章中,我們也描述了非流水線多周期處理機(jī)的設(shè)計(jì)。它的時(shí)鐘周期定義為10ns。在這種情況下,ALU指令的執(zhí)行用4個(gè)時(shí)鐘周期,load指令用5個(gè)時(shí)鐘周期,store指令用4個(gè)時(shí)鐘周期,轉(zhuǎn)移(無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移)指令用2個(gè)時(shí)鐘周期。假設(shè)流水線處理機(jī)的時(shí)鐘周期也定義為10ns,流水線級(jí)數(shù)是5級(jí)。這意味著有5條指令能被同時(shí)執(zhí)行。表63列出了使用流水線技術(shù)后指令執(zhí)行所需要的時(shí)間。表63 使用流水線技術(shù)后指令執(zhí)行所需要的時(shí)間 ns1010101010ALU指令指令存儲(chǔ)器寄存器堆ALU寄存器堆50load指令指令存儲(chǔ)器寄存器堆A

9、LU數(shù)據(jù)存儲(chǔ)器寄存器堆50store指令指令存儲(chǔ)器寄存器堆ALU數(shù)據(jù)存儲(chǔ)器40轉(zhuǎn)移指令指令存儲(chǔ)器加法器203種處理機(jī)的指令執(zhí)行時(shí)序如圖61所示。其中,IF代表取指令,ID代表指令譯碼及讀寄存器操作數(shù),EXE代表ALU指令操作及存儲(chǔ)器有效地址計(jì)算,MEM代表存儲(chǔ)器訪圖6.1 3種處理機(jī)執(zhí)行時(shí)序比較(a)單周期;(b)多周期;(c)流水線問,WB代表結(jié)果寫回寄存器。從流水線處理機(jī)的時(shí)序中可以看出,每個(gè)時(shí)鐘周期處理機(jī)取出一條指令加以執(zhí)行。 在流水線處理機(jī)和非流水線多周期處理機(jī)設(shè)計(jì)中,一個(gè)時(shí)鐘周期要能容下所有類型的功能部件中所需時(shí)間最長(zhǎng)的部件的執(zhí)行時(shí)間。我們把時(shí)鐘周期定義為10ns。盡管讀寫寄存器堆只

10、需5ns,也仍然要分配給它一個(gè)整個(gè)周期。對(duì)于非流水線多周期處理機(jī)來(lái)講,與單周期處理機(jī)相比,它加長(zhǎng)了指令的執(zhí)行時(shí)間。例如,執(zhí)行l(wèi)oad指令時(shí),單周期處理機(jī)用40ns,而多周期處理機(jī)需要5個(gè)時(shí)鐘周期,即50ns。50ns過(guò)后,開始執(zhí)行下一條指令。流水線處理機(jī)也是這樣。單看一條指令的執(zhí)行,也要5個(gè)時(shí)鐘周期。但是,這對(duì)流水線處理機(jī)的性能影響很小。這是由于流水線處理機(jī)性能提高的關(guān)鍵在于每個(gè)時(shí)鐘周期都能啟動(dòng)一條指令的執(zhí)行。 若流水線級(jí)數(shù)為m,總共執(zhí)行n條指令,則所需總的時(shí)鐘周期數(shù)為m+n一1。因此流水線處理機(jī)平均每條指令所需的準(zhǔn)確的時(shí)鐘周期數(shù)為例如,當(dāng)n1,n5時(shí),CPI+5,它與非流水線處理機(jī)是一樣的。

11、但當(dāng)”很大時(shí),例如n=100 000,則CPIp=100 004100 0001,m的影響可以忽略不計(jì)。這就是我們前面所說(shuō)的流水線處理機(jī)中單條指令執(zhí)行時(shí)間變長(zhǎng)將對(duì)性能造成很小影響的原因。從本章后面的討論中,我們會(huì)發(fā)現(xiàn),它也影響流水線處理機(jī)控制電路的設(shè)計(jì),主要體現(xiàn)在解決流水線處理機(jī)所固有的數(shù)據(jù)相關(guān)的問題變得更復(fù)雜了。因此在設(shè)計(jì)流水線處理機(jī)時(shí)我們應(yīng)考慮的問題有兩個(gè),一個(gè)是縮短單條指令的執(zhí)行時(shí)間,另一個(gè)是提高流水線處理機(jī)的吞吐率。應(yīng)該說(shuō)后者更重要一些。 流水線技術(shù)的好處在于它既能把指令間的操作并行性充分發(fā)揮出來(lái),同時(shí)又不對(duì)用戶編程提出新的要求,即它對(duì)用戶來(lái)講是“透明的”。本章隨后的幾節(jié)將討論如何實(shí)現(xiàn)

12、我們所定義的指令系統(tǒng)的流水線操作,介紹流水線技術(shù)所帶來(lái)的問題,以及描述為解決這些問題所采取的方法。62 流水線處理機(jī)的數(shù)據(jù)路徑 流水線處理機(jī)是比較難于理解的。我們將通過(guò)具體的例子,對(duì)它的工作原理及工作過(guò)程作較為詳細(xì)的描述。6.2.1 流水線級(jí) 圖62給出的是我們?cè)?章中描述過(guò)的非流水線單周期處理機(jī)的組成結(jié)構(gòu)。我們把執(zhí)行指令的過(guò)程分為5部分,使其能夠按流水線方式執(zhí)行指令。分成5部分的意思就是同時(shí)可重疊執(zhí)行的指令為5條,即5級(jí)流水線。每一級(jí)所使用的名字及其要完成的動(dòng)作如下:(1)IF(instruction fetch)取指令;(2)ID(instructiondecode)指令譯碼并讀寄存器操作

13、數(shù);(3)EXE(execution)執(zhí)行;(4)MEM(memoryaccess)存儲(chǔ)器訪問;(5)WB(write back)寫回。圖62 把單周期處理機(jī)的指令執(zhí)行分為5級(jí) 如圖中的箭頭方向所示,指令執(zhí)行時(shí)從左移向右通過(guò)電路。但有兩處從右向左的例外:一處是WB級(jí),它把運(yùn)算結(jié)果寫回中間靠左位置的寄存器堆中;另一處是IF級(jí),它把經(jīng)過(guò)計(jì)算的下一條指令的地址寫入程序計(jì)數(shù)器PC中。下一條指令地址的計(jì)算方法有兩種,一種是當(dāng)前PC加1,另一種是當(dāng)前PC加字地址偏移量,偏移量在指令中定義出。 流水線處理機(jī)的最大特點(diǎn)是每一個(gè)時(shí)鐘周期取出一條指令來(lái)執(zhí)行。所有的指令按取出的先后次序通過(guò)圖62中的從左至右的數(shù)據(jù)路

14、徑。依照指令類型的不同,每種指令在執(zhí)行過(guò)程中可能會(huì)用到數(shù)據(jù)路徑的不同的部分。例如,圖63中畫出的是處理機(jī)連續(xù)執(zhí)行l(wèi)oad指令時(shí)所要使用的數(shù)據(jù)路徑中的功能部件。load指令實(shí)際上是使用功能部件最多的指令。 圖63中,IM(instruction memory)代表指令存儲(chǔ)器。在第一級(jí),IF級(jí),指令計(jì)數(shù)器PC中的內(nèi)容作為訪問IM的地址,送到IM的地址輸入端。第二級(jí)中,REG(register file)代表寄存器堆或者指令中立即數(shù)的擴(kuò)展。load指令訪問存儲(chǔ)器時(shí)所使用的地址由下面兩個(gè)數(shù)據(jù)相加得到,一個(gè)數(shù)據(jù)是寄存器操作數(shù),另一個(gè)數(shù)據(jù)是經(jīng)符號(hào)擴(kuò)展的立即數(shù)。第三級(jí)的ALU做算術(shù)邏輯運(yùn)算。針對(duì)load指令

15、來(lái)講,ALU完成加法運(yùn)算。第四級(jí)中,DM(data memory)代表數(shù)據(jù)存儲(chǔ)器。存儲(chǔ)器數(shù)據(jù)將在這一級(jí)中被讀出。存儲(chǔ)器的地址輸入就是ALU計(jì)算出的結(jié)果。在第五級(jí),從存儲(chǔ)器中取出的數(shù)據(jù)被寫回到寄存器堆中。這一級(jí)中的REG就是第二級(jí)中的REG。第二級(jí)讀REG,第五級(jí)寫REG。在單周期處理機(jī)中,如果一條指令還沒有執(zhí)行完畢,PC的內(nèi)容不會(huì)改變。這就使得在圖63 流水線處理機(jī)連續(xù)執(zhí)行l(wèi)oad指令時(shí)的情形一條指令的整個(gè)執(zhí)行過(guò)程中,IM始終輸出當(dāng)前指令。與單周期處理機(jī)不同,流水線處理機(jī)每個(gè)時(shí)鐘周期都要取出一條指令。這意味著,當(dāng)流水線處理機(jī)已從存儲(chǔ)器取出一條指令并把它送到ID級(jí)去譯碼時(shí),下一條指令也正在從存儲(chǔ)

16、器中取出。如果先取出的指令沒被保存,則它后面正在被取出的指令會(huì)對(duì)它造成影響。也就是說(shuō),我們必須要使用寄存器來(lái)保存從存儲(chǔ)器取出的指令。推而廣之,我們必須要在流水線的各級(jí)之間安排一組寄存器,用以保存當(dāng)前時(shí)鐘周期運(yùn)算出的結(jié)果,以便為下個(gè)周期使用(我們只能使用觸發(fā)器寄存器,它把時(shí)鐘上升沿時(shí)數(shù)據(jù)輸入端的信息打人寄存器中;而不能使用鎖存器,因?yàn)殒i存器的輸出在時(shí)鐘高電平時(shí)跟隨輸入的變化而變化。有關(guān)觸發(fā)器與鎖存器的區(qū)別,見2章中的描述)。我們稱這些寄存器為流水線寄存器。從廣義上講,如果把非流水線單周期處理機(jī)執(zhí)行一條指令的整個(gè)過(guò)程看作是流水線處理機(jī)的一級(jí)的話,PC則相當(dāng)于流水線寄存器,在該級(jí)的執(zhí)行還沒有完成時(shí),

17、不應(yīng)該改變這個(gè)寄存器的內(nèi)容。由此,我們能夠初步設(shè)想出流水線處理機(jī)應(yīng)有圖64所示的結(jié)構(gòu)。 我們可以很自然地把PC作為一個(gè)特殊的流水線寄存器來(lái)看待,因?yàn)樵诜橇魉€處理機(jī)中PC也是需要的。由于流水線處理機(jī)每個(gè)時(shí)鐘周期都從指令存儲(chǔ)器取出一條指令,它的值在每次周期結(jié)束時(shí)都將被改變。程序不發(fā)生轉(zhuǎn)移時(shí),PC加l;轉(zhuǎn)移時(shí),PC加符號(hào)擴(kuò)展的偏移量。圖中的DSE(displacement sign-extend)表示對(duì)指令字偏移量進(jìn)行符號(hào)擴(kuò)展。在第一級(jí)與第二級(jí)之間,我們使用了一個(gè)被稱為IR(instruction register)的指令寄存器。對(duì)于字長(zhǎng)為32位的處理機(jī)來(lái)講,PC一般有30位,它存放的是32位指令

18、的字地址。1只有32位,用來(lái)存放一條指令。第二和第三級(jí)之間需要較多的寄存器。首先,從寄存器堆中讀出的兩個(gè)32位數(shù)據(jù)A和B必須要保存。再者,經(jīng)符號(hào)擴(kuò)展后的32位立即數(shù)I也要保存。圖中的ISE(immediate sign-extend)代表指令中立即數(shù)的符號(hào)擴(kuò)展。一般的ALU操作指令,要么是A與B操作,要么是A與I操作。我們能不能增加一個(gè)多路器而省去B或I寄存器,只使用一個(gè)32位寄存器呢?答案是否定的。原因出在store指令上。store指令同時(shí)使用A,B和I。A和I用來(lái)計(jì)算存儲(chǔ)器地址,B用來(lái)保存寫入存儲(chǔ)器的數(shù)據(jù)。在流水線處理機(jī)中,這些數(shù)據(jù)必須要。在一個(gè)時(shí)鐘周期中同時(shí)產(chǎn)生,以保證不引起資源沖突。

19、還有一個(gè)d寄存器,它被用來(lái)保存目的寄存器號(hào);因?yàn)橹噶畹牟僮鹘Y(jié)果要在WB級(jí)寫入寄存器堆,目的寄存器號(hào)也要在那時(shí)使用,因此必須要同步跟隨過(guò)去。圖64 流水線處理機(jī)每級(jí)之間的流水線寄存器 第三級(jí)和第四級(jí)之間除了d之外,還有2,R和S。2用于存放ALU的一位ZERO標(biāo)志。當(dāng)ALU指令的運(yùn)算結(jié)果為全0時(shí),ZERO輸出1,否則輸出0。在執(zhí)行條件轉(zhuǎn)移指令時(shí),Z用來(lái)決定是否真正轉(zhuǎn)移。R保存32位ALU運(yùn)算結(jié)果。S專為store指令而設(shè),用來(lái)存放要被寫入存儲(chǔ)器中的數(shù)據(jù)。 第四級(jí)和第五級(jí)之間的寄存器如下:D存放load指令從存儲(chǔ)器中讀出的數(shù)據(jù);C只是保存前一級(jí)的R,即ALU指令的結(jié)果。這一級(jí)d寄存器的輸出用于指定

20、目的寄存器,D或C的數(shù)據(jù)要被寫入由d所指定的目的寄存器中。我們不妨把寄存器雄看作是最后一級(jí)流水線寄存器。下面我們描述每級(jí)流水線的操作。622 流水線各級(jí)的操作 1IF級(jí)在第一級(jí)(取指令級(jí))(圖65)處理機(jī)使用PC的內(nèi)容訪問指令存儲(chǔ)器,取出指令,并在該級(jí)結(jié)束時(shí),把指令打人1只寄存器。下一條指令的地址也在這一級(jí)計(jì)算出,并把它打人PC寄存器。新的PC的計(jì)算有兩種情況:程序不發(fā)生轉(zhuǎn)移時(shí),新的PC地址由當(dāng)前PC值加1得到(1是指令字偏移量,相當(dāng)于字節(jié)地址偏移量的4),即指向下一條頃序的指令;發(fā)生轉(zhuǎn)移時(shí)的情況比較復(fù)雜,我們將在后面進(jìn)行描述。圖65 流水線第一級(jí)取指令級(jí) 2ID級(jí)指令譯碼級(jí)(圖66)有兩件事

21、情要做:第一件是數(shù)據(jù)路徑要完成的工作,主要是從寄存器堆中讀寄存器操作數(shù)和對(duì)指令中的立即數(shù)部分進(jìn)行符號(hào)擴(kuò)展;第二件工作由控制部件完成??刂撇考鶕?jù)指令操作碼OPCODE,產(chǎn)生所有的控制信號(hào)。有關(guān)控制信號(hào)如何產(chǎn)生的問題,我們將在下一節(jié)描述。正如前面提到的,目的寄存器號(hào)要保存在流水線寄存器中,以便在WB級(jí)指定把結(jié)果寫入哪一個(gè)寄存器中。寄存器堆A2輸入端前面的多路器為store指令而設(shè)。不是store指令時(shí),多路器選擇指令中的rs2;是store指令時(shí),多路器選擇指令中的rd。轉(zhuǎn)移指令將在本級(jí)結(jié)束,我們稍后再詳細(xì)討論它。圖66 流水線第二級(jí)指令譯碼級(jí) 3EXE級(jí)執(zhí)行級(jí)(圖6?)的工作均由ALU來(lái)做。A

22、LU運(yùn)算類型的指令將在本級(jí)由ALU計(jì)算出結(jié)果,并把它打人R寄存器。同時(shí),ALU的ZERO輸出也被打人Z寄存器。ALU的兩個(gè)操作數(shù),一個(gè)來(lái)自于寄存器rsl,它在前一級(jí)已被打人流水線寄存器A中了;另一個(gè)可能是寄存器rs2操作數(shù)(流水線寄存器B中的內(nèi)容),也可能是立即數(shù)(流水線寄存器I中的內(nèi)容)。load和store指令要在本級(jí)中計(jì)算存儲(chǔ)器地址(ALU做加法)。兩個(gè)源操作數(shù)一個(gè)來(lái)自于A,一個(gè)來(lái)自于I。若是store指令,B的內(nèi)容將被打人流水線寄存器S。圖6.7 流水線第三級(jí)一一執(zhí)行級(jí) 4MEM級(jí)存儲(chǔ)器訪問級(jí)<圖68)專為10adstore指令而設(shè)。兩條指令均使用流水線寄存器R的輸出作為訪問存儲(chǔ)

23、器的地址。store指令把S中的內(nèi)容寫入存儲(chǔ)器。10ad指令讀存儲(chǔ)器,并把讀出的數(shù)據(jù)打人流水線寄存器D。ALU指令在本級(jí)所做的事情就和移位寄存器一樣,簡(jiǎn)單地把R的內(nèi)容打人C。圖68 流水線第四級(jí)存儲(chǔ)器訪問級(jí) 5WB級(jí) 寫回級(jí)(圖69)把指令結(jié)果寫回到寄存器堆。目的寄存器由從ID級(jí)一直傳遞過(guò)來(lái)的目的寄存器號(hào)指定。要寫入的數(shù)據(jù)來(lái)源有兩個(gè),一個(gè)是流水線寄存器D中的內(nèi)容,即存儲(chǔ)器數(shù)據(jù);另一個(gè)是流水線寄存器C的內(nèi)容,即ALU指令的計(jì)算結(jié)果。圖69 流水線第五級(jí)寫回級(jí)圖610 ALU指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑我們把ALU運(yùn)算類型的指令、1。ad和store指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑分別在圖610、

24、圖611和圖612中給出。圖6.11 load指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑圖6.12 store指令執(zhí)行時(shí)用到的流水線數(shù)據(jù)路徑63 流水線處理機(jī)的控制通過(guò)閱讀第5章,我們已經(jīng)學(xué)會(huì)了如何設(shè)計(jì)非流水線處理機(jī)的控制部件。為非流水線多周期處理機(jī)設(shè)計(jì)控制部件時(shí),有兩種方法可供我們選擇使用,一種是有限狀態(tài)機(jī)的硬布線方法,另一種是微程序控制方法。雖然流水線處理機(jī)也是多周期處理機(jī),但是,由于多條指令的重疊執(zhí)行,使得我們很難描述某個(gè)時(shí)鐘周期處理機(jī)到底處在何種狀態(tài),因?yàn)橛刑嗟牟煌噶铋g的組合情況。微程序控制方法也會(huì)遇到類似的問題,因?yàn)樗K究是按一條條指令順序執(zhí)行的思路來(lái)設(shè)計(jì)的。631 算術(shù)操作和存儲(chǔ)器訪問控制

25、 實(shí)際上,我們可以借鑒非流水線單處理機(jī)控制部件的設(shè)計(jì)方法。首先,讓我們通過(guò)下面程序的例子,研究流水線處理機(jī)多條指令重疊操作的過(guò)程,然后依此設(shè)計(jì)出它的控制部件。 addi rl, r2, 4 ;r1r1十4 load r2, 100(r3) ;r2memoryr3+100 sub r4, r5, r6;r4r5一r6 , add r7, r5, r6;r7r5+r6 store r8, 200(r9) ;memoryr9+200r8 subi r10,r10,1 ;r10r10一1以上的例子比較簡(jiǎn)單,指令之間沒有任何數(shù)據(jù)相關(guān)。注意,在注釋一列,我們采用了簡(jiǎn)單的表達(dá)方式。例如,第一條指令addir

26、l,r2,4完成的操作是讀取寄存器r2的內(nèi)容,把它加上4,結(jié)果寫回寄存器r1。比較合適的表達(dá)方法應(yīng)該是rl一(r1)+4。其它的也是一樣,如loadr2,100(r3),應(yīng)寫成r2一memory(r3)+100的形式,即寄存器r3的內(nèi)容加100,得到存儲(chǔ)器的有效地址,用它訪問存儲(chǔ)器,從地址指定的單元讀出數(shù)據(jù),再把數(shù)據(jù)寫人寄存器r2。store指令完成的操作與load相反,這時(shí)的r8不是目的寄存器,而應(yīng)看作是源寄存器。它的內(nèi)容要被存放到存儲(chǔ)器中,其地址由寄存器r9的內(nèi)容加200得到。 程序的執(zhí)行時(shí)序圖用圖613(a)的圖形方式畫出。橫坐標(biāo)表示時(shí)間,縱坐標(biāo)從上到下表示指令的執(zhí)行次序。這里還有另外一

27、種圖形表示方法,如圖613(b)所示。橫坐標(biāo)依然是時(shí)間,但縱坐標(biāo)是流水線的級(jí),從上至下為IF,ID,EXE,MEM和WB。一條指令執(zhí)行的5級(jí)按從左上至右下標(biāo)出,即時(shí)鐘周期增1(向右),流水線前進(jìn)一級(jí)(向下)。這種表示方法雖然不太直觀,但它的好處是只要5行就夠了,不像圖613(a)那樣,無(wú)限制的向右下方向延伸過(guò)去。以下我們按順序描述每個(gè)周期流水線數(shù)據(jù)路徑的操作以及所需的控制信號(hào)。注意,前4個(gè)周期,指令還沒有充滿流水線。從第五個(gè)周期開始,指令充滿流水線。但由于例子中總共只有6條指令,從第七個(gè)周期開始,不再有新的指令被取采。隨著指令不斷地完成執(zhí)行,流水線將在第11個(gè)周期完全變空。在實(shí)際的計(jì)算機(jī)系統(tǒng)中

28、,處理機(jī)總是能取到指令來(lái)執(zhí)行。當(dāng)沒有用戶程序時(shí),處理機(jī)轉(zhuǎn)去執(zhí)行操作系統(tǒng)程序。1第一個(gè)時(shí)鐘周期(圖614)圖614 程序例子執(zhí)行時(shí)的第一+gl期 假設(shè)第一條指令的地址為0。如果我們采用字節(jié)編址的話,則后續(xù)指令的字節(jié)地址依次為4,8,12,16,20。圖中左上角的1是字偏移量,它相當(dāng)于字節(jié)偏移量的4。為了敘述的方便,這里我們使用字地址。例中的6條指令地址分別為0,l,2,3,4,5。第一個(gè)時(shí)鐘周期是第一條指令的IP級(jí)。PC輸出0,從存儲(chǔ)器取出第一條指令addirl,r2,4。同時(shí),地址加法器前面的多路器選擇1,與當(dāng)前PC值相加,得到字地址l,即下一條指令的地址。在該周期結(jié)束時(shí),時(shí)鐘的上升沿把取出的

29、指令五條件地寫人指令寄存器IR。同時(shí)也把1寫入PC。我們定義多路器的選擇信號(hào)為BTAKEN(branchtaken),其意義為轉(zhuǎn)移發(fā)生。當(dāng)它為1時(shí),多路器選擇經(jīng)符號(hào)擴(kuò)展的偏移量,與當(dāng)前PC值相加,加法器輸出轉(zhuǎn)移地址。由于本例中沒有轉(zhuǎn)移指令,因此轉(zhuǎn)移總也不發(fā)生,即BTAKEN0。 第一個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第二個(gè)周期時(shí),PC輸出1;IR輸出第一條指令addi rl, r2, 4。 2第二個(gè)時(shí)鐘周期(圖615)這時(shí)第一條指令進(jìn)入ID級(jí),第二條指令進(jìn)入IF級(jí)。兩條指令的操作在各自的級(jí)同時(shí)進(jìn)行:圖615 程序例子執(zhí)行時(shí)的第二個(gè)周期 (1)處在ID級(jí)的第條指令addirl,r2,4完成譯碼操作,并根

30、據(jù)指令格式中各字段的值,對(duì)立即數(shù)部分做符號(hào)擴(kuò)展,從寄存器堆中讀出兩個(gè)寄存器¨和r4的內(nèi)容。在本周期結(jié)束時(shí),把上述3個(gè)數(shù)分別寫入流水線寄存器I,A和B中。實(shí)際上,寄存器r4的內(nèi)容不被使用。這個(gè)4來(lái)自于立即數(shù)中的4,因?yàn)樗鼈冊(cè)谥噶罡袷街刑幵谙嗤奈恢?。也就是說(shuō),把寄存器r4的內(nèi)容打入B中做的是無(wú)用功。但這沒關(guān)系,因?yàn)橄聜€(gè)周期不使用它。這樣做的原因是為了簡(jiǎn)化控制電路,即流水線寄存器不要求配置寫使能端了(以下,如果數(shù)據(jù)不被使用,我們不再描述它)。目的寄存器號(hào)也被打人流水線寄存器d,以備在WR級(jí)用它來(lái)指定目的寄存器,向其中寫入操作結(jié)果。寄存器地址A2輸入端前面的多路器選擇指令格式中的rs2字段

31、或者rd字段。選擇端的名字定義為SST(selectstore)。當(dāng)指令譯碼時(shí)發(fā)現(xiàn)是store指令,SST1,選擇rd,否則SST0,選擇rs2。本例中不使用第二個(gè)寄存器操作數(shù)i因此SST是什么都沒關(guān)系。 (2)與此同時(shí),與前面描述的·樣,從存儲(chǔ)器取出第二條指令loadr2,100(r3),在周期結(jié)束時(shí)打人IR。BTAKEN0,把2(PC+1)打人PC。 第二個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第三個(gè)周期時(shí),PC輸出2;IR輸出第二條指令loadr2,100(r3);I輸出32位的4,A輸出寄存器r1的內(nèi)容,d輸出l(目的寄存器是r1)。 3第三個(gè)時(shí)鐘周期(圖616) 這時(shí)第一條指令進(jìn)入EXE

32、級(jí),第二條指令進(jìn)入ID級(jí),第三條指令進(jìn)入IF級(jí)。3條指令的操作在各自的級(jí)同時(shí)進(jìn)行: (1)處在EXE級(jí)的第,條指令add rl,r1,4由ALU完成加法操作。多路器的選擇信號(hào)SIMM(select immediate)為1,意為選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和I。ALU右端的流水線寄存器d,R,S被五條件地打人數(shù)據(jù),而只有當(dāng)指令為ALU運(yùn)算類型時(shí),寫使能信號(hào)WZ1,才把ALU的ZERO輸出打人一位流水線寄存器Z。這是因?yàn)椴⒉皇撬械闹噶疃夹薷腪標(biāo)志寄存器。(2)處在ID級(jí)的第二條指令loadr3,100(r2)完成譯碼、立即數(shù)符號(hào)擴(kuò)展以及讀寄存圖616 程序例子執(zhí)行時(shí)的

33、第三個(gè)周期器操作。SST0,選擇rs2。在本周期結(jié)束時(shí),把32位的100和r2的內(nèi)容分別寫人流水線寄存器I和A。目的寄存器號(hào)3也被打人流水線寄存器d,以備在WR級(jí)用它來(lái)指定目的寄存器r3,向其中寫入從存儲(chǔ)器取來(lái)的數(shù)據(jù)。 (3)PC輸出2,從存儲(chǔ)器取出第三條指令sub r4,r5,r6,在周期結(jié)束時(shí)打人IR。BTAKEN二0,周期結(jié)束時(shí)把3打人PC。 第三個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第四個(gè)周期時(shí),PC輸出3,指向第四條指令;IR輸出第三條指令subr4,r5,r6;I輸出32位的100,A輸出寄存器r3的內(nèi)容(第二條指令);R輸出第一條指令的加法結(jié)果。4第四個(gè)時(shí)鐘周期(圖617)圖617 程序例子

34、執(zhí)行時(shí)的第四個(gè)周期這時(shí)第一條指令進(jìn)入MEM級(jí),第二條指令進(jìn)入EXE級(jí),第三條指令進(jìn)入ID級(jí),鮮四條指令進(jìn)入IF級(jí)。4條指令的操作在各自的級(jí)同時(shí)進(jìn)行:(1)R的內(nèi)容直接傳遞到C。(2)處在EXE級(jí)的第二條指令loadr3,100(r2)由ALU計(jì)算存儲(chǔ)器地址。多路器的選擇信號(hào)SIMM1,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和I。WZ0,不打人流水線寄存器Z。(3)處在級(jí)的第三條指令subr4,r5,r6完成譯碼、立即數(shù)符號(hào)擴(kuò)展以及讀寄存器操作。SST0,選擇rs2。在本周期結(jié)束時(shí),寄存器r5和r6的內(nèi)容分別寫入流水線寄存器A和B。目的寄存器號(hào)4也被打人流水線寄存器d,以備在WR

35、級(jí)用它來(lái)指定目的寄存器r4,向其中寫入減法操作的結(jié)果。(4)PC輸出3,從存儲(chǔ)器取出第四條指令add r?,r5,r6,在周期結(jié)束時(shí)打人IR。BTAKEN0,周期結(jié)束時(shí)把4打入PC。第四個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第五個(gè)周期時(shí),PC輸出4,指向第五條指令;IR輸出第四條指令addr7,r5,r6;A和B分別輸出寄存器r5和r6的內(nèi)容<第三條指令);R輸出存儲(chǔ)器地址(第二條指令);C輸出第一條指令的加法結(jié)果。5第五個(gè)時(shí)鐘周期(圖618)圖618 程序例子執(zhí)行時(shí)的第五個(gè)周期這時(shí)指令充滿流水線。第一條指令進(jìn)入WB級(jí),第二條指令進(jìn)入MEM級(jí),第三條指令進(jìn)入EXE級(jí),第四條指令進(jìn)入ID級(jí),第五條指令

36、進(jìn)入IF級(jí)。5條指令的操作在各自的級(jí)同時(shí)進(jìn)行:(1)第一條指令處在WB級(jí)。這時(shí),d輸出1(接到寄存器堆的AD端)。寄存器寫使能信號(hào)WREG(writeregmterfile)為1。多路器的選擇信號(hào)SLD(selectload)為0,選擇C輸出,即把加法結(jié)果寫入寄存器堆的r1寄存器。至此,第一條指令完成了它的執(zhí)行,退出流水線。(2)處在MEM級(jí)的第二條loadr2,100(r3)訪問存儲(chǔ)器。周期結(jié)束時(shí)把取來(lái)的存儲(chǔ)器數(shù)據(jù)寫入D。(3)處在EXE級(jí)的第三條指令sub r4,r5,r6由ALU做減法。多路器的選擇信號(hào) SIMM0,選擇寄存器操作數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和B。WZ1

37、,把ALU的ZERO輸出打人流水線寄存器Z。(4)處在ID級(jí)的第四條指令addr?,r5,r6完成譯碼及讀寄存器操作。SST0,選擇r6。在本周期結(jié)束時(shí),寄存器r5和r6的內(nèi)容分別寫入流水線寄存器A和B。目的寄存器號(hào)7也被打人流水線寄存器d,以備在WR級(jí)用它來(lái)指定目的寄存器r4,向其中寫入加法操作的結(jié)果。(5)PC輸出4,從存儲(chǔ)器取出第五條指令store r8,200(r9),在周期結(jié)束時(shí)打人IR。BTAKEN二0,周期結(jié)束時(shí)把5打入PC。第五個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第六個(gè)周期時(shí),PC輸出5,指向第六條指令;IR輸出第五條指令store r8,200(r9);A和B分別輸出寄存器r5和r6的

38、內(nèi)容(第四條指令);R減法結(jié)果(第三條指令);D輸出第二條指令從存儲(chǔ)器取來(lái)的數(shù)據(jù)。6第六個(gè)時(shí)鐘周期(圖619)圖619 程序例子執(zhí)行時(shí)的第六個(gè)周期這時(shí)指令仍充滿流水線。第二條指令進(jìn)入WB級(jí),第三條指令進(jìn)入MEM級(jí),第四條指令進(jìn)入EXE級(jí),第五條指令進(jìn)入ID級(jí),第六條指令進(jìn)人IF級(jí)。5條指令的操作在各自的流水線級(jí)同時(shí)進(jìn)行:(1)第二條指令處在WB級(jí)。這時(shí),d輸出2。寄存器寫使能信號(hào)WREG1。SLD1,選擇D的輸出,即把存儲(chǔ)器數(shù)據(jù)寫入寄存器堆的r2寄存器。至此,第二條指令也完成了它的執(zhí)行,退出流水線。(2)處在MEM級(jí)的第三條addr7,r5,r6把R的輸出直接傳遞到C。(3)處在EXE級(jí)的第四

39、條指令add r?,r5,r6由ALU做加法。多路器的選擇信號(hào)SIMM0,選擇寄存器操作數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和B。WZ;1,把ALU的ZERO輸出打人流水線寄存器Z。(4)處在ID級(jí)的第五條指令storer8,200(r9)完成譯碼、立即數(shù)符號(hào)擴(kuò)展以及讀寄存器操作。注意,這時(shí)SST1,選擇18。在本周期結(jié)束時(shí),擴(kuò)展的立即數(shù)200、寄存器r9和r8的內(nèi)容分別寫入流水線寄存器I,A和B。(5)PC輸出5,從存儲(chǔ)器取出第六條指令subi ri0,ri0,1,在周期結(jié)束時(shí)打人IR。BTAKEN0,周期結(jié)束時(shí)把6打人PC。第六個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第七個(gè)周期時(shí),PC輸出6,

40、指向第七條指令;IR輸出第六條指令subiri0,ri0,1;A和B分別輸出寄存器r9和r8的內(nèi)容,I送出32位的200(第五條指令);R輸出加法結(jié)果(第四條指令);C輸出第三條指令減法操作的結(jié)果。7第七個(gè)時(shí)鐘周期(圖6。20)圖620 程序例子執(zhí)行時(shí)的第七個(gè)周期本例中只有6條指令,實(shí)際上處理機(jī)繼續(xù)執(zhí)行其它指令,我們不再演示這些指令。第三條指令進(jìn)入WB級(jí),第四條指令進(jìn)入MEM級(jí),第五條指令進(jìn)入EXE級(jí),第六條指令進(jìn)入ID級(jí)。這4條指令的操作在各自的級(jí)同時(shí)進(jìn)行:(1)第三條指令subr4,r5,r6處在WB級(jí)。這時(shí),d輸出4。寄存器寫使能信號(hào)WREG=1。SLD0,選擇C的輸出,即把減法結(jié)果寫入

41、寄存器堆的r4寄存器。至此,第三條指令也完成了它的執(zhí)行,退出流水線。(2)處在MEM級(jí)的第四條addr7,r5,r6把R的輸出直接傳遞到C。(3)處在EXE級(jí)的第五條指令storer8,200(r9)由ALU計(jì)算存儲(chǔ)器地址。多路器的選擇信號(hào)SIMMl,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和I。WZ0,不改變流水線寄存器Z。B的內(nèi)容直接傳遞到S。(4)處在ID級(jí)的第六條指令subi rlO,f10,1完成譯碼、立即數(shù)符號(hào)擴(kuò)展以及讀寄存器操作。這時(shí)SST任意。在本周期結(jié)束時(shí),擴(kuò)展的立即數(shù)1和寄存器rlo的內(nèi)容分別寫入流水線寄存器1和A。第七個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第八個(gè)周期時(shí),

42、A和1分別輸出寄存器r10的內(nèi)容和立即數(shù)1(第六條指令);R輸出存儲(chǔ)器地址,S輸出存儲(chǔ)器數(shù)據(jù)(第五條指令);C輸出第四條指令加法操作的結(jié)果。8第八個(gè)時(shí)鐘周期(圖621)圖621 程序例子執(zhí)行時(shí)的第八個(gè)周期 本周期中,第四條指令進(jìn)入WB級(jí),第五條指令進(jìn)入MEM級(jí),第六條指令進(jìn)入EXE級(jí)。這3條指令的操作在各自的級(jí)同時(shí)進(jìn)行: (1)第四條指令add r7,r5,r6處在WB級(jí)。這時(shí),d輸出?。寄存器寫使能信號(hào)WREG1。SLD0,選擇C的輸出,即把加法結(jié)果寫入寄存器堆的r7寄存器。至此,第四條指令也完成了它的執(zhí)行,退出流水線。 (2)處在MEM級(jí)的第五條store r8,200(r9)把S的輸出寫

43、入由R指定的存儲(chǔ)器單元。 (3)處在EXE級(jí)的第六條指令subiri0,r10,1由ALU做減法。多路器的選擇信號(hào)SIMM:1,選擇立即數(shù)。ALU的兩個(gè)源操作數(shù)分別來(lái)自流水線寄存器A和I。WZ1,改變流水線寄存器Z。 第八個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第九個(gè)周期時(shí),只有R輸出減法結(jié)果,其它的均沒有用。 9第九個(gè)時(shí)鐘周期(圖6,22) 本周期中,第五條指令進(jìn)入WB級(jí),第六條指令進(jìn)人MEM級(jí)。這兩條指令的操作在各自的級(jí)同時(shí)進(jìn)行: (1)第五條指令store處在WB級(jí)。這時(shí)它什么也不做。實(shí)際上store指令在前一個(gè)周期已完成執(zhí)行。 (2)處在MEM級(jí)的第六條指令subiri0,ri0,1把R的輸出傳遞到

44、C。 第九個(gè)時(shí)鐘周期結(jié)束后,即剛進(jìn)入第十個(gè)周期時(shí),只用C中的減法結(jié)果,其它的均沒有用。 10第十個(gè)時(shí)鐘周期(圖623)第六條指令subirl0,r10,1處在WB級(jí)。這時(shí),d輸出10。寄存器寫使能信號(hào)WREG1。SLD0,選擇C的輸出。即把減法結(jié)果寫入寄存器堆的ri0寄存器。至此,第六條指令也完成了它的執(zhí)行,退出流水線。第十個(gè)時(shí)鐘周期結(jié)束后,所有的6條指令的執(zhí)行均已完成。632 流水線轉(zhuǎn)移指令控制到目前為止,我們討論了ALU類型指令和存儲(chǔ)器訪問指令的流水線執(zhí)行的情況。以下我們將討論控制相關(guān)(contr01dependence)和轉(zhuǎn)移指令在流水線處理機(jī)中的執(zhí)行情況。轉(zhuǎn)移指令改變程序的順序執(zhí)行次序,轉(zhuǎn)向其它地址(稱作轉(zhuǎn)移目標(biāo)地址,brallch target addTess)去取指令執(zhí)行。轉(zhuǎn)移指令包括條件轉(zhuǎn)移和五條件轉(zhuǎn)移兩類指令。在我們定義的指令系統(tǒng)中,轉(zhuǎn)移指令有bne disp 非0時(shí)轉(zhuǎn)移(branch on not equal to zero) if,PC=PC+disp圖622 程序例子執(zhí)行時(shí)的第九個(gè)周期圖623 程序例子執(zhí)行時(shí)的第十個(gè)周期 beq disp 為0時(shí)轉(zhuǎn)移(branch on equal to zero) if Z,PCPC+disp branch disp 為條件轉(zhuǎn)移(uncondit

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論