寄存器堆实验
实验原理
CPU内部包含若干个通用寄存器,用于暂存参加运算的数据和中间结果,这些寄存器的集合就称为通用寄存器组(Genral Register Set)。 寄存器组可以设计为单端口、双端口或三端口。单端口是指读出和写入共用同一组地址或数据端口,所以读出和写入不能同时进行,通常应用于多周期的数据通路。而双端口的读、写端口各自独立,在一个周期中可以同时读出和写入。三端口则有两个读端口和一个写端口可以同时操作,通常应用于单周期和流水线数据通路。和早期的处理器相比,现代处理器的通用寄存器的数量更多,一般称为寄存器堆(Register File),也有译为寄存器文件。本实验完成三端口寄存器堆。
图 1是具有2个读端口和1个写端口的三端口寄存器堆的电路结构。其中RA表示读端口地址(Read Address),RD表示读端口数据(Read Data);WA表示写端口地址(Write Address),WD表示写端口数据(Write Data);WE是写使能(Write Enable)。

实验任务
-
理解图 1结构,设计该寄存器堆。
具体要求如下。
-
采用层次化设计,将译码器实验完成的2-4译码器作为子电路。
如果写端口地址WA使用一个2位的输入组件,需要用分线器组件(见几个有用的组件)将2位的WA拆分为两个1位的导线,再连接到译码器的A1、A0。
-
寄存器字长(数据位宽)为4位。
四个寄存器使用曾在触发器和寄存器实验学习过的寄存器组件,可从菜单“Components/组件 ➤ Memory/存储器 ➤ Register/寄存器”找到该组件,将数据位数设置为4。
-
Clk输入使用时钟输入组件
Clk时钟输入组件及其用法见第一章Digital仿真软件使用指南的“时序电路仿真”。
-
R0寄存器读出值恒为0。
常数“0”可以用“常量”组件产生(见第一章Digital仿真软件使用指南的“几个有用的组件”),位数与寄存器的字长相同,即4位。
虽然Digital仿真软件中有一个现成的寄存器堆组件(位于“Components/组件 ➤ Memory/存储器 ➤ RAM ➤ Register File”),但是它的R0寄存器是可写入的,不具备恒为零的特性。
-
-
通过仿真验证寄存器堆的功能,并保存仿真过程数据文件。
可以手动操作进行仿真,也可以编写测试用例(test case)对电路进行测试。 例 1给出了寄存器堆测试数据的一个例子,它试图向R0寄存器写入数据“5”,用来验证R0寄存器的值是否恒为零。
例 1. 验证R0是否恒为零的测试数据WE WA WD RA1 RA2 Clk RD1 RD2 1 0 0x5 0 0 C 0 0
例 1中字母“C”表示Clk变化一个周期。在Clk变化之前,首先施加其他激励数据;时钟周期执行后,再将输出与预期响应比较。 如果R0恒为零,RD1和RD2输出应为0;如果WD上的数据5被写入了R0,则RD1和RD2会输出5,表明R0不具备恒为0的特性。
在测试结果数据中,Clk的值始终为0,而不是字母“C”。这是因为显示值为一个时钟周期结束后的值。 -
实验结果分析
对仿真过程数据进行分析,从中体现对图 1电路原理的理解。