https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg

 
简单介绍Atomics中数学运算、逻辑运算的实现。
 
 
1. io
 
Atomics是一个硬件模块,他继承自Modules:
 
IO端口定义如下:
其中:
a. write: 是否写操作;
b. a:输入操作类型及一个操作数;
c. data_in:输入另一个操作数;
d. data_out:输出计算结果;
 
2. Arithmetic params
 
处理channel a传入的params:
 
Channel A上的ArithmeticData消息的params定义如下:
对应代码,可以看到params各比特的意义:
a. io.a.params(2):如果这一位为1,则表明运算为加法运算;
b. io.a.params(1):如果这一位为1,则表明为无符号运算;
c. io.a.params(0):如果这一位为1,则表明为取最大值运算;如果为0,则为取最小值运算;
 
3. Arithmetic
 
数学运算逻辑的实现如下:
 
1) signBit
 
io.a.mask中的每一位对应着io.a.data中的一个字节。mask中为0的位对应的字节无效,不参与运算。mask中为1的位对应的字节才可以参与运算。那么io.a.data的符号,则由io.a.mask中最高的值为1的位对应的字节决定。
 
signBit的意义即为取出mask中最高的一个为1的位。只有mask中最高的值为1的位对应的比特值为1,其余比特的值都为0。这样可以作为掩码选出io.a.data中决定符号的字节。
 
这个左移一位相与的实现,有一个隐含条件:mask中值为1的比特要连续。
 
这一点由规范中对io.a.mask的要求来满足:
 
2) inv_d
 
如果是加法,则直接使用原值即可。如果是减法,则需要取反加一。
 
3) sum
 
相加:
a. 把io.a.mask中的每一位扩展为8位:FillInterleaved(8, io.a.mask)
b. 使用扩展之后的掩码去掩io.a.data,把无效的字节掩掉:FillInterleaved(8, io.a.mask) & io.a.data
c. 与inv_d相加: + inv_d
 
根据inv_d的取值,决定结果是和还是差:io.a.data - io.data_in = io.a.data + ~io.data_in + 1。
所以如果sum是差值,那么还需要加1才是真正的差值。
 
4) sign
 
计算输入参数的符号:
a. 输入参数x是一个UInt;
b. 取出x中每一个字节的最高位:x.toBools().grouped(8).map(_.last).toList;
c. 把最高位组成一个UInt;
d. 取出最高有效字节的最高位:& signBit;
e. 以Bool类型输出最高位:.orR();
 
5) pick_a
 
如果运算是比较大小的话,是选择第一个参与比较的数字a,还是选择比较对象d:
如果选择较大的数,而a大于d则选择a;
 
6) a_bigger
 
a是不是比d大:
 
a. 如果a和d的符号不同,则取决于a_bigger_uneq的值,这个下面介绍。
 
b. 如果a和d的符号相同,则取决于两者之差的符号,即取决于sum的符号,及sign_s的值。
 
这里的一个小trick是sum并不是真正的差值,而是差值减了1的值。即:
 
sign_s是sum的符号,sign_s == 0等价于sum >= 0:
a - d >= 1的情况下,a一定大于d,不包括a == d的情况。
 
这里利用了a == d的情况下,取a或者d都是一样的,来规避求差值需要减1的逻辑消耗。
 
7) a_bigger_uneq
 
这个名字中的uneq意思就是a和d的符号不同:
A. 如果unsigned == 1:
a. 如果sign_a == 1,那么sign_d == 0,a更大,a_bigger_uneq == 1;
b. 如果sign_a == 0,那么sign_d == 0,a更小,a_bigger_uneq == 0;
 
B. 如果unsigned == 0:
a. 如果sign_a == 1为负数,那么sign_d == 0为正数,a更小,a_bigger_uneq == 0;
b. 如果sign_a == 0为正数,那么sign_d == 0为负数,a更大,a_bigger_uneq == 1;
 
可以看到a_bigger_uneq可以很好的表示两个数值的大小。
 
4. Logical
 
Logical的计算比较简单,把第一个参数和第二个参数相应的位组合在一起,总共有四种情况,组成序号0/1/2/3,根据这个序号去查表即可得到逻辑运算的结果:
 
5. 运算结果输出
 
可能输出的有四个值:0=d, 1=a, 2=sum, 3=logical
 
根据每一种操作(io.a.opcode决定)所需要值确定一个序号,然后再使用这个序号从序列中取值即可:
这里根据io.a.mask,逐个字节取值。无效字节使用io.data_in中的值。

Rocket - tilelink - Atomics的更多相关文章

  1. Rocket - tilelink - RegisterRouter

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

  2. Rocket - tilelink - RAMModel

    https://mp.weixin.qq.com/s/9ccDTm6HytvfGN5R2CPoAQ   简单介绍RAMModel的实现.   ​​   1. 基本介绍   RAMModel用于定义内存 ...

  3. Rocket - tilelink - AtomicAutomata

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

  4. Rocket - tilelink - Nodes

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

  5. Rocket - tilelink - AsyncCrossing

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

  6. Rocket - tilelink - mask

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

  7. Rocket - tilelink - Parameters

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

  8. Rocket - tilelink - Bundles

    https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg   简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...

  9. Rocket - tilelink - TLBusWrapper.to

    https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...

随机推荐

  1. 线段树 C - Connected Components? CodeForces - 920E

    这个题目居然可以用线段树写,好震惊,如果不是在线段树专题肯定想不到,但是就算在线段树的专题里面,我也不太会怎么写. 这个题目大意是,给你n m n代表n个点,m代表m条边,然后就是m行,每行两个数字, ...

  2. Oracle的pl/sql变量类型

    pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...

  3. 王颖奇 20171010129《面向对象程序设计(java)》第十七周学习总结

    实验十七  线程同步控制 实验时间 2018-12-10 学习总结: 1.Java通过多线程的并发运行提高系统资源利用 率,改善系统性能. 2.假设有两个或两个以上的线程共享 某个对象,每个线程都调用 ...

  4. leetcode485——最大连续1的个数(easy)

    一.题目描述 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意 ...

  5. 【poj 2406】Power Strings 后缀数组DC3模板 【连续重复子串】

    Power Strings 题意 给出一个字符串s,求s最多由几个相同的字符串重复而成(最小循环节的重复次数) 思路 之前学习KMP的时候做过. 我的思路是:枚举字符串的长度,对于当前长度k,判断\( ...

  6. vim(vi)的常用快捷键

    Vim 简介 vim是什么?听说它是编辑器之神!神一样的存在,而我却经常用上下左右箭头来移动光标,实在是有点对不起它,所以想着稍微学学一点神的技能吧! 一. vim的三种模式 Nomal mode:默 ...

  7. HDU 2016 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016 题目大意:给你 n 个数,把最小的数和第一个数字互换,然后输出 解题思路: 很水,开数组,遍历并 ...

  8. STL库中神奇函数nth_element

    用法:nth_element(数组名,数组名+第k小元素,数组名+元素个数) 这个函数主要用来将数组元素中第k小的整数排出来并在数组中就位,随时调用. 例如: ]={,,,,},k ; cin> ...

  9. Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  10. android 自定义Dialog去除黑色边框

    在自定义Dialog时显示的界面中老是有黑色的边框,下面就介绍使用style去除黑色边框方法. 首先在values/styles定义自定义样式: <style name="MyDial ...