Skip to content

从软工平台导出的issues

Tang Shizhi edited this page Apr 1, 2018 · 1 revision

(仅包含标题、日期、正文,不包含回复)

编写最小CPU的测试框架 2017/10/12 14:12

需求:

  1. 编译.s文件,实现虚拟的指令存储器提供二进制指令
  2. 例化最小cpu并执行
  3. 提供在每条指令后assert寄存器状态的机制

实现逻辑和位移运算 2017/10/12 14:15

Latex模板 2017/10/13 11:51

需求报告初版 2017/10/13 11:51

Enabling VHDL 2008 2017/10/14 11:15

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

Push Forward 2017/10/17 13:20

Assert in test framework 2017/10/17 13:21

Combinational Logic 2017/10/17 13:21

整理测试框架的文件结构 2017/10/18 13:04

Hi Lo register 2017/10/19 1:13

实现hi lo寄存器,并完成新的数据前推

完成算数运算 2017/10/22 11:25

完成加载存储指令 2017/10/22 12:52

对应书本第9章

完成转移指令 2017/10/22 12:57

对应书本第8章

修复了一个关于SRLV的bug 2017/10/23 10:56

这会使logic3测试无法通过

已在 36961fc 修复。若需要在我merge到master之前获得补丁,请merge loadstore分支。

我会在分支合并后关闭本issue。

补做了LUI指令 2017/10/23 13:44

已在 5ff83f5 修复。若需要在我merge到master之前获得补丁,请merge loadstore分支

我会在分支合并后关闭本issue。

Jump Instructions 2017/10/25 15:05

CP0 co-processor 2017/10/28 9:59

The corresponding content to chap.10

Add test cases for jump instructions. 2017/10/28 13:31

综合测例 2017/10/28 13:38

现在可以将助教给出的测例作为集成测试使用了。你需要做一些修改,用现在的测试框架仿真(要可以assert)。你也可以补充自己的测例。

注:刘熙航表示master有未修复的bug,开工前与他联系。

编写串口相关逻辑 2017/10/28 13:40

异常相关指令(书本第11章) 2017/10/28 13:40

处理取址和访存冲突的模块 2017/11/4 3:29

cpu模块中的timerInt_o没有和cp0连起来 2017/11/6 10:15

我会在memctrl分支修复,与 #22 一起push。

MMU模块 2017/11/6 13:25

更正起始地址和异常入口地址 2017/11/8 16:16

现在的起始地址和异常入口地址是错的,参见MIPS标准Vol 3 5.2.1

ID模块需要判断为零的段 2017/11/9 3:07

如果应该为零的段不为零,要抛出无效指令异常

等MMU分支merge了再改,因为MMU需要改ID

对CP0进行操作的时候应该确认当前处于内核态 2017/11/9 3:46

CP0 config寄存器的BE域现在设错了 2017/11/9 6:58

BE域表示字节序,应为小端(0),将在合并MMU分支时修复

访存指令之后的第二条指令是跳转指令时,跳转不执行 2017/11/9 8:21

应该是加入memctrl后,在访存时暂停流水线造成的影响

flash读取模块 2017/11/10 2:35

阅读flash文档并实现flash的读操作

convert.c中存在着tab和空格混用的情况 2017/11/10 16:08

请更正并检查.editorconfig

注意事项:仿真没有弹出Assertion Failed不一定是通过了 2017/11/11 15:11

仿真结束时,请注意检查你需要仿真的时长是不是真的被全部仿真完毕了。下面的情况可能导致仿真提前结束:

如果两个组合逻辑互相依赖造成类似软件中“死循环”的现象,会有以下错误

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中打印,不会弹出错误信息。不注意的话会以为仿真通过了。

把功能测例移植到硬件上进行测试 2017/11/19 14:03

并通过

处理无效指令异常 2017/11/19 14:08

解决无效指令的异常问题,可以给调试带来方便

重点是指令中必须为零的段在不为零时也算作无效指令

处理访存异常 2017/11/19 14:11

解决访存异常之后,可以跑更多的测例,尤其是针对延迟槽发生异常的测例(这里面涵盖了各种异常,包括访存)

目前已知的访存异常是地址未对齐异常,先解决这个异常,然后去跑针对访存异常的测例。如果还跑不通,再研究一下是不是还涉及到了其他的访存异常。

阅读boot相关代码,并对现有的架构进行微调 2017/11/19 14:14

搞清楚boot的时候处理器与外设的交互流程,以便对外设(主要是flash)的控制模块进行相应的调整,或对OS代码进行调整

