数据通路
CPU组合逻辑和时序逻辑电路上流通输入、计算、存储和输出的数据数据通路
。
PC
32位处理器用32位触发器存放PC。PC的输出送到虚实地址转换的零件
,PC有两种输入,一种是复位值0xBFC一是复位撤销后每执行一项指令更新为当前PC 4得到的值。
虚实地址转换
在实现TLB MMU之前,CPU采用固定映射地址映射机制,以段为单位进行虚实地址转换,转换方式为硬件固定,而非软件配置。
映射算法
虚地址kseg0段(0x8000000 ~ 0x9FFFFFFF)最低512MB(0x00000000~0x1FFFFFFF)。 虚地址kseg1段(0xA0000000 ~ 0xBFFFFFFF)最低512MB(0x00000000~0x1FFFFFFF)。 其余三个段都是物理地址的值等于虚地址的值。
指令RAM
采用片上RAM将作为内存RAM进一步拆为指令RAM和数据RAM,两块物理独立RAM。 目前工程实践中常用的是同步阅读RAM。第一拍发读请求和地址,第二拍RAM输出阅读数据。RAM单周期无法实现CPU,所以暂时使用异步RAM。异步RAM读取时序行为类似于寄存器堆的读取,当拍摄地址和数据时,当时序行为和同步读取RAM的一样。
ADDU和ADDIU
可复用加法器。
差异一
ADDU:第二个操作数是通用寄存器堆读端口2的输出数据rdata2。 ADDIU:第二个源操作数是指令码15-0位符号扩展到32位后形成的数据。 加法器的第二个输入数据源应根据情况进行处理,在电路设计中,通过引入一个32位的二选一部体现的
。 二选一的in1—rdata2 in2-15-0位符号扩展到32位后形成的数据 out—加法器第二个数据输入 sel—控制信号(ADDUI和ADDU可以区分编码,作为产生多路选择器的控制信号)
差异二
ADDU的结果写入rd中,ADDUI写到rt中。通用寄存器的端口地址不再是唯一的,再介绍一个二选一
,从指令码rd域数值和rt选择域数值中的结果,然后连接到通用寄存器堆写端口的地址端口waddr上。
SUBU
与ADDU区别在于前者做减法,后者做加法。考虑到补码加减操作的属性 A补-B补=(A-B)补=A补 (-B)补=A补 (~ B补) 1 添加二选一部件,加法器对源操作数2的进位和输入。 源操作数2—src2,处理减法时,按位取反
处理加法时进位输入为0,处理减法时为1
选择信号是通过不同指令之间指令码的差异来区分控制信号
LW和SW
功能及取指ADDU一样。
- 生成访存地址
- 数据RAM
- 寄存器堆回结果选择
- SW指令和LW指令的区别在于LW读RAM写通用寄存器SW读一般寄存器写作RAM。对于sw要在lw基于对写RAM功能增加新的数据通路。第一个写入内存的是rt寄存器值。 通用寄存器堆读端口2的输出rdata2连接到数据RAM编写数据端口wdata上 $rt–>rdata2–>wdata ========================================================== 很多二选一,我没有跟着画,脑子糊了,一点也不想 学。。。 ==========================================================
BEQ和BNE
(1)判断分支条件 (2)计算跳转目标 (3)PC更新
JAL和JR
JAL
(1)不需要判断分支条件,跳转 (2)计算跳转目标地址延迟槽指令的转移PC以及指令码中的立即数
,就算方式是拼接
不是相加 (3)不仅要修改PC,还要写通用寄存器 注意一下link操作,call,return两个跳转
JR
(1)不需要条件判断,会跳 (2)跳转的目标地址来自通用寄存器堆rs
STL和STLU
算术操作指令 从源操作数输入到结果的操作过程和ADD,ADDU不同的是,其他的是一样的。因此,添加一个比较器,可以处理两个32位数据的符号和无符号大小。
输入
与连接到加法器的数据输入相同 控制信号输入用于识别符号比较或无符号比较
输出
输出比较结果为0或1 增加一个32位二选一部件,in0接入原加法器的输出,in1接入比较器的结果。 如果用"<“或者”>"去比较,它消耗一定的逻辑电路资源。 复用加法器GR[rs]-GR[rt]根据源操作数的正负和和(sum)正负,进位(cout)可以得到正负SLT和SLTU结果。这些结果和原加法器结果通过一个二选一部分获得计算指令的执行结果,然后输入产生最终写通用寄存器值的二选一部分。
SLL,SRL,SRA
移位指令。分别是逻辑左移、逻辑右移和算术右移。 添加移位器数据通路。
输入/输出
输入:
- 32位的被移位数值src
- 5位的移位量sa
- 用于确定移位操作类型的控制输入op
输出:
- 32位移位结果res src<-rdata2 sa<-sa 执行结果的最终选择电路应从二选一扩展到三选一。
shft_op
选择shft_res
区域优化电路设计
基本思想是逆序排列移位数据,左转操作转换为右转操作
=============================================================
任务和实践
练习一:简单CPU参考设计调试
简要步骤:
- 打开
cpu132_gettrace(cpu132_gettrace.xpr)
工程,进行IP核升级 - 运行
cpu132_gettrace(cpu132_gettrace.xpr)
工程模拟,生成新的参考Trace文件golden_trace.txt
,仿真操作完成后,golden_trace.txt会有新的内容 - 打开
myCPU
工程,进行IP核的升级 - 运行
myCPU
模拟、操作和调试 myCPU
模拟通过后,综合实现并生成比特流文件进行上板验证
判断模拟结果
以下是控制台的输出: 如果全都是PASS也就是说,操作已经通过,这是发布包给出的CPU,一定没有问题,所以理所当然89个
所有测试点都通过了。
==============================================================
Test begin!
----[ 14055 ns] Number 8'd01 Functional Test Point PASS!!!
[ 22000 ns] Test is running, debug_wb_pc = 0xbfc5e4bc
[ 32000 ns] Test is running, debug_wb_pc = 0xbfc5f45c
----[ 40555 ns] Number 8'd02 Functional Test Point PASS!!!
[ 42000 ns] Test is running, debug_wb_pc = 0xbfc89418
----[ 49475 ns] Number 8'd03 Functional Test Point PASS!!!
[ 52000 ns] Test is running, debug_wb_pc = 0xbfc3ac78
[ 62000 ns] Test is running, debug_wb_pc = 0xbfc3bf94
[ 72000 ns] Test is running, debug_wb_pc = 0xbfc3d278
----[ 73845 ns] Number 8'd04 Functional Test Point PASS!!!
[ 82000 ns] Test is running, debug_wb_pc = 0xbfc24530
[ 92000 ns] Test is running, debug_wb_pc = 0xbfc2568c
[ 102000 ns] Test is running, debug_wb_pc = 0xbfc26c18
----[ 111715 ns] Number 8'd05 Functional Test Point PASS!!!
[ 112000 ns] Test is running, debug_wb_pc = 0xbfc00768
[ 122000 ns] Test is running, debug_wb_pc = 0xbfc4a308
----[ 127355 ns] Number 8'd06 Functional Test Point PASS!!!
[ 132000 ns] Test is running, debug_wb_pc = 0xbfc6a758
[ 142000 ns] Test is running, debug_wb_pc = 0xbfc6b6f8
[ 152000 ns] Test is running, debug_wb_pc = 0xbfc6c698
----[ 153775 ns] Number 8'd07 Functional Test Point PASS!!!
[ 162000 ns] Test is running, debug_wb_pc = 0xbfc50aa0
[ 172000 ns] Test is running, debug_wb_pc = 0xbfc51a40
----[ 177225 ns] Number 8'd08 Functional Test Point PASS!!!
[ 182000 ns] Test is running, debug_wb_pc = 0xbfc03c5c
[ 192000 ns] Test is running, debug_wb_pc = 0xbfc04bfc
----[ 195165 ns] Number 8'd09 Functional Test Point PASS!!!
[ 202000 ns] Test is running, debug_wb_pc = 0xbfc3e0a4
[ 212000 ns] Test is running, debug_wb_pc = 0xbfc3f044
----[ 213105 ns] Number 8'd10 Functional Test Point PASS!!!
[ 222000 ns] Test is running, debug_wb_pc = 0xbfc6f88c
[ 232000 ns] Test is running, debug_wb_pc = 0xbfc7082c
----[ 232405 ns] Number 8'd11 Functional Test Point PASS!!!
[ 242000 ns] Test is running, debug_wb_pc = 0xbfc02484
----[ 249835 ns] Number 8'd12 Functional Test Point PASS!!!
[ 252000 ns] Test is running, debug_wb_pc = 0xbfc3f558
[ 262000 ns] Test is running, debug_wb_pc = 0xbfc406ec
[ 272000 ns] Test is running, debug_wb_pc = 0xbfc418ac
----[ 278055 ns] Number 8'd13 Functional Test Point PASS!!!
[ 282000 ns] Test is running, debug_wb_pc = 0xbfc63e60
[ 292000 ns] Test is running, debug_wb_pc = 0xbfc64f80
[ 302000 ns] Test is running, debug_wb_pc = 0xbfc660bc
[ 312000 ns] Test is running, debug_wb_pc = 0xbfc671ac
----[ 316265 ns] Number 8'd14 Functional Test Point PASS!!!
[ 322000 ns] Test is running, debug_wb_pc = 0xbfc8439c
[ 332000 ns] Test is running, debug_wb_pc = 0xbfc854f8
[ 342000 ns] Test is running, debug_wb_pc = 0xbfc86654
[ 352000 ns] Test is running, debug_wb_pc = 0xbfc877b0
----[ 354995 ns] Number 8'd15 Functional Test Point PASS!!!
----[ 358265 ns] Number 8'd16 Functional Test Point PASS!!!
----[ 361535 ns] Number 8'd17 Functional Test Point PASS!!!
[ 362000 ns] Test is running, debug_wb_pc = 0xbfc39ab8
----[ 363495 ns] Number 8'd18 Functional Test Point PASS!!!
----[ 365975 ns] Number 8'd19 Functional Test Point PASS!!!
----[ 368455 ns] Number 8'd20 Functional Test Point PASS!!!
[ 372000 ns] Test is running, debug_wb_pc = 0xbfc7f790
[ 382000 ns] Test is running, debug_wb_pc = 0xbfc80730
----[ 390305 ns] Number 8'd21 Functional Test Point PASS!!!
[ 392000 ns] Test is running, debug_wb_pc = 0xbfc0a8dc
[ 402000 ns] Test is running, debug_wb_pc = 0xbfc0b87c
----[ 410745 ns] Number 8'd22 Functional Test Point PASS!!!
[ 412000 ns] Test is running, debug_wb_pc = 0xbfc329ac
[ 422000 ns] Test is running, debug_wb_pc = 0xbfc3394c
[ 432000 ns] Test is running, debug_wb_pc = 0xbfc348ec
----[ 432145 ns] Number 8'd23 Functional Test Point PASS!!!
[ 442000 ns] Test is running, debug_wb_pc = 0xbfc61e2c
[ 452000 ns] Test is running, debug_wb_pc = 0xbfc62dcc
----[ 458595 ns] Number 8'd24 Functional Test Point PASS!!!
[ 462000 ns] Test is running, debug_wb_pc = 0xbfc7ac48
[ 472000 ns] Test is running, debug_wb_pc = 0xbfc7bbe8
[ 482000 ns] Test is running, debug_wb_pc = 0xbfc7cb88
----[ 482045 ns] Number 8'd25 Functional Test Point PASS!!!
[ 492000 ns] Test is running, debug_wb_pc = 0xbfc4dae4
[ 502000 ns] Test is running, debug_wb_pc = 0xbfc4ea84
----[ 507425 ns] Number 8'd26 Functional Test Point PASS!!!
[ 512000 ns] Test is running, debug_wb_pc = 0xbfc6d62c
[ 522000 ns] Test is running, debug_wb_pc = 0xbfc6e5cc
----[ 525365 ns] Number 8'd27 Functional Test Point PASS!!!
[ 532000 ns] Test is running, debug_wb_pc = 0xbfc8a9b4
[ 542000 ns] Test is running, debug_wb_pc = 0xbfc8b954
----[ 551795 ns] Number 8'd28 Functional Test Point PASS!!!
[ 552000 ns] Test is running, debug_wb_pc = 0xbfc00d80
[ 562000 ns] Test is running, debug_wb_pc = 0xbfc78f58
[ 572000 ns] Test is running, debug_wb_pc = 0xbfc79ef8
----[ 572235 ns] Number 8'd29 Functional Test Point PASS!!!
[ 582000 ns] Test is running, debug_wb_pc = 0xbfc47bd8
[ 592000 ns] Test is running, debug_wb_pc = 0xbfc48b78
----[ 598685 ns] Number 8'd30 Functional Test Point PASS!!!
[ 602000 ns] Test is running, debug_wb_pc = 0xbfc088e4
[ 612000 ns] Test is running, debug_wb_pc = 0xbfc09884
----[ 619125 ns] Number 8'd31 Functional Test Point PASS!!!
[ 622000 ns] Test is running, debug_wb_pc = 0xbfc761b4
[ 632000 ns] Test is running, debug_wb_pc = 0xbfc77154
----[ 641295 ns] Number 8'd32 Functional Test Point PASS!!!
[ 642000 ns] Test is running, debug_wb_pc = 0xbfc42400
[ 652000 ns] Test is running, debug_wb_pc = 0xbfc433a0
----[ 660535 ns] Number 8'd33 Functional Test Point PASS!!!
[ 662000 ns] Test is running, debug_wb_pc = 0xbfc0cb00
[ 672000 ns] Test is running, debug_wb_pc = 0xbfc0daa0
[ 682000 ns] Test is running, debug_wb_pc = 0xbfc0ea40
----[ 682945 ns] Number 8'd34 Functional Test Point PASS!!!
[ 692000 ns] Test is running, debug_wb_pc = 0xbfc0710c
[ 702000 ns] Test is running, debug_wb_pc = 0xbfc080ac
----[ 702315 ns] Number 8'd35 Functional Test Point PASS!!!
[ 712000 ns] Test is running, debug_wb_pc = 0xbfc5c1e8
[ 722000 ns] Test is running, debug_wb_pc = 0xbfc5d188
----[ 724735 ns] Number 8'd36 Functional Test Point PASS!!!
[ 732000 ns] Test is running, debug_wb_pc = 0xbfc56c68
[ 742000 ns] Test is running, debug_wb_pc = 0xbfc57fb8
[ 752000 ns] Test is running, debug_wb_pc = 0xbfc59398
[ 762000 ns] Test is running, debug_wb_pc = 0xbfc5a760
----[ 767945 ns] Number 8'd37 Functional Test Point PASS!!!
[ 772000 ns] Test is running, debug_wb_pc = 0xbfc1e714
[ 782000 ns] Test is running, debug_wb_pc = 0xbfc1faec
[ 792000 ns] Test is running, debug_wb_pc = 0xbfc20ea4
[ 802000 ns] Test is running, debug_wb_pc = 0xbfc222a8
----[ 810875 ns] Number 8'd38 Functional Test Point PASS!!!
[ 812000 ns] Test is running, debug_wb_pc = 0xbfc70a80
[ 822000 ns] Test is running, debug_wb_pc = 0xbfc71e88
[ 832000 ns] Test is running, debug_wb_pc = 0xbfc73224
[ 842000 ns] Test is running, debug_wb_pc = 0xbfc745bc
[ 852000 ns] Test is running, debug_wb_pc = 0xbfc759e0
----[ 854085 ns] Number 8'd39 Functional Test Point PASS!!!
[ 862000 ns] Test is running, debug_wb_pc = 0xbfc52f9c
[ 872000 ns] Test is running, debug_wb_pc = 0xbfc541dc
[ 882000 ns] Test is running, debug_wb_pc = 0xbfc5543c
----[ 887675 ns] Number 8'd40 Functional Test Point PASS!!!
[ 892000 ns] Test is running, debug_wb_pc = 0xbfc29238
[ 902000 ns] Test is running, debug_wb_pc = 0xbfc2a478
[ 912000 ns] Test is running, debug_wb_pc = 0xbfc2b690
[ 922000 ns] Test is running, debug_wb_pc = 0xbfc2c8e8
[ 932000 ns] Test is running, debug_wb_pc = 0xbfc2db98
----[ 935465 ns] Number 8'd41 Functional Test Point PASS!!!
[ 942000 ns] Test is running, debug_wb_pc = 0xbfc1901c
[ 952000 ns] Test is running, debug_wb_pc = 0xbfc1a2cc
[ 962000 ns] Test is running, debug_wb_pc = 0xbfc1b51c
[ 972000 ns] Test is running, debug_wb_pc = 0xbfc1c75c
[ 982000 ns] Test is running, debug_wb_pc = 0xbfc1d98c
----[ 985425 ns] Number 8'd42 Functional Test Point PASS!!!
[ 992000 ns] Test is running, debug_wb_pc = 0xbfc11cac
[1002000 ns] Test is running, debug_wb_pc = 0xbfc12cb4
[1012000 ns] Test is running, debug_wb_pc = 0xbfc13ccc
[1022000 ns] Test is running, debug_wb_pc = 0xbfc14cc0
[1032000 ns] Test is running, debug_wb_pc = 0xbfc15cc8
----[1040415 ns] Number 8'd43 Functional Test Point PASS!!!
[1042000 ns] Test is running, debug_wb_pc = 0xbfc7d848
[1052000 ns] Test is running, debug_wb_pc = 0xbfc7dd00
[1062000 ns] Test is running, debug_wb_pc = 0xbfc7e1b0
[1072000 ns] Test is running, debug_wb_pc = 0xbfc7e648
[1082000 ns] Test is running, debug_wb_pc = 0xbfc7eae0
[1092000 ns] Test is running, debug_wb_pc = 0xbfc7efac
----[1098085 ns] Number 8'd44 Functional Test Point PASS!!!
[1102000 ns] Test is running, debug_wb_pc = 0xbfc0ed60
[1112000 ns] Test is running, debug_wb_pc = 0xbfc0f210
[1122000 ns] Test is running, debug_wb_pc = 0xbfc0f6c8
[1132000 ns] Test is running, debug_wb_pc = 0xbfc0fb60
[1142000 ns] Test is running, debug_wb_pc = 0xbfc0fff8
[1152000 ns] Test is running, debug_wb_pc = 0xbfc104bc
[1162000 ns] Test is running, debug_wb_pc = 0xbfc10960
[1172000 ns] Test is running, debug_wb_pc = 0xbfc10df8
----[1181995 ns] Number 8'd45 Functional Test Point PASS!!!
[1182000 ns] Test is running, debug_wb_pc = 0xbfc1129c
[1192000 ns] Test is running, debug_wb_pc = 0xbfc34df4
[1202000 ns] Test is running, debug_wb_pc = 0xbfc352f8
[1212000 ns] Test is running, debug_wb_pc = 0xbfc35808
[1222000 ns] Test is running, debug_wb_pc = 0xbfc35cf4
[1232000 ns] Test is running, debug_wb_pc = 0xbfc361dc
[1242000 ns] Test is running, debug_wb_pc = 0xbfc366f8
[1252000 ns] Test is running, debug_wb_pc = 0xbfc36b98
----[1256455 ns] Number 8'd46 Functional Test Point PASS!!!
[1262000 ns] Test is running, debug_wb_pc = 0xbfc81bec
[1272000 ns] Test is running, debug_wb_pc = 0xbfc820d8
[1282000 ns] Test is running, debug_wb_pc = 0xbfc825c4
[1292000 ns] Test is running, debug_wb_pc = 0xbfc82ad0
[1302000 ns] Test is running, debug_wb_pc = 0xbfc82fd8
[1312000 ns] Test is running, debug_wb_pc = 0xbfc834c0
[1322000 ns] Test is running, debug_wb_pc = 0xbfc83984
----[1323235 ns] Number 8'd47 Functional Test Point PASS!!!
[1332000 ns] Test is running, debug_wb_pc = 0xbfc89108
--