Lab4-3
在开始本实验之前,请备份 Lab4-1 与 Lab4-2 的所有工程,包括你使用的 IP Core。
你可以使用 git 保存之前的所有进度,并开新的分支来完成 Lab4-3。
在之前的实验中,我们完成了基本的指令,本节实验要在 Lab4-1 & Lab4-2 的基础之上拓展指令。
模块实现
在本节实验中,你需要实现以下指令:
- R-Type: add, sub, and, or, xor, slt, srl, sll, sra, sltu
- I-Type: addi, andi, ori, xori, slti, srli, slli, srai, slti, sltiu, lb, lh, lw, lbu, lhu, jalr
- S-Type: sb, sh, sw
- B-Type: beq, bne, blt, bge, bltu, bgeu
- J-Type: jal
- U-Type: lui, auipc
即 RISC-V 32I 中除了 ecall, ebreak
外的所有指令,黑体标出的指令为新添加的指令。在开始实验之前,请保证你理解了所有的指令含义与类型。
你可以在 venus 上使用以下代码来理解 sb, sh
的含义:
验收时,你需要提供自己绘制的 CPU 原理图,类似下图(下图仅为示意,并非本节实验的原理图)。建议在开始写代码之前绘制本图,梳理扩展指令时添加或修改的部件,明晰扩展指令的数据如何流动,控制信号应如何给。
你可以使用纸笔绘制(不推荐)但请保证验收时提供一张线条清晰较少涂改的原理图,也可以使用 Microsoft 的 Visio 或 PowerPoint、在线平台如 ProcessOn、 drawio 或平板软件绘制。
波形仿真
请修改上一节提供的 testbench,使之能够对指令扩展后的 SCPU 进行仿真验证。你可能需要将之前的 wea
信号从 1 位扩展为 4 位 /3 位 以支持扩展指令中的 unsigned, byte, half-word
的要求。
同时,你需要自行编写一段简单的代码对所有指令进行测试。
下板验证
验收代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
|
memory_initialization_radix=16;
memory_initialization_vector=
00040D17, 00080D97, 003DDD93, 003D9D93, 401DDD93, 0FAD9C63,
40000D37, 80000DB7, 401DDD93, 0FAD8463, 02200C13, 038000A3,
02000C13, 03800123, 42100C13, 038012A3, FFF00093, 01800C03,
0D809263, 01804C03, 0B80DE63, 06001C03, 0B804A63, 06005C03,
0A0C4663, 0010C193, 003181B3, 003181B3, 003181B3, 003181B3,
003181B3, 0011CA33, 003181B3, 003181B3, 003181B3, 003181B3,
003181B3, 003181B3, 003181B3, 003181B3, 003181B3, 003181B3,
003181B3, 003181B3, 003181B3, 003181B3, 003181B3, 003181B3,
003181B3, 003181B3, 003181B3, 003181B3, 00318333, 006301B3,
00318233, 004206B3, 80000437, 00106D13, 0FFD7D13, 41A45F33,
01A45DB3, 00004C63, 000D4A63, 00804863, 01A05663, 00045463,
03ED9263, 00000033, 00000033, 00000033, 00000033, 00000033,
00000033, 00000033, FE5FF06F, 0000A133, 0000BCB3, 0000BE93,
0000A113, 00210733, 00E70733, 40E709B3, 0019D993, FFF98513,
00056533, 00A50533, 0061A223, 0001A283, 00229293, 0051A023,
002484B3, 00922023, 01402683, 0001A283, 005282B3, 005282B3,
0051A023, 0001A283, 0082F5B3, 002686B3, 06068263, 0001A283,
00E70933, 01290B33, 01690933, 0122F5B3, 00058C63, 03258663,
00E70933, 03258A63, 00922023, FA406CE3, 00150463, 00027663,
FFF00513, 00A50533, 00A22023, FA1FF06F, 0608A483, 00922023,
15000F93, 024F8067, 0208A483, 00922023, F80242E3, 01402683,
00A50533, 00E888B3, 0148F8B3, 002484B3, 00148463, 00005663,
00E004B3, 002484B3, 0001A283, 005285B3, 00159593, 00B1A023,
0061A223, F64054E3;
memory_initialization_radix=16;
memory_initialization_vector=
f0000000, 000002AB, 80000000, 0000003F, 00000001, FFF70000, 0000FFFF, 80000000, 00000000, 11111111,
22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, aaaaaaaa, bbbbbbbb,
cccccccc, dddddddd, eeeeeeee, ffffffff, 557EF7E0, D7BDFBD9, D7DBFDB9, DFCFFCFB, DFCFBFFF, F7F3DFFF,
FFFFDF3D, FFFF9DB9, FFFFBCFB, DFCFFCFB, DFCFBFFF, D7DB9FFF, D7DBFDB9, D7BDFBD9, FFFF07E0, 007E0FFF,
03bdf020, 03def820, 08002300;
使用验收代码的预期表现与上一节基本相同,唯一变化是显示学号时,前两位 (32) 的显示将被改变。