11.7[高体】

HomeworkDesign

一、把整个模拟器看成一个全局状态转移系统

二、CPU、事件队列、调度器三者的职责必须分开

三、你的"全局队列 + 全局调度器"想法是正确的

四、事件队列是全局的,还是每个部件一个?

六、gem5 的事件队列应该怎样理解

七、事件本身应该包含什么信息

八、事件不是"直接修改其他组件",而是向其他组件发送请求

九、你的系统可以看成多个状态机的组合

思考1

一般来说,若没有缓存(即该作业所对应的场景),指令是存在内存当中的吧;所以我假设起始指令是在内存当中的某个地址a当中;那么起始时,就是往全局事件队列当中插入一条cpu读取执行地址a对应指令的事件,然后cpu就会不断往队列当中插入新指令直到结束了吧。对于结束事件,我可以往内存当中声明一条模拟终止指令,当cpu读取到这个指令的时候,就会往事件队列当中插入终止事件。

那么问题关键在于,系统当中应该有哪些组件、状态机,或者说,结构、分工是怎样的;现在的构想是,先是全局队列,事件,模拟等作为一个文件,负责模拟骨架;然后CPU一个文件,其内部是CPU的状态机和状态更新,处理等(如何设计CPU的状态机?先考虑简单的单周期);内存一个文件,负责内存的状态机的更新(它的状态机设计是关键,因为有读写端口,是否考虑能够同时处理读写?但是目前是不会同时发生的,或许依然可以是只处理一个事件的情况?);是否还有其它组件?

释疑1

先确定我们究竟要模拟到哪一层

"单周期"需要有一个严格含义

没有缓存时,完全可以把指令和数据放在同一个 Memory 组件里。

统一内存的端口问题,是单周期设计里必须正面处理的约束。

系统的组件可以分成"必要组件"和"暂时不需要的组件"。

模拟骨架可以集中,但最好保持内核不理解 CPU 指令。

事件的最小结构可以很小

CPU 的状态机,要区分"被模拟硬件的控制状态"和"模拟程序自己的执行状态"。

"周期开始求值,周期结束提交"是很适合这个作业的实现原则。

待提交效果,是 CPU 设计中值得单独保存的一份数据

四类指令分别怎样求值和提交,可以明确成一张表。

疑问1

那所谓单周期CPU,在离散事件推进的模拟器当中,是否和单发射顺序执行CPU没区别,或者说,单周期CPU是单发射顺序执行CPU的子集,只不过在离散事件模拟器当中,可能无法还原出其单周期的特点?

"单发射""顺序执行""单周期",分别限制不同的事情。

思考2

对于指令,或许不必真的实现二进制数据的模拟,而就是直接用枚举类,来表述当前支持的指令类型,不过这样又无法和数据统一存于内存当中;但在全局事件队列当中,应被统一描述为事件,而非指令?

对于CPU的状态设计,考虑有空闲状态a(idle),取&等待指令状态b(即已经向外部发出请求指令,等待返回指令的阶段),执行指令状态c(执行得到的指令),终止状态d,异常状态(该作业不需要)

对于内存的状态设计,它需要知道接收到的是读请求还是写请求,空闲状态a,工作状态b

接下来从全局事件队列的角度分析和考虑

初始时,CPU向指令段请求第一条指令,b状态,假设为0ns,即CPU内部完成自己的状态更新,同时向全局队列中插入对内存的请求事件,对应的时间,应该是模拟的CPU与内存的通信时间延迟,假设为2ns

全局事件队列的下一个事件调度应该落到内存,即全局调用内存对应的处理函数,在2ns时,内存通过读取事件包,知道是读请求,更新自己的状态为busy,如果内存在一瞬间能完成检索,那或许内存都不需要状态机,因为在2ns内,内存就完成了工作,如果内存无法在一瞬间完成,或许就需要状态机(同样的问题是否也可以用于CPU?),即假设完成任务需要3ns,那么在2-5ns期间内,如果有新的其他请求,就会因为此时内存处于busy状态而无法接收;那先假设内存处理任务不需要时间,或许内存就完全不需要状态机,只需要存数据和指令,知道如何更新事件队列即可;所以2ns,内存被全局事件队列唤出后,在一瞬间知道是CPU读,然后从读地址当中知道了要读的数据和要写入的地址,接下来要往CPU的r1寄存器当中写数据,于是向全局事件队列添加新事件,时间为2+2=4ns,事件是写寄存器

接下来到4ns,CPU被唤出后,知道要写了,于是依据内容更新自己的寄存器,完成了该条指令,那么接下来要到下一条指令,应该是从c状态再到b状态,而非a状态(那么CPU的a状态是否无用,应该是无用的,因为cpu始终都在处于执行指令和等待指令的过程当中,即使是初始化,也是要向第一条指令发出访问);也就是说在4ns时,CPU更新了自己的数据和状态,同时到达了b状态,又往全局队列当中写入新事件,为4+2=6ns,向内存请求指令

6ns,内存读并添加事件,8ns

8ns,CPU得到指令,状态a->b,再加事件为请求数据,12ns

10ns,内存读并添加事件,12ns

12ns,cpu知道数据,状态b->a,再加事件为请求指令,14ns

14ns,内存读并添加事件,16ns

16ns,cpu知道指令,状态a->b,此时为add指令,在模拟时,cpu可以在一瞬间算完,那么加入事件为更新自己的r3,假设add计算要1ns,那么为17ns

17ns,cpu唤起,更新自己的r3,状态b->a,加事件为请求指令,19ns

19ns,内存唤起,加事件为21ns

21ns,cpu唤起,状态a->b,向内存发出写请求,加事件,23ns

23ns,内存唤起,写自己的数据,返回响应,加事件,25ns

25ns,cpu唤起,状态b->a,向内存请求指令,27ns

27ns,内存唤起,返回正常结束指令,29ns

29ns,cpu唤起,发现是结束指令,由b->c状态,并向全局队列加入结束事件

29ns,全局调度发现是结束事件,于是结束

不过存在问题就是正常应该是25ns就结束仿真,但结束要靠结束指令,所以到29ns才结束

释疑2&design

把事件类型收敛后,整个模拟器其实只需要少量事件。

18.当前版本的 CPU 状态转换可以明确写成下面这些规则。

19.当前 Memory 的处理规则可以比 CPU 简单很多。

20.模拟骨架和组件代码的分工,现在可以非常明确。

design

指令

对于instruction,是如何定义的,cpu是如何识别指令,内存是如何存储它的?如何初始化他们在内存当中的

就是说实际是怎么使用instruction这个结构体的?结构体不再是32位的吗,而是说结构体当中包含rd,rs1,rs2等8位二进制,以及32位的地址用于标识在内存当中的位置;那Opcode这个枚举类是几位的?最终instrcution结构体内部的内存布局是怎样的,有多大,以及在程序中如何被创建、初始化以及被识别和使用

上面.cpp是实现了初始化函数和tostring,初始化return的就是依据传入参数来构造的结构体,包含5个值,为opcode,rd,rs1,rs2,address等

内存布局

结构体如何创建

CPU 如何取到并识别指令

Simulation

.hpp

.cpp

关键1

在simulation当中,scheduleAt和after函数是干什么用的,如何用?以及Event的action如何被赋值以及被调用?

关键2

内存与CPU交互

组件之间的连接关系

请求、响应、事件分别代表什么

疑问1

既然是CPU向内存发请求,为什么这个函数不设计在cpu内,而是放到内存里,然后每次发送指令请求的时候,都要调用memory的request?这样看上去就有点绕

因为cpu向内存发送请求时,在cpu内没有往全局队列里放入事件,即issueRequest没直接放,反而是内部调用的memory的sendRequest发送了给内存自己的事件,构想的或许该是issueRequest放入事件,然后其内部放入的函数是memory的sendRequest

CPU

CPU 内部的状态和函数

各种完成函数

memory

Memory 内部的状态和函数

C++语法

对于action函数的定义,那些写法我都看不大懂,主要是语法不了解;采集当前项目中关于action函数的所有实现,说明是如何做的,比如 this, request = std::move(request),

responseHandler = std::move(responseHandler) mutable {

memory_.receiveRequest(std::move(request),

std::move(responseHandler));

});,this我知道是指向当前对象的指针,但是当前对象是指什么?std::move又是什么意思,为什么这样用?mutable什么意思

回调函数

std::move

相关推荐
Csvn43 分钟前
认识 Nginx
后端·nginx
apcipot_rain1 小时前
C++转Java日记(04)
java·开发语言·c++
红尘散仙1 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
特立独行的猫A2 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
陈随易2 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
金銀銅鐵3 小时前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
憧憬成为java架构高手的小白3 小时前
LangGraph4j 实战(下)
java
天诰4 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
IT_陈寒6 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端