首先推荐这篇,感谢这位大佬的系列博客,我仿真和综合很多都是参考这位的。(12条消息) 一、E906移植----项目介绍、开发环境与实验平台搭建_大功率灯泡的博客-CSDN博客
这里主要是记录一些啃代码过程中的心得,以一个代码水平约等于HDLbits的菜鸡的视角。以及github上官方给的那个钉钉群码已经进不去了,希望有群内大佬看到我,拉我或者怎么着,谢谢谢谢。
1.编译/仿真/综合/初步上板实验
项目文档有两个,用户手册和集成手册。其中用户手册主要是讲实现的功能、指令、寄存器等,看项目的结构、运行环境和仿真工具和端口名等则要查阅集成手册。
原项目分为cpu的rtl代码和构建仿真平台需要的soc组件这两部分。原文:
CPU 代码包:固定功能配置的 E906 RTL 代码;
Smart 平台包:提供了 E906 的参考集成设计、仿真环境和测试用例,帮助熟悉 E906 的功能和使用方 法,并辅助 E906 的集成工作。功能包括: 1)E906 的参考集成设计; 2)丰富的测试用例; 3)基础的软硬件仿真环境; 4)E906 RTL 代码 lint 流程及 waive 文件; 5)后端综合实现的参考 SDC 约束文件。
跑smart仿真就参考前面那位大佬的文章,自己debug也可以,主要是解决一个数据类型问题和环境变量问题就行,可能会报一些警告但是能跑出来。综合也是,需要一个顶层模块把soc.v包起来,再例化一个vivado自带的clk,加个简单测试模块(led闪烁之类的)先在fpga上跑一下,可以容易地实现。
smart_run/logical路径下是一些构成soc仿真平台的组件。
2.soc.v文件
图来自集成手册。
上一步已经实现了这个soc的综合仿真,看看它里面的东西。有一个模块叫cpu_sub_system_ahb.v,这个soc的cpu小系统中,系统总线是实现了部分功能的32位AHB-Lite。数据和指令总线也是,但三者实现的功能有所不同。其中系统总线可以挂载各种功能模块和外设,即图中的AHB BUS,数据总线和指令总线只能挂存储设备。在代码中,三条ahb-lite的端口信号命名格式不太一样,系统总线的就是形如biu_pad_haddr,数据和指令总线的信号中则分别含有dahbl和iahbl,可以区分开。此外,观察代码会发现,名为apb的模块只有一组信号冠以"s2"的名称,而名为apb_bridge的模块有九组冠以s1到s9名称的信号,因为apb是系统总线AHB-Lite的第二个从机(看系统总线代码可知),所以apb会收到系统总线发来的叫s2的控制信号或写数据,或者发回来自挂载在apb上的从机们的信号或读数据。而apb_bridge作为apb上唯一的主机,会发出给apb上九个从机的信号,也会收到来自它们的读数据。
这部分代码中,apb模块里只例化了外设模块,没有状态机,读写状态机是在转接桥的模块里实现的,我个人理解是因为它相当于apb上的主机所以决定了读写其他外设的时序。转接桥例化在apb模块里,但我不太理解为啥在soc.v里把apb而不是桥写作ahb的从机。
系统总线上挂载的模块在soc.v里面,数据和指令总线上的在cpu_sub_system_ahb.v里,挂载在apb就在apb.v里。
系统总线寻址空间和数据指令总线存储器空间(在ahb.v中,集成手册第二章也有)
//SYS MEM
`define S1_BASE_START 32'h60000000
`define S1_BASE_END 32'h600fffff
//APB
`define S2_BASE_START 32'h40000000
`define S2_BASE_END 32'h4fffffff
//IMEM
`define S4_BASE_START 32'h00000000
`define S4_BASE_END 32'h0007ffff
//DMEM
`define S5_BASE_START 32'h20000000
`define S5_BASE_END 32'h2007ffff
apb上各模块(在apb_bridge.v中,第一个原版没写,我看着应该是uart)
//uart
`define PS1_BASE_START 32'h40015000
`define PS1_BASE_END 32'h40015fff
// Timer
`define PS2_BASE_START 32'h40011000
`define PS2_BASE_END 32'h40011fff
// PMU
`define PS3_BASE_START 32'h40016000
`define PS3_BASE_END 32'h40016fff
//GPIO
`define PS4_BASE_START 32'h40019000
`define PS4_BASE_END 32'h40019fff
//STimer
`define PS5_BASE_START 32'h40018000
`define PS5_BASE_END 32'h40018fff
//CLKGEN
`define PS6_BASE_START 32'h40017000
`define PS6_BASE_END 32'h40017fff
//SMPU
`define PS7_BASE_START 32'h4001A000
`define PS7_BASE_END 32'h4001Afff
//NMI_WAKE
`define PS8_BASE_START 32'h40021000
`define PS8_BASE_END 32'h40021fff
//NEW TIMER
`define PS9_BASE_START 32'h40031000
`define PS9_BASE_END 32'h40031fff
地址总线绝大部分是32位(addr端口信号)。pad_cpu_sysmap_addrx(x为数字0-7)是20位的,cp0_dtu_addr是12位。pa_f_spsram定义ADDR_WIDTH为5.
tbc.