调整架构:

1、将cpu、memctrl、mmu封装进一个模块 2、写一个控制模块,作为上述模块与外设的桥梁;主要功能是根据mmu映射出来的地址,将数据发往不同的外设,并且接收外部中断 3、调整flash接口,将其连接到上述模块

RAM控制模块 2017/11/19 14:17

重点是处理write的数据需要一定的保持时间的问题

最好能上板子简单测试一下,再去尝试功能测试,防止踩坑

注意SRAM型号是IS61WV102416BLL,不要被文档的文件名迷惑了 2017/11/21 9:17

监控程序的编译方法 2017/11/23 3:31

  • 监控程序需要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 * (指令不需要实现)

需要确定μCore使用的flash、串口地址具体是什么 2017/11/23 11:02

我们手头的资料不一致

编写针对MMU的功能测例 2017/11/23 15:04

目前已有的功能测例仅用于验证指令的执行是否正确,因此,需要用专门的测例来验证MMU的正确性。

跑通监控程序 2017/11/26 13:12

这个跑通跑μCore就指日可待了

usb_ctrl模块存在写输入信号的问题 2017/12/1 11:23

这样可能比较危险,希望尽快弄清楚

硬件层面用ip核存字符点阵,并尝试在软件层面输出字符 2017/12/2 3:25

以便后续控制台程序的实现

跑通ucore 2017/12/4 11:02

如题,希望可以在周四之前完成。

回归测试:修复被破坏的sim文件夹下的早期单元测试 2017/12/7 9:00

以太网模块初步 2017/12/10 12:06

  1. 硬件层面完成以太网控制模块
  2. 软件层面进行初步试验

BUG:发生TLB异常的时候只记下了访存地址,没记录取指地址 2017/12/11 11:33

时钟中断的COUNT寄存器加满了之后应该持续发出时钟中断,直到软件处理 2017/12/11 15:12

通过mtc0置Compare寄存器时,Count应被清零 2017/12/11 16:10

如果刚从某个异常返回就触发中断,EPC不会被正确设置 2017/12/12 11:09

如果刚刚完成eret,此时还没有任何一条指令到达访存阶段,如果此时发生了中断,EPC就记录不到正确的返回地址。

实现额外的访存指令 2017/12/16 1:13

实现下述指令:

  • lh
  • lhu
  • lwl
  • lwr
  • sh

延迟槽被暂停时跳转目标会为0 2017/12/21 11:03

考虑如下情形:

lw
jalr
nop

其中jalrlw数据相关。此例中,首先暂停ID,然后暂停IF。

本来,为了使IF暂停之后还能继续执行跳转,pc_reg中有lastBranchTargetAddress。但由于此例中ID也被暂停了一次,在ID被执行的两个周期中的前一个时,ID输出的branchTargetAddress_o是无效的,但却被pc_reglastBranchTargetAddress记了下来,导致错误(lastBranchTargetAddress只能记录branchFlag第一次为1时的branchTargetAddress_o,不然会有别的问题)。解决方案是让ID的branchFlag只在branchTargetAddress_o有效时才置。

用sub减去0x80000000时判断溢出有错误 2017/12/21 14:13

不能将减数转成补码再当加法做,因为0x80000000的补码是其本身

时钟中断发出时COUNT寄存器不应暂停计数 2017/12/22 9:30

MIPS标准说COUNT和COMPARE相等时应该发出中断,如果此时中断被禁用了则暂不处理,要等中断启用时立即处理中断。置COMPARE时清除此中断。

之前我们处理这个问题的方法是:当COUNT和COMPARE相等时暂停COUNT的计数,直到中断被启用。但是u-boot永远禁用中断,却需要使用COUNT测量时间,上述处理方法会导致u-boot的udelay永远等待不到时间到来,陷入死循环。

完善的处理方式是:让COUNT持续计数,并新增一个寄存器保存“当前正在发出时钟中断”,置COMPARE时不只将COUNT清零,也将此寄存器复位。不过,为了方便起见,我觉得可以直接将时钟中断的触发条件由“COUNT=COMPARE”改为“COUNT≥COMPARE”。虽然当COUNT数到头发生循环时,会导致原来要发生的中断失效,但32位的COUNT足够数一分多钟,我觉得这不是问题。你们觉得这样写行不行?

让u-boot支持HDMI输出 2017/12/27 16:18

两种候选方案:

  • 直接hack串口逻辑;
  • 按u-boot的video接口规范写。
Clone this wiki locally