一種基于cisc指令集的流水線取指和譯碼方法
【專利摘要】本發明公開了一種基于CISC指令集的流水線取指和譯碼方法,其實現過程為:1、將指令取入譯碼級,每周期取一字節長度的指令;2、指令長度寄存器向右移一位;3、指令執行周期數寄存器向右移一位;4、若指令長度寄存器數值為零,且指令執行周期數寄存器數值也為零,轉到1,否則轉到2,并且取指級輸出空指令給譯碼級。所涉及的指令集,指令長度為1到4個字節,指令執行時間為1到11個時鐘周期。本發明克服了傳統CISC指令集取指和預譯碼技術的不足,解決傳統CISC流水線設計需要增加額外譯碼周期和預譯碼電路的問題,可用于實現一類基于CISC指令集的流水線設計。
【專利說明】
一種基于CI SC指令集的流水線取指和譯碼方法
技術領域
[0001 ]本發明涉及基于CISC指令集的微處理器流水線設計領域,更進一步涉及兼容MCS-51指令集的CIP8051內核中微控制器的流水線取指和譯碼方法。
【背景技術】
[0002]流水線技術是一種指令并行執行的技術。該技術將一個操作分成幾個執行時間基本相等的步驟,通過插入寄存器來暫存每個步驟的執行結果,并以此作為下一個步驟的輸入數據。精簡指令集(RISC)中每條指令均為單操作,且指令長度相同,因此指令操作易于劃分為N個流水線步驟,當流水線填滿時,則流水線中會有N條指令在同時執行。采用流水線后,單條指令的執行周期沒有縮短,但每個時鐘周期都會有一條指令執行完畢,現代處理器已廣泛采用流水線設計。
[0003]但是,復雜指令集(CISC)中各條指令長度不一,且各指令執行周期數也不盡相同,這使得其指令非單操作,很難劃分流水級,在流水線實現上存在難度。傳統實現Cl SC指令集的流水線設計主要采用預譯碼的方法來實現,將指令一次性取出,通過預譯碼將復雜的Cl SC指令簡單的類似于RI SC的微指令,然后再對Cl SC微指令進行流水,如在論文《32位Cl SC微處理器流水線的設計》即采用這種方法。這種譯碼方法,將指令一次性取出,需要較寬的總線;同時由于增加了預譯碼電路,增大了電路的復雜性,也增加了額外的譯碼周期。
【發明內容】
[0004]本發明的目的在于克服傳統CISC指令集取指和預譯碼技術的不足,解決傳統CISC流水線設計需要增加額外譯碼周期和預譯碼電路的問題,提出了一種基于CISC指令集的流水線取指和譯碼方法。
[0005]實現本發明目的方法的具體手段為:一種基于CISC指令集的流水線取指和譯碼方法,將流水線第一級指定為取指級,完成取指令;將流水線第二級指定為譯碼級,完成指令執行周期數的確定、指令字節數的確定,并通過指令長度寄存器和指令執行周期數寄存器記錄當前指令的取指和執行情況;流水線第三級為執行級,完成指令執行和計算結果寫回;其中第二級流水線中計算完成的指令執行周期數和指令字節數以組合邏輯值的形式反饋回第一級流水中;包括如下步驟:
(1)初始化指令長度寄存器和指令執行周期數寄存器的值為零;
(2)在取指級中,每個時鐘周期取一條指令的一個字節,送入譯碼級中;
(3)若指令長度寄存器和指令執行周期數寄存器值都為零,說明當前進入譯碼電路的指令字節為一條指令的第一個字節,根據該字節編碼,譯出當前指令長度的字節數和當前指令需要執行的周期數;
(4)指令長度寄存器存放的值右移一位;
(5)指令執行周期數寄存器中存放的值右移一位;
(6)將指令長度寄存器和指令執行周期數寄存器的移位結果反饋回取指級,在取指級中,若移位后指令長度寄存器中4比特數值相或為I,且指令執行周期數寄存器中11比特相或為I,說明指令尚未全部取完,返回步驟(2);若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為O,說明需要取新指令,返回執行步驟(2);若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為I,則取指級流水線暫停,輸出空指令給譯碼級,返回步驟(5)。
[0006]采用指令長度寄存器來記錄當前指令的所有字節是否被取完的情況;所述指令長度寄存器位寬為4比特,若當前指令長度為η個字節,則指令長度寄存器第η-1比特位等于I,其他比特位設定為O;每取指令的一個字節,所述指令長度寄存器的值向右移動I個比特位,若所述指令長度寄存器的值為4,bOOOO,則當前指令的取值工作全部完畢;其中,η為自然數,I <η<40
[0007]采用指令執行周期數寄存器記錄當前指令需要被執行完成的周期數;所述指令執行周期數寄存器位寬為11比特,若當前指令的執行周期數為m個周期,則指令執行周期數寄存器第m-Ι比特位等于I,其他比特位設定為O;每取指令的一個字節,所述指令執行周期數寄存器的值向右移動I個比特位,若所述指令執行周期數寄存器的值為ll’b0000_0000_000,則當前指令的執行工作全部完畢;其中,m為自然數,I 11。
[0008]本發明方法適用于指令長度為I到4個字節、指令執行周期與指令字節數不一定相等、指令執行周期為I到11個時鐘周期、指令執行周期大于等于指令字節數的一類CISC指令集。
[0009]本發明克服了傳統CISC指令集取指和預譯碼技術的不足,解決傳統CISC流水線設計需要增加額外譯碼周期和預譯碼電路的問題,可用于實現一類基于CISC指令集的流水線設計。
【附圖說明】
[0010]圖1為本發明的流水線結構圖。
[0011 ]圖2為本發明的流水線取指和譯碼工作流程圖。
[0012]圖3為本發明的實例工作時序圖。
【具體實施方式】
[0013]參照附圖1,本發明的流水線劃分為三級:取指級,譯碼級和執行級。其中,取指級從程序存儲器中將指令碼取出,每次取一個字節。譯碼級接收來自取指級的指令碼,并對其進行譯碼,獲得指令的執行周期數和指令長度,并將這兩個值以組合邏輯的形式返回。執行級從數據存儲器中取出數據,并執行運算,將結果寫回。
[0014]參照附圖2,本發明的一種基于CISC指令集的流水線取指和譯碼方法的具體實施步驟如下:
(1)初始化指令長度寄存器和指令執行周期數寄存器的值為零;
(2)在取指級中,每個時鐘周期從程序存儲器中取一條指令的一個字節,送入譯碼級中;其中,取指令過程中對程序存儲器采用組合邏輯讀的形式,
(3)在譯碼級中,若指令長度寄存器和指令執行周期數寄存器值都為零,說明當前進入譯碼電路的指令字節為一條指令的第一個字節,根據該字節編碼,譯出當前指令長度的字節數和當前指令需要執行的周期數;譯碼過程中,遵循CIP8051的MCS-51指令集手冊;
(4)將指令長度寄存器存放的值右移一位;
(5)將指令執行周期數寄存器存放的值右移一位;
(6)將指令長度寄存器和指令執行周期數寄存器的移位結果以組合邏輯的形式反饋回取指級;同時,將移位結果分別寫入指令長度寄存器和指令執行周期數寄存器;
(7)在取指級中,若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為O,返回執行步驟(2);若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為I,則取指級流水線暫停,輸出空指令給譯碼級,返回步驟(5);若移位后指令長度寄存器中4比特數值相或為I,且指令執行周期數寄存器中11比特相或為I,說明指令尚未取完,返回步驟(2)。
[0015]參照附圖3,以一條長度為兩個字節,執行時間為三個時鐘周期的指令為例,在時鐘I上升沿該指令的第一個字節進入譯碼級,具體實現方法如下:
(1)初始化指令長度寄存器和指令執行周期數寄存器為零;
(2)時鐘I上升沿來臨時,取指級從程序存儲器中取一個長度為一個字節的指令值,送入譯碼級;
(3)判斷指令周期狀態寄存器的值為零,則說明進來的是一條新指令,對譯碼級中的一個字節指令進行譯碼,從而獲得指令長度值和指令執行周期數,即此時指令長度值為4’b0010,指令執行周期數值為11’b0000_0000_100;
(4)指令長度數值右移一位,移位結果為4’ bOOOI;
(5)指令執行周期數值右移一位,移位結果為1ΓΜ000_0000_010;
(6)指令長度數值和指令執行周期數值的移位結果以組合邏輯的形式反饋回取指級;同時,將移位結果分別寫入指令長度寄存器和指令執行周期數寄存器;
(7)在取指級中,指令長度數值為4’b0001,各比特位相或值不為零,同時指令執行周期數值為11 ’ b0000_0000_010,各比特位相或值不為零,故時鐘2上升沿來臨時,繼續從程序存儲器中取指令,則該指令的第二個字節進入譯碼級;
(8)時鐘2上升沿到來后,在譯碼級,將指令長度寄存器的值右移一位,此時指令長度寄存器的值為4’bOOOO;
(9)時鐘2上升沿到來后,在譯碼級,將指令執行周期數寄存器的值右移一位,此時指令執行周期數寄存器的值為1110000_0000_001;
(10)指令長度數值和指令執行周期數值的移位結果以組合邏輯的形式反饋回取指級;同時,將移位結果分別寫入指令長度寄存器和指令執行周期數寄存器;
(11)在取指級中,指令長度數值為4’bOOOO,各比特位相或值為零,但是指令執行周期數值為11,b0000_0000_001,各比特位相或值不為零,故時鐘3上升沿來臨時,取指級流水線暫停,輸出空指令給譯碼級;
(12)時鐘3上升沿到來后,在譯碼級,將指令執行周期數寄存器的值右移一位,此時指令執行周期數寄存器的值為11’b0000_0000_000;
(13)指令長度數值和指令執行周期數值的移位結果以組合邏輯的形式反饋回取指級;同時,將移位結果分別寫入指令長度寄存器和指令執行周期數寄存器;
(14)在取指級中,指令長度數值為4’b0000,各比特位相或值為零,同時指令執行周期數值為ll’b0000_0000_000,各比特位相或值為零,故時鐘4上升沿來臨時,返回執行步驟
(I)。
【主權項】
1.一種基于CISC指令集的流水線取指和譯碼方法,將流水線第一級指定為取指級,完成取指令;將流水線第二級指定為譯碼級,完成指令執行周期數的確定、指令字節數的確定,并通過指令長度寄存器和指令執行周期數寄存器記錄當前指令的取指和執行情況;流水線第三級為執行級,完成指令執行和計算結果寫回;其中第二級流水線中計算完成的指令執行周期數和指令字節數以組合邏輯值的形式反饋回第一級流水中;包括如下步驟: (1)初始化指令長度寄存器和指令執行周期數寄存器的值為零; (2)在取指級中,每個時鐘周期取一條指令的一個字節,送入譯碼級中; (3)若指令長度寄存器和指令執行周期數寄存器值都為零,說明當前進入譯碼電路的指令字節為一條指令的第一個字節,根據該字節編碼,譯出當前指令長度的字節數和當前指令需要執行的周期數; (4)指令長度寄存器存放的值右移一位; (5)指令執行周期數寄存器中存放的值右移一位; (6)將指令長度寄存器和指令執行周期數寄存器的移位結果反饋回取指級,在取指級中,若移位后指令長度寄存器中4比特數值相或為I,且指令執行周期數寄存器中11比特相或為I,說明指令尚未全部取完,返回步驟(2);若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為O,說明需要取新指令,返回執行步驟(2);若移位后指令長度寄存器中4比特數值相或為O,且指令執行周期數寄存器中11比特相或為I,則取指級流水線暫停,輸出空指令給譯碼級,返回步驟(5)。2.根據權利要求1所述的基于CISC指令集的流水線取指和譯碼方法,其特征在于,采用指令長度寄存器來記錄當前指令的所有字節是否被取完的情況;所述指令長度寄存器位寬為4比特,若當前指令長度為η個字節,則指令長度寄存器第η-1比特位等于I,其他比特位設定為O;每取指令的一個字節,所述指令長度寄存器的值向右移動I個比特位,若所述指令長度寄存器的值為4’bOOOO,則當前指令的取值工作全部完畢;其中,η為自然數,I < η < 4。3.根據權利要求1所述的基于CISC指令集的流水線取指和譯碼方法,其特征在于,采用指令執行周期數寄存器記錄當前指令需要被執行完成的周期數;所述指令執行周期數寄存器位寬為11比特,若當前指令的執行周期數為m個周期,則指令執行周期數寄存器第m-1比特位等于1,其他比特位設定為O;每取指令的一個字節,所述指令執行周期數寄存器的值向右移動I個比特位,若所述指令執行周期數寄存器的值為11,b0000_0000_000,則當前指令的執行工作全部完畢;其中,m為自然數,I < m < 11。
【文檔編號】G06F9/38GK105824603SQ201610140888
【公開日】2016年8月3日
【申請日】2016年3月14日
【發明人】邸志雄, 向乾尹, 馮全源, 劉彤陽, 周洋程
【申請人】西南交通大學