日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现

發(fā)布時(shí)間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

自己動(dòng)手寫CPU(6)流水線暫停、乘累加減與除法器的實(shí)現(xiàn)

流水線暫停

因?yàn)镺penMIPS設(shè)計(jì)乘累加、乘累減、除法指令在流水線執(zhí)行階段占用多個(gè)時(shí)鐘周期,因此需要暫停流水線,以等待這些多周期指令執(zhí)行完畢。OpenMIPS采用的是一種改進(jìn)的方法:假如位于流水線第n階段的指令需要多個(gè)時(shí)鐘周期,進(jìn)而請(qǐng)求流水線暫停,那么需保持取指令地址PC的值不變,同時(shí)保持流水線第n階段、第n階段之前的各個(gè)階段的寄存器不變,而第n階段后面的指令繼續(xù)運(yùn)行。

為實(shí)現(xiàn)CPU的流水線暫停功能,我們?cè)O(shè)計(jì)添加了CTRL模塊,其作用是接收各階段傳遞過(guò)來(lái)的流水線暫停請(qǐng)求信號(hào),從而控制流水線各階段的運(yùn)行。CTRL模塊對(duì)譯碼和執(zhí)行階段的暫停請(qǐng)求信號(hào)進(jìn)行判斷,然后輸出流水線暫停信號(hào)stall。下圖是為了實(shí)現(xiàn)流水線暫停機(jī)制而對(duì)系統(tǒng)結(jié)構(gòu)所做的修改。具體代碼修改之處見文末的項(xiàng)目鏈接。

指令介紹

乘累加、乘累減指令共有4條,包括: madd、maddu、msub、msubu,各指令的格式如下圖所示。從圖中可知,這4條指令的指令碼都是SPECIAL2,第6~15bit都為0,可以依據(jù)第0~5bit的功能碼確定是哪一種指令。

  • 當(dāng)功能碼是6’b000000時(shí),表示是madd指令,有符號(hào)乘累加運(yùn)算。指令用法為:madd rs, rt。指令作用為:{HI, LO}<-{HI, LO}+ rs x rt,將地址為rs的通用寄存器的值與地址為rt的通用寄存器的值作為有符號(hào)數(shù)進(jìn)行乘法運(yùn)算,運(yùn)算結(jié)果與{HI, LO}相加,相加的結(jié)果保存到{HI, LO}中。此處{HI, LO}表示 HI、LO寄存器連接形成的64位數(shù),HI是高32位,LO是低32位。
  • 當(dāng)功能碼是6’b000001時(shí),表示是 maddu指令,無(wú)符號(hào)乘累加運(yùn)算。指令用法為:maddu rs, rt。指令作用為: {HI, LO} <- {HI, LO} + rs × rt,將地址為rs的通用寄存器的值與地址為rt的通用寄存器的值作為無(wú)符號(hào)數(shù)進(jìn)行乘法運(yùn)算,運(yùn)算結(jié)果與{HI, LO}相加,相加的結(jié)果保存到{HI,LO}中。
  • 當(dāng)功能碼是6’b000100時(shí),表示是msub指令,有符號(hào)乘累減運(yùn)算。指令用法為:msub rs, rt。指令作用為:{HI, LO}<-{HI,LO} - rs × rt,將地址為rs 的通用寄存器的值與地址為rt的通用寄存器的值作為有符號(hào)數(shù)進(jìn)行乘法運(yùn)算。然后使用{HI,LO}減去乘法結(jié)果,相減的結(jié)果保存到{HI,LO}中。
  • 當(dāng)功能碼是6’b000101時(shí),表示是 msubu指令,無(wú)符號(hào)乘累減運(yùn)算。指令用法為:msubu rs, rt。指令作用為:{HI, LO} <-{HI, LO} - rs × rt,將地址為rs的通用寄存器的值與地址為rt的通用寄存器的值作為無(wú)符號(hào)數(shù)進(jìn)行乘法運(yùn)算。然后使用{HI,LO}減去乘法結(jié)果,相減的結(jié)果保存到{HI,LO}中。

修改之處

實(shí)現(xiàn)思路

