【P7&Loongson】支持部分中断/异常处理
概况
常规单发射5级流水线cpu。新增支持指令{mtc0, mfc0, eret, syscall, break, bgezal, bltzal};新增异常处理{Int, AdEL, AdES, Ov, RI},其中Int中断包括软件、硬件、计时器中断(硬件中断未测);新增CP0寄存器{BadVAddr, Count, Compare, Status, Cause, EPC, PrID}。通过Loongson.SRAM功能测试。
(新增设计均为能暂停便暂停,无cache、tlb)

Thinking_Log
1.为何将 取指/访存 地址错误一并归到AdEL异常中?
如此写BadVAddr寄存器的操作又复杂了些
2.为何不约定eret存在延迟槽?
如此eret的相关硬件处理又复杂了些
Bug_Log
1.检测到异常后,未能完全将受害指令之后的指令影响消除
受害指令前后指令“假冲突”产生的阻塞
Stall与Req同时存在时,忽略了增添Req对F_pc写使能的影响,导致Stall单方面使F_pc不可写,F_pc未更新,异常跳转NPC失效。
例: 某时刻 D-E-M : mfhi-syscall-divu;下一周期stall和req同时存在

下方红圈处F_pc值未更新
解决: 顶层Req信号优先级最高,修正IFU的写使能We
错误开始的乘除槽
例: 某时刻 D-E-M : bnez-divu-syscall;req存在,div进入乘除槽HILO开始运算
解决: M级必定能检测出是否发生异常,只有在E级的乘除槽脱离管控;所以异常发生时,受害指令后的指令最多刚刚到乘除槽,所以只需要用Req信号限制乘除槽的运作即可
always @(posedge Clk) begin
if(Rst == 1) begin
HI <= 0;
LO <= 0;
Wait <= 0;
Busy <= 0;
end else if(Req != 1) begin //Req limitation
if(Wait == 0) begin
case(HILOOp)
...
end
2.放走W级指令不意味着W级不需要Req清空
事实上,放走W级指令是只GRF处可以仍写。5级流水各级含义时间长了容易混淆;寄存器是组合信号的源头;顶层信号的来历要清楚(全是组合逻辑,有些搭配了fsm)
3.端口/信号的隐藏意义改变
最初的DMWr是区分Store和Load类指令的必要条件,因而最初设计用DMWr区分AdES和AdEL。
但后续设计令Req==1时强制将传入BE.DMWr端口的信号改0,导致BE.DMWr无法区分L/S指令,但自己仍认为DMWr信号具有相关功能,所以错判异常。

此BE.DMWr非最初的CU.DMWr,而是CU.DMWr & ~Req
随着不断增加设计,传入信号的意义可能和最初端口命名的意义有所脱节,从而导致错误。要时刻熟悉设计的部件,同时端口/信号命名仍需完善!
类似问题:顶层寄存器控制信号Stall传入各流水级时,使用了端口名Reg_Rst,导致各级内Reg_Rst端口信号含义不清,需改进!
4.eret指令不存在延迟槽
看了测试程序给的异常处理程序断eret后跟了nop,想当然当作延迟槽了。
结果之后有一段程序,利用eret返回错误epc导致AdEL异常,同时eret后紧跟sw,提前修改了data_sram导致错误。
解决:将错就错,对eret增加清空延迟槽操作。
5.顶层寄存器控制信号冲突的担忧
需弄清各信号产生的逻辑和关联:①产生逻辑;②信号优先级
- Stall
- Req
- linger
- LoadDelay
- Clr
6.由于读BRAM IP核在下一拍返回值,因而将D_instr改为的组合逻辑,不在寄存器中
D级指令的一些操作时,要记得这点
7.寄存器信号的可读写性
CP0各寄存器各个位的可读写性不尽相同。
重申了本质问题:寄存器的读/写/复位
【P7&Loongson】支持部分中断/异常处理的更多相关文章
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...
- Linux设备驱动之中断支持及中断分层
快速中断:在开启快速中断时,其他中断不会打断快速中断. 多个中断共享一个中断号. 中断行为受到限制: 1.不能使用可能引起阻塞的函数 2.不能使用可能引起调度的函数 中断注册:request_irq( ...
- redis主从中断异常处理
线上预警主从中断: 查看线上复制信息: # Replication role:slave master_host:master_host master_port:6379 master_link_st ...
- 痞子衡嵌入式:探讨i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题. 前段时间有客户在官方社区反映 i.MXRT1170 下 ...
- C++异常处理:try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- C++异常处理: try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- s5pv210中断体系
一.什么是中断? 1.中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. 2.微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行 ...
- C++ 异常处理机制的实现
http://blog.jobbole.com/103925/ 本文深入讨论了VC++编译器异常处理的实现机制.附件源代码包含了一个VC++的异常处理库. 下载源代码 – 19 Kb 介绍 相对于传统 ...
- STM32之中断
在STM32(Cortex-M3)中没有显示的代码拷贝,只有启动代码进行了向量的初始化,一直以为是编译器在程序影像中自己完成了相关向量的拷贝,即,拷贝到固定的NVIC区,事实上并不是这样,cortex ...
- [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...
随机推荐
- Mac下SSH Key配置
1 .检查.ssh文件夹是否存在 $ ls -al ~/.ssh 2.如果不存在新建.ssh文件平 $ mkdir ~/.ssh 3.生成KEY在命令行中输入,your_email@example.c ...
- Qt/C++音视频开发64-共享解码线程/重复利用解码/极低CPU占用/画面同步/进度同步
一.前言 共享解码线程主要是为了降低CPU占用,重复利用解码,毕竟在一个监控系统中,很可能打开了同一个地址,需要在多个不同的窗口中播放,形成多屏渲染的效果,做到真正的完全的画面同步,在主解码线程中切换 ...
- 整理ML&AI学习路径图
干货分享: 下面给出一个笔者自己整理的GitHub仓库:https://github.com/isLinXu/awesome-road-map 里面包含了一些可供参考的学习路径和思维导图,并整理微软. ...
- 前端学习openLayers配合vue3(偏移动画效果,限制范围)
我们原来的偏移感觉比较生硬,我们来学习一下偏移的动画,先列一下这节的知识点 限制经纬度范围和缩放范围(view层) view = new View({ center:[114.305469,30.59 ...
- Java方法引用、lambda如何序列化&方法引用与lambda实现原理
系列文章目录和关于我 0.引入 最近笔者使用flink实现一些实时数据清洗(从kafka清洗数据写入到clickhouse)的功能,在编写flink作业后进行上传,发现运行的时候抛出:java.io. ...
- 注册表判断是否安装微软Edge浏览器
自己摸索的,注册表判断是否安装微软Edge浏览器: bool checkInstalledMsEdge() { try { using(var ieKey = Registry.LocalMachin ...
- 领域驱动设计实战-DDD
--------------------- 领域驱动(DDD,Domain Driven Design)为软件设计提供了一套完整的理论指导和落地实践,通过战略设计和战术设计,将技术实现与业务逻辑分离, ...
- Docker的启停与配置等
Docker测试题 一.选择题(每题5分) 1.关于Docker 安装的表述错误的是(C) A.Docker支持在Windows.Linux.MacOS等系统上安装 B.CentOS安装Docker有 ...
- Object类是所有Java类的根父类
- Confusion pg walkthrough Intermediate
namp ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.188.99 Starting Nmap 7.94SVN ( https://nmap.org ) at ...