-
Notifications
You must be signed in to change notification settings - Fork 0
从软工平台导出的issues
(仅包含标题、日期、正文,不包含回复)
需求:
- 编译.s文件,实现虚拟的指令存储器提供二进制指令
- 例化最小cpu并执行
- 提供在每条指令后assert寄存器状态的机制
VHDL 2008 有许多很有用的特性,见此链接,不输Verilog。
Vivado 2017.2本应默认启用VHDL 2008,但可能由于上游bug,需要按以下方式手动启用:
在Vivado的TCL console输入(中括号里的不是注释,也要输):
set_property enable_vhdl_2008 1 [current_project]
set_property FILE_TYPE {VHDL 2008} [get_files *.vhd]
来源:这个论坛的5楼
我不确定添加新文件之后第二句要不要重输。
@2015011281 @2015011507
实现hi lo寄存器,并完成新的数据前推
对应书本第9章
对应书本第8章
这会使logic3测试无法通过
已在 36961fc 修复。若需要在我merge到master之前获得补丁,请merge loadstore分支。
我会在分支合并后关闭本issue。
已在 5ff83f5 修复。若需要在我merge到master之前获得补丁,请merge loadstore分支
我会在分支合并后关闭本issue。
The corresponding content to chap.10
现在可以将助教给出的测例作为集成测试使用了。你需要做一些修改,用现在的测试框架仿真(要可以assert)。你也可以补充自己的测例。
注:刘熙航表示master有未修复的bug,开工前与他联系。
我会在memctrl分支修复,与 #22 一起push。
现在的起始地址和异常入口地址是错的,参见MIPS标准Vol 3 5.2.1
如果应该为零的段不为零,要抛出无效指令异常
等MMU分支merge了再改,因为MMU需要改ID
BE域表示字节序,应为小端(0),将在合并MMU分支时修复
应该是加入memctrl后,在访存时暂停流水线造成的影响
阅读flash文档并实现flash的读操作
请更正并检查.editorconfig
仿真结束时,请注意检查你需要仿真的时长是不是真的被全部仿真完毕了。下面的情况可能导致仿真提前结束:
如果两个组合逻辑互相依赖造成类似软件中“死循环”的现象,会有以下错误
FATAL_ERROR: Iteration limit 10000 is reached. Possible zero delay oscillation detected where simulation time can not advance. Please check your source code. Note that the iteration limit can be changed using switch -maxdeltaid.
但此错误只会在log中打印,不会弹出错误信息。不注意的话会以为仿真通过了。
并通过
解决无效指令的异常问题,可以给调试带来方便
重点是指令中必须为零的段在不为零时也算作无效指令
解决访存异常之后,可以跑更多的测例,尤其是针对延迟槽发生异常的测例(这里面涵盖了各种异常,包括访存)
目前已知的访存异常是地址未对齐异常,先解决这个异常,然后去跑针对访存异常的测例。如果还跑不通,再研究一下是不是还涉及到了其他的访存异常。
搞清楚boot的时候处理器与外设的交互流程,以便对外设(主要是flash)的控制模块进行相应的调整,或对OS代码进行调整
调整架构:
1、将cpu、memctrl、mmu封装进一个模块 2、写一个控制模块,作为上述模块与外设的桥梁;主要功能是根据mmu映射出来的地址,将数据发往不同的外设,并且接收外部中断 3、调整flash接口,将其连接到上述模块
重点是处理write的数据需要一定的保持时间的问题
最好能上板子简单测试一下,再去尝试功能测试,防止踩坑
- 监控程序需要
mips-sde-elf
交叉编译器,与我们使用的mipsel-linux-gnu
不同。不能直接将Makefile中的mips-sde-elf
改为mipsel-linux-gnu
,因为这会导致编译错误,并且除了Makefile,Term中也调用了交叉编译器。可以在[这里](https://sourcery.mentor.com/GNUToolchain/package12725/public/mips-sde-elf/mips-2014.05-24-mips-sde-elf- 目前(2017/11/23 13:30)未能通过的测例列表 2017/11/23 5:38 "简单来说,目前需要解决66、80~85
注* 由于80之后的测例需要进行目前未完成的改动,所以可能并不需要解决。
以2017/11/23 12:20(注:所有时间均为UTC+8)的branch fix63为准,其改动为:在2017/11/22 17:47分的master上添加了ADEL和ADES相关模块。
n11_div(指令不需要实现)
n12_divu (指令不需要实现)
n35_bltzal (指令不需要实现)
n36_bgezal (指令不需要实现)
n45_break (指令不需要实现)
n49_lh (指令不需要实现)
n50_lhu (指令不需要实现)
n53_sh (指令不需要实现)
n66_eret_ex *
n74_bltzal_ds * (指令不需要实现)
n75_bgezal_ds * (指令不需要实现)
n80_beq_ex_ds *
n81_bne_ex_ds *
n82_bgez_ex_ds *
n83_bgtz_ex_ds *
n84_blez_ex_ds *
n85_bltz_ex_ds *
n86_bltzal_ex_ds * (指令不需要实现)
n87_bgezal_ex_ds * (指令不需要实现)
我们手头的资料不一致
目前已有的功能测例仅用于验证指令的执行是否正确,因此,需要用专门的测例来验证MMU的正确性。
这个跑通跑μCore就指日可待了
这样可能比较危险,希望尽快弄清楚
以便后续控制台程序的实现
如题,希望可以在周四之前完成。
- 硬件层面完成以太网控制模块
- 软件层面进行初步试验
如果刚刚完成eret
,此时还没有任何一条指令到达访存阶段,如果此时发生了中断,EPC就记录不到正确的返回地址。
实现下述指令:
- lh
- lhu
- lwl
- lwr
- sh
考虑如下情形:
lw
jalr
nop
其中jalr
和lw
数据相关。此例中,首先暂停ID,然后暂停IF。
本来,为了使IF暂停之后还能继续执行跳转,pc_reg
中有lastBranchTargetAddress
。但由于此例中ID也被暂停了一次,在ID被执行的两个周期中的前一个时,ID输出的branchTargetAddress_o
是无效的,但却被pc_reg
的lastBranchTargetAddress
记了下来,导致错误(lastBranchTargetAddress
只能记录branchFlag
第一次为1时的branchTargetAddress_o
,不然会有别的问题)。解决方案是让ID的branchFlag
只在branchTargetAddress_o
有效时才置。
不能将减数转成补码再当加法做,因为0x80000000的补码是其本身
MIPS标准说COUNT和COMPARE相等时应该发出中断,如果此时中断被禁用了则暂不处理,要等中断启用时立即处理中断。置COMPARE时清除此中断。
之前我们处理这个问题的方法是:当COUNT和COMPARE相等时暂停COUNT的计数,直到中断被启用。但是u-boot永远禁用中断,却需要使用COUNT测量时间,上述处理方法会导致u-boot的udelay
永远等待不到时间到来,陷入死循环。
完善的处理方式是:让COUNT持续计数,并新增一个寄存器保存“当前正在发出时钟中断”,置COMPARE时不只将COUNT清零,也将此寄存器复位。不过,为了方便起见,我觉得可以直接将时钟中断的触发条件由“COUNT=COMPARE”改为“COUNT≥COMPARE”。虽然当COUNT数到头发生循环时,会导致原来要发生的中断失效,但32位的COUNT足够数一分多钟,我觉得这不是问题。你们觉得这样写行不行?
两种候选方案:
- 直接hack串口逻辑;
- 按u-boot的video接口规范写。