乘累加與乘累減指令計(jì)劃在流水線階段采用兩個(gè)時(shí)鐘周期完成運(yùn)算,所以必須要保存兩個(gè)信息:(1)、當(dāng)前是第幾個(gè)時(shí)鐘周期;(2)、乘法結(jié)果。所以O(shè)penMIPS通過(guò)在EX/MEM模塊添加兩個(gè)寄存器cnt、hilo,分別保存上述信息。修改系統(tǒng)結(jié)構(gòu)框圖如下所示:

1.修改譯碼階段的ID模塊

譯碼階段的ID模塊要添加對(duì)乘累加、乘累減指令的分析,根據(jù)給出的指令格式可知,這4條指令都是 SPECIAL2類指令,可以依據(jù)功能碼確定是哪一種指令。確定指令的過(guò)程如下圖所示。

涉及的宏定義如下(因?yàn)椴簧婕皩?duì)通用寄存器的回寫,所以無(wú)需“_OP”的宏定義)

`define EXE_MADD 6'b000000 `define EXE_MADDU 6'b000001 `define EXE_MSUB 6'b000100 `define EXE_MSUBU 6'b000101

這4條指令的譯碼過(guò)程都是相似的,簡(jiǎn)單說(shuō)明如下。

  • 因?yàn)樽罱K結(jié)果都是寫入HI、LO寄存器,而不是寫入通用寄存器,所以設(shè)置wreg_o為WriteDisable。
  • 因?yàn)槎家x取兩個(gè)寄存器的值,所以設(shè)置regl_read_o、reg2_read_o為1‘b1。默認(rèn)通過(guò)Regfile模塊讀端口1讀取的寄存器地址reg1_addr_o的值是指令的第2125bit,正是指令中的rs;默認(rèn)通過(guò)Regfile模塊讀端口⒉讀取的寄存器地址reg2_addr_o的值是指令的第1620bit,正是指令中的rt;所以最終譯碼階段的輸出reg1_o就是地址為rs 的寄存器的值,reg2_o就是地址為rt的寄存器的值。
  • 運(yùn)算類型alusel_o的值都設(shè)置為EXE_RES_MUL,不過(guò)由于沒(méi)有要寫的通用寄存器。所以此處alusel_o的值并沒(méi)有作用,也可以設(shè)置為EXE_RES_NOP。
  • 運(yùn)算子類型aluop _o的值設(shè)置為與具體的指令對(duì)應(yīng)。
  • 2.修改執(zhí)行階段的EX模塊

  • 計(jì)算從通用寄存器中讀出的兩個(gè)寄存器的乘法結(jié)果,保存在mulres 中。
  • 以乘累加指令為例進(jìn)行講解。乘累減指令與此類似。如果 cnt_i為2’b00,表示是乘累加指令的第一個(gè)執(zhí)行周期,此時(shí)將乘法結(jié)果mulres通過(guò)接口 hilo_temp_o輸出到EX/MEM模塊,以便在下一個(gè)時(shí)鐘周期使用。同時(shí),設(shè)置變量stallreq_for_madd_msub為Stop,表示乘累加指令請(qǐng)求流水線暫停;如果 cnt _i為 2’b01,表示是乘累加指令的第二個(gè)執(zhí)行周期,此時(shí)EX模塊的輸入hilo_temp_i就是上一個(gè)時(shí)鐘周期得到的乘法結(jié)果,所以將 hilo_temp_i與 HI、LO寄存器的值相加,得到最終的運(yùn)算結(jié)果,保存到變量 hilo_temp1中。同時(shí),設(shè)置變量stallreq_for_madd_msub為NoStop,表示乘累加指令執(zhí)行結(jié)束,不再請(qǐng)求流水線暫停。最后,設(shè)置cnt_o為2’b10,而不是直接設(shè)置為2’b00,目的是:如果因其他原因?qū)е铝魉€保持暫停,那么由于cnt_o為2’b10,所以EX階段不再計(jì)算,從而防止乘累加指令重復(fù)運(yùn)行。
  • 給出信號(hào)stallreq的值,目前只有乘累加、乘累減指令會(huì)導(dǎo)致流水線暫停,所以stallreq就直接等于變量stallreq for madd msub的值。
  • 由于乘累加、乘累減指令要將最終結(jié)果寫入 HI、LO寄存器,所以在第四段給出了對(duì)HI、LO寄存器的寫信息。
  • 3.修改EX/MEM模塊

    增加兩個(gè)輸入接口hilo_i,cnt_i,增加兩個(gè)輸出接口hilo_o,cnt_o,在流水線執(zhí)行階段暫停的時(shí)候,將輸入信號(hào)hilo_i通過(guò)輸出接口hilo_o送出,輸入信號(hào)cnt i通過(guò)輸出接口cnt_o送出。其余時(shí)刻,hilo_o為0,cnt_o也為0。

    除法器

    采用"試商法"實(shí)現(xiàn)除法運(yùn)算,對(duì)于32位的除法,至少需要32個(gè)時(shí)鐘周期才能得到除法結(jié)果。

    實(shí)現(xiàn)思路

    新建一個(gè)模塊 DIV,在其中實(shí)現(xiàn)采用試商法的32位除法運(yùn)算。當(dāng)流水線執(zhí)行階段的EX模塊發(fā)現(xiàn)當(dāng)前指令是除法指令時(shí),首先暫停流水線,然后將被除數(shù)、除數(shù)等信息送到DIV模塊,開始除法運(yùn)算。DIV模塊在除法運(yùn)算結(jié)束后,通知EX模塊,并將除法結(jié)果送到EX模塊,后者依據(jù)除法結(jié)果設(shè)置HI、LO寄存器的寫信息,同時(shí)取消暫停流水線。

    修改后的系統(tǒng)部分框圖如下

    DIV模塊的主要部分是一個(gè)狀態(tài)機(jī),共有四個(gè)狀態(tài)

    • DivFree:除法模塊空閑;
    • DivByZero:除數(shù)是0;
    • DivOn:除法運(yùn)算進(jìn)行中;
    • DivEnd:除法運(yùn)算結(jié)束;

    作者使用的是一段式的狀態(tài)機(jī),里面阻塞和非阻塞賦值交替使用,對(duì)于我這個(gè)硬件小白來(lái)說(shuō)還是難度太高,我還是老老實(shí)實(shí)用三段式重新實(shí)現(xiàn)了,中間過(guò)程還算有點(diǎn)復(fù)雜,輸出的邏輯既有組合邏輯也有時(shí)序邏輯,好在調(diào)試了一會(huì)之后總算通過(guò)了。

    仿真結(jié)果

    乘累加、乘累減測(cè)試指令

    .org 0x0.set noat.global _start _start:ori $1,$0,0xffff sll $1,$1,16ori $1,$1,0xfffb # $1 = -5ori $2,$0,6 # $2 = 6mult $1,$2 # hi = 0xffffffff# lo = 0xffffffe2madd $1,$2 # hi = 0xffffffff# lo = 0xffffffc4maddu $1,$2 # hi = 0x5# lo = 0xffffffa6msub $1,$2 # hi = 0x5# lo = 0xffffffc4 msubu $1,$2 # hi = 0xffffffff# lo = 0xffffffe2

    由波形圖可見,乘累加、乘累減指令實(shí)現(xiàn)正確,同時(shí)觀察到乘累加、乘累減指令都需要兩個(gè)時(shí)鐘周期來(lái)完成,且兩個(gè)時(shí)鐘周期內(nèi)的PC值都保持不變。

    除法模塊測(cè)試指令

    .org 0x0.set noat.global _start _start:ori $2,$0,0xffffsll $2,$2,16ori $2,$2,0xfff1 # $2 = -15ori $3,$0,0x11 # $3 = 17div $zero,$2,$3 # hi = 0xfffffff1,lo = 0x0divu $zero,$2,$3 # hi = 0x00000003,lo = 0x0f0f0f0ediv $zero,$3,$2 # hi = 2,lo = 0xffffffff

    實(shí)驗(yàn)心得

    執(zhí)行階段的EX模塊對(duì)HI、LO寄存器的寫操作為什么不引入cnt_i來(lái)進(jìn)行判斷呢?即cnt_i=2’b01(執(zhí)行階段的第二個(gè)周期)再加上功能碼的定義來(lái)進(jìn)行對(duì)HI、LO寄存器是否寫入的決策呢?

    聯(lián)系前后模塊發(fā)現(xiàn),EX模塊發(fā)出暫停流水線的請(qǐng)求后,EX_MEM模塊收到來(lái)自EX模塊的暫停流水線請(qǐng)求后就把HI、LO寄存器的寫使能關(guān)閉了,也就是說(shuō)我們?cè)诔死奂印⒊死蹨p的第一階段的寫指令是傳不到HILO寄存器堆的,所以就不用加上cnt_i這個(gè)冗余指令的判斷過(guò)程了。

    三段式狀態(tài)機(jī)還需多多訓(xùn)練,多注意時(shí)序上的問(wèn)題,哪些變量在上升沿賦值,哪些變量是組合邏輯賦值。

    乘累加、乘累減項(xiàng)目
    除法運(yùn)算項(xiàng)目

    總結(jié)

    以上是生活随笔為你收集整理的自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美在线不卡 | 99综合久久 | 黑人巨大精品欧美黑寡妇 | 二级毛片视频 | 人妻精品无码一区二区三区 | 玉女心经在线看 | 风流少妇一区二区三区91 | av大帝 | 欧美理论片在线观看 | 黄色小视频大全 | 亚洲精品小视频 | 成人一区二区三区仙踪林 | cao死你| 欧美久久久影院 | 精品人伦一区二区三区蜜桃免费 | 精品中文一区二区三区 | 亚欧精品视频一区二区三区 | 免费在线观看www | 国产乱淫精品一区二区三区毛片 | 免费成人av在线 | 日批免费观看 | 国产黄色片子 | 久久精品一区二区国产 | 女人喷潮完整视频 | 欧美aaaa视频 | 性色av一区二区三区红粉影视 | 黄色片网站免费在线观看 | 亚洲欧美日韩图片 | 日日草草 | 国产精品一区二区久久久 | 国产一级片播放 | 香蕉视频官网在线观看 | 黑人巨大精品欧美一区免费视频 | 日韩三级一区二区三区 | 在线1区 | 免费看欧美片 | 国产探花视频在线观看 | 狠狠干狠狠操视频 | 中文字幕1区 | 神马午夜场 | 国产精品99无码一区二区视频 | 看毛片看毛片 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 亚洲欧美日韩色 | 国内自拍网站 | 成人午夜激情 | 午夜aaa片一区二区专区 | 91丝袜呻吟高潮美腿白嫩 | 天天操一操 | 四虎影视永久免费观看 | 成年人福利 | 在线播放一区二区三区 | 亚洲天堂成人av | 国产精品视频播放 | 性猛交富婆╳xxx乱大交天津 | 国产精品88 | 国产精品视频久久久久久久 | 潮喷失禁大喷水无码 | 亚洲一二三区视频 | 性爱视频免费 | 一区二区福利电影 | 日本夜夜操 | 日韩av二区 | 中文字幕123 | 国产精品香蕉在线 | 久久精品视频16 | 性色视频在线 | 日韩高清国产一区在线 | 浓精喷进老师黑色丝袜在线观看 | 97久久免费视频 | 欧美性受xxxx黒人xyx性爽 | 日韩精品在线观看一区二区三区 | 国内久久精品 | 高h视频在线观看 | 蜜桃臀av一区二区三区 | 91国内精品视频 | babes性欧美69| 18禁裸男晨勃露j毛免费观看 | 插综合| 亚洲欧美日韩偷拍 | 99福利网| 亚洲午夜在线视频 | av综合导航 | a在线观看视频 | 中文字幕一区二 | 日韩亚洲欧美一区二区三区 | 国产一区二区播放 | 欧美精品v | 国产麻豆网| 久久久久久网 | 国产精品99久久久久久久 | 伊人影院综合在线 | 国产三级视频在线播放 | 久久久久久99 | 哪里有毛片看 | 九九热视| 色综合中文网 | 黄视频免费观看 | 永久免费未满视频 |