- 现在只有一份源文件,就在 pipelined-cpu/ 下:
srcs/rtl(13 个处理器 RTL)、srcs/board、srcs/constrs、srcs/tb、srcs/rom、
tools/(rv_asm.py、hex2vh.py、run_regress.ps1)、programs/(汇编源码与期望值)。
仓库根目录的 rtl/、board/、testbench/、tools/ 已删除(删除前逐个文件比对过 MD5,
与工程目录里的副本完全一致),说明文档仍放在最外层
cpu21_riscv_redirect_int_bpb说明.md。
- .gitignore 改为:忽略 pipelined-cpu/ 下的工程生成物(*.xpr、*.runs、*.sim、*.cache…),
只跟踪 srcs/、tools/、programs/、create_project.tcl;_tmp/、_vivado/ 等本地临时目录
继续忽略。
- 新增 tools/run_regress.ps1:一键回归脚本。编译 srcs/rtl/ → 跑 muldiv/isa/lui/mmio
四个指令测试并与 programs/*.expected 逐值比对 → 跑两个流水基线 → 跑板级顶层
(-d BOARD_ROM_FAST)检查跑马灯,最后汇总 PASS/FAIL 并返回失败数作为退出码。
编译与仿真的中间文件写在 %TEMP%\cpu21_regress,不污染工程目录。实测全部通过。
- 新增 programs/board_demo_fast.asm:快速版演示程序(延时初值 64,约 2.6 µs/步),
对应 srcs/board/cpu21_board_rom_fast.vh;仿真时用 -d BOARD_ROM_FAST 才会选到它。
- 两个测试平台增加 srcs/rom 探测路径,工程目录内直接 Run Simulation 即可加载镜像。
- 文档:目录结构一节按新布局重写;新增“回归测试”一节(脚本用法 + 期望基线数字);
上板章节的生成/仿真命令改为相对工程目录(python tools/rv_asm.py programs/…、
xvlog -d BOARD_ROM_FAST srcs/rtl/*.v …);tools 里的用法示例同步更新;
“工程分享”一节去掉已不存在的副本同步说明。
- 清理:删除本地 _tmp/(约 57 MB)、_vivado/、.Xil/ 临时目录。
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
||
"""把 $readmemh 格式的 hex 文件转换成 Verilog include 文件,供综合时初始化 ROM。
|
||
|
||
用法: python tools/hex2vh.py <input.hex> <output.vh> [ROM_WORDS]
|
||
|
||
输出内容形如(每行一条赋值,未用到的地址填 NOP 0x00000013):
|
||
|
||
rom[0] = 32'h00001037;
|
||
rom[1] = 32'h00100093;
|
||
|
||
配套 RTL 用法(见 srcs/board/cpu21_board_top.v,两者同目录,所以 include 能直接解析):
|
||
|
||
initial begin
|
||
for (i = 0; i < ROM_WORDS; i = i + 1) rom[i] = 32'h0000_0013; // NOP 填充
|
||
`include "cpu21_board_rom.vh"
|
||
end
|
||
|
||
这样 ROM 内容直接跟着 RTL 走,不依赖综合时的当前工作目录,
|
||
避免了 $readmemh 相对路径在 Vivado 综合流程里找不到文件(且只报 warning)的坑。
|
||
"""
|
||
|
||
import sys
|
||
|
||
NOP = 0x00000013
|
||
|
||
|
||
def main():
|
||
src, dst = sys.argv[1], sys.argv[2]
|
||
words_total = int(sys.argv[3]) if len(sys.argv) > 3 else 1024
|
||
|
||
words = []
|
||
with open(src, encoding="ascii") as f:
|
||
for line in f:
|
||
line = line.split("//")[0].strip()
|
||
if not line:
|
||
continue
|
||
words.append(int(line, 16))
|
||
|
||
if len(words) > words_total:
|
||
raise SystemExit(
|
||
"程序 %d 个字,超过 ROM 容量 %d 个字" % (len(words), words_total)
|
||
)
|
||
|
||
with open(dst, "w", encoding="utf-8") as f:
|
||
f.write(" // generated by tools/hex2vh.py - do not edit by hand\n")
|
||
f.write(
|
||
" // source: %s (%d words, remaining entries filled with NOP)\n"
|
||
% (src, len(words))
|
||
)
|
||
for addr in range(words_total):
|
||
w = words[addr] if addr < len(words) else NOP
|
||
f.write(" rom[%d] = 32'h%08X;\n" % (addr, w))
|
||
|
||
print("已生成 %s(%d 个字,源程序 %d 个字)" % (dst, words_total, len(words)))
|
||
|
||
|
||
main()
|