gpr 是 RISC-V 架构的通用寄存器文件,包含 32 个 32-bit 寄存器(x0 ~ x31)。提供两个组合读端口和一个时序写端口。
| 特性 |
说明 |
| 读端口 |
2 个,组合逻辑,零延迟 |
| 写端口 |
1 个,时序逻辑(posedge clk) |
| x0 硬连线 |
读 x0 始终返回 0,写 x0 被忽略 |
| 写转发 |
同一周期写入的值可在读端口上直接看到(组合转发) |
| 信号名 |
方向 |
位宽 |
描述 |
clk |
input |
1 |
时钟 |
rst_n |
input |
1 |
异步复位,低有效 |
rs1_addr |
input |
5 |
读端口 1 地址 |
rs1_data |
output |
32 |
读端口 1 数据(组合) |
rs2_addr |
input |
5 |
读端口 2 地址 |
rs2_data |
output |
32 |
读端口 2 数据(组合) |
wen |
input |
1 |
写使能,高有效 |
rd_addr |
input |
5 |
写目标地址 |
rd_data |
input |
32 |
写入数据 |
测试平台文件:tb/gpr_tb.v
+------------------+
| 时钟生成器 | 100MHz (period = 10ns)
+------------------+
| 激励发生器 | 驱动 wen / rd_addr / rd_data / rs1_addr / rs2_addr
+------------------+
| DUT (gpr) | 被测试的寄存器文件
+------------------+
| 自检逻辑 | $display("[PASS]/[FAIL] ...")
+------------------+
- 依次写入 x1 ~ x5 特定的值。
- 回读 rs1 和 rs2 验证写入值正确。
- 读取 rs1 = x0,验证读数据恒为 0。
- 尝试写入 x0,读回仍为 0。
- 在同一拍内,写入新值的同时用同一个地址做读操作。
- 验证读端口立即看到新写入的数据(组合转发)。
# 在 regs/ 目录下执行
make sim # 编译 + 运行
make verdi # 查看波形
make clean # 清理
| 检查项 |
预期结果 |
| 复位后读 |
所有寄存器 = 0 |
| 写入后回读 |
读数据 = 写入值 |
| x0 读取 |
始终 = 0 |
| x0 写入 |
不生效 |
| 同周期写转发 |
读端口立即看到新值 |