Files
risc-v-cpu/testbench/programs/mmio_test.asm
T
Anccend 192e28795a 实现 MMIO,LED 显示从 ecall 改为内存映射存储
cpu21_mmio.v(新增)
- 在 MEM 级做地址译码,把外设寄存器映射进数据地址空间;目前实现 LED 数据
  寄存器(地址由顶层 parameter LED_ADDR 指定,默认 0x0000_1000,位于 4 KB
  数据 RAM 之外,不会与 RAM 冲突);
- 地址译码按“字”对齐:同一 32 位寄存器内任意字节偏移都算命中,具体修改
  哪几个字节由 wstrb 决定,因此 sw 写全字、sb 只写单字节(与 RAM 字节写
  语义一致);
- 读命中时由顶层用 rdata_o 取代 data_rdata_i,从而支持把 LED 值读回;
- led_valid_o 在写入后拉高一拍,作为“本周期有 LED 写入”的指示。

cpu21_riscv_redirect_int_bpb.v
- 顶层参数新增 LED_ADDR;例化 cpu21_mmio 并新增访存读数据选择
  mem_rdata = mmio_rdata_hit ? mmio_rdata : data_rdata_i(MEM/WB 捕获用它);
- 删除 ecall 驱动的 LED 逻辑(原 ex_led_event 与 led_data_q/led_valid_q 寄存器
  移入 MMIO 模块),LED 输出端口改由 cpu21_mmio 驱动;
- ecall 保留停机语义:a7==34 的历史“显示”调用保留为无操作,其余(如 a7=10)
  仍置 halted_o。

测试资产
- tools/rv_asm.py:print 伪指令改为“lui t6,LED_ADDR>>12 + sw a0,0(t6)”(写 MMIO
  LED 寄存器,仍需两个字);新增 sb 支持;文末说明同步更新;
- testbench/programs/mmio_test.asm + mmio_test.expected(新增):覆盖全字写、
  读回、字节写三种情况;
- isa_test.asm / lui_test.asm 迁移到 MMIO 输出方式;
- 两个 testbench 的 RAM 模型处注明 MMIO 区域不属于 RAM。

验证(xsim,按提交后的正式路径生成 hex)
- mmio_test:4 项输出全部匹配(12345678 / 12345678 / ffffffff / ffff7fff,
  最后一项为 sb 覆盖 led[15:8] 后读回);
- isa_test:24 项输出与 isa_test.expected 逐项一致;lui_test:4 项输出正确;
- 中断测试程序回归:IRQ1@cyc85、IRQ2@cyc266、IRQ3@cyc447 与改动前一致,
  FINAL 统计完全一致(stalls=11 bubbles=297 cond_taken=648 pred_ok=663
  pred_fail=102,6003 周期);
- benchmark 长仿真回归:FINAL 统计与改动前完全一致(stalls=3195 bubbles=6955
  cond_taken=8857 pred_ok=9455 pred_fail=1050,60000 周期),且 LED 输出次数为 0,
  确认 ecall 已不再驱动 LED;
- cpu21_mmio.v 已加入 Vivado 工程 sources_1。
2026-09-13 16:30:57 +08:00

25 lines
1.0 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MMIO 验证程序:写 LED 寄存器(0x0000_1000)-> 读回 -> 字节写 -> 再读回。
# 期望 LED 输出顺序(共 4 次,见同目录 mmio_test.expected):
# ① 12345678 sw 0x12345678
# ② 12345678 lw 读回后再 print
# ③ ffffffff sw 0xffffffff
# ④ ffff7fff sb 0x7f 覆盖 led[15:8] 后读回
# 用法:python tools/rv_asm.py testbench/programs/mmio_test.asm <仿真工作目录>/risc-v-benchmark_ccab.hex
lui t0, 0x1 # t0 = LED_ADDR = 0x00001000
lui t1, 0x12345
addi t1, t1, 0x678 # t1 = 0x12345678
sw t1, 0(t0) # ① MMIO 写 LED
lw a0, 0(t0) # MMIO 读回
print # ② 应为 12345678
addi t2, zero, -1 # t2 = 0xffffffff
sw t2, 0(t0) # ③ 应为 ffffffff
addi t3, zero, 0x7f
sb t3, 1(t0) # 字节写:led[15:8] = 0x7f
lw a0, 0(t0) # 读回
print # ④ 应为 ffff7fff
halt