寄存器堆实验

实验目的

  1. 理解寄存器堆的电路结构。

  2. 掌握寄存器堆的功能特性。

实验原理

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. 三端口寄存器堆的框图

在RISC指令系统中,通常要求R0恒为0。为了实现这一要求,用常数“0”代替R0寄存器作为四选一多路选择器0通道的输入,图 1中R0寄存器的虚线表示其实际并不存在。

实验任务

  1. 理解图 1结构,设计该寄存器堆。

    具体要求如下。

    1. 采用层次化设计,将译码器实验完成的2-4译码器作为子电路。

      如果写端口地址WA使用一个2位的输入组件,需要用分线器组件(见几个有用的组件)将2位的WA拆分为两个1位的导线,再连接到译码器的A1、A0。

    2. 寄存器字长(数据位宽)为4位。

      四个寄存器使用曾在触发器和寄存器实验学习过的寄存器组件,可从菜单“Components/组件 ➤ Memory/存储器 ➤ Register/寄存器”找到该组件,将数据位数设置为4。

    3. Clk输入使用时钟输入组件

      Clk时钟输入组件及其用法见第一章Digital仿真软件使用指南的“时序电路仿真”。

    4. R0寄存器读出值恒为0。

      常数“0”可以用“常量”组件产生(见第一章Digital仿真软件使用指南的“几个有用的组件”),位数与寄存器的字长相同,即4位。

      虽然Digital仿真软件中有一个现成的寄存器堆组件(位于“Components/组件 ➤ Memory/存储器 ➤ RAM ➤ Register File”),但是它的R0寄存器是可写入的,不具备恒为零的特性。

  2. 通过仿真验证寄存器堆的功能,并保存仿真过程数据文件。

    可以手动操作进行仿真,也可以编写测试用例(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”。这是因为显示值为一个时钟周期结束后的值。
  3. 实验结果分析

    对仿真过程数据进行分析,从中体现对图 1电路原理的理解。