https://mp.weixin.qq.com/s/XDUtw0uPrVXC4CChbydF_A

 
分析在透传和代理两种模式下,AtomicAutomata可能出现的问题。
 
 
1. 透传
 
如果下游节点支持某一个Atomic操作,并且AtomicAutomata节点被允许不做代理的话,可以由下游节点处理这个Atomic操作:
 
因为透传的请求不会被缓存到CAM中,而CAM中已缓存的请求具有更高的优先级,所以当透传的 请求发送到out.a时,CAM实际上是空的。
 
 
当这个Atomic请求的响应返回到out.d时,如果CAM仍然是空的,或者没有其他同source的请求缓存在CAM中时,d_cam_sel_match和d_cam_sel是全0:
 
d_drop为假,进而out.d被透传到in.d:
 
问题来了:CAM中是否会存在同source的Atomic请求呢?
 
2. 部分透传、部分代理
 
答案是会:这意味着针对某个manager部分Atomic请求由他自己处理,部分请求由AtomicAutomata代理。符合传递给上游节点的参数范围:
假设beatBytes = 8,m.supportsArithmetic = [4, 16],
那么告诉上游节点的支持范围是widen之后的,即[1, 16]。其中[1, 2]由AtomicAutomata代理,[4, 16]透传给下游节点自行处理。
 
如果在透传了一个大小为8字节的透传请求后,又紧接着来了一个2字节的代理请求呢?
 
规范中似乎没有禁止这种请求顺序:
a. 可不等响应而连发多个请求,响应也不必按照请求的顺序发送:
 
b. 可以连发两个同类型的请求,而不必等待回复:
 
3. 问题情况
 
如果透传了一个Atomic请求,而没有回复的情况下,又来了一个同source的Atomic请求被缓存入CAM中。
 
那么当第一个透传请求的回复AccessAckData到来时,会把第二个请求的缓存条目(CAM entry)当做自己的条目对待:
​进而数据被缓存到cam_d中参与AMO运算。
 
第二个请求的响应到来时,如果代理操作的Put/Ack已完成,会被透传返回。如果早于Put/Ack到来,那么会被存入cam_d。
 
4. burst的情况
 
如果第一个被透传的是一个burst请求,情况比较复杂。需要注意的是后续beat时d_first为假,导致d_drop为假。这里不做分析了。
 
5. 发生概率
 
很少有节点只支持大范围的Atomic操作,而不支持小范围的Atomic操作。
如果连发两个相同类型的消息,那么响应消息就难以确认是针对的哪一个请求。
 
所以上述情况存在的可能性很低。
 
6. 解决办法
 
比较简单的办法是:把widen取消掉,只支持ourSupport大小的Atomic请求。
 
如果下游节点只支持大范围的Atomic操作,那么他就不能发挥这个能力,而只能选择被代理了。
 

Rocket - tilelink - AtomicAutomata之二的更多相关文章

  1. Rocket - tilelink - AtomicAutomata

    https://mp.weixin.qq.com/s/O7VTHqpCFNJQi3EpucXkIw   简单介绍AtomicAutomata的实现.(细节问题太多,恕不完全表述.)   ​​   1. ...

  2. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  3. Rocket - tilelink - ErrorEvaluator

    https://mp.weixin.qq.com/s/NkbW465NAmhDsETksd2M0g   介绍ErrorEvaluator的实现.   ​​   1. 基本介绍   ErrorEvalu ...

  4. Rocket - tilelink - Nodes

    https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA   简单介绍tilelink对Diplomacy Nodes的实现.   ​​   1. TLImp ...

  5. Rocket - tilelink - TLArbiter

    https://mp.weixin.qq.com/s/0ob-Fq-ZOoj-_S7pTJu6rQ   介绍TLArbiter的实现,主要关注如何实现burst的多个beat的输出.   ​​   1 ...

  6. Rocket - tilelink - fastProperty

    https://mp.weixin.qq.com/s/9nikweQUGG5FO3Z8t6feaw 介绍Parameters中定义的fastProperty的实现.(使用最近的新版本,差别不大)   ...

  7. Rocket - tilelink - AsyncCrossing

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg   介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...

  8. Rocket - tilelink - mask

    https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg   讨论tilelink中使用MaskGen生成mask的用法.   1. tilelink中的ma ...

  9. Rocket - tilelink - Parameters

    https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ   简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析).   ​​   ...

随机推荐

  1. 深入理解JS中的对象(一)

    目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...

  2. Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组

    需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...

  3. shell bash终端中输出的颜色和格式详解(超详细)

    文章目录 1) 格式 1.1 Set 1.2 Reset 2)8/16 Colors 2.1 前景(文字) 2.2 背景 3)88/256颜色 3.1 前景(文字) 3.2 背景色 4)组合属性 5) ...

  4. QtCreator MSVC 搭建 Debugger

    QtCreatorForWindows搭建Debugger QtCreator for windows选择mingw或者msvc: qt-opensource-windows-x86-msvc2015 ...

  5. Semaphore和AQS

    Semaphore意思的信号量,它的作用是控制访问特定资源的线程数量 构造方法: public Semaphore(int permits) public Semaphore(int permits, ...

  6. 【蓝桥杯C组】备赛基础篇之高精度算法

    一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...

  7. docer run 、docker attach 与 docker exec的区别

    进入容器的方式有以下三种: 使用ssh登陆进容器 使用nsenter.nsinit等第三方工具 使用Docker本身提供的工具 最佳方案为使用Docker本身提供的工具 docker run:创建和启 ...

  8. 抛弃os.path,拥抱pathlib

    基于Python的文件.目录和路径操作,我们一般使用的是os.path模块. pathlib是它的替代品,在os.path上的基础上进行了封装,实现了路径的对象化,api更加通俗,操作更便捷,更符编程 ...

  9. JS的函数和对象一

    1.递归 在函数的内部调用自身,默认是一个无限循环. 2.匿名函数 没有名称的函数  function(){   } (1)创建函数 函数声明 function fn1(){   } 函数表达式 va ...

  10. 06 返回静态文件的映射(函数/多线程)web框架

    06 返回静态文件的映射(函数/多线程)web框架 服务器server端python程序(函数版): import socket server = socket.socket() server.bin ...