Rocket - decode - 解码单个信号
Posted 技术之一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rocket - decode - 解码单个信号相关的知识,希望对你有一定的参考价值。
介绍解码单个信号逻辑的实现。
1. 单个信号
每个指令对应了一组信号,每个信号对应了一个解码逻辑。
如BNE指令对应的信号如下:
??
各个信号的含义如下:
??
每个信号都是一个BitPat,位宽不定,并非只有一位:
??
事实上是每个信号的每一位对应了一个解码逻辑,每一次只解出一位。
2. generator
生成解码逻辑的代码(generator)定义于DecodeLogic对象中,如下(已做重构):
??
1) addr即是inst,也就是指令本身;
2) default为默认值;
3) 调用term方法把default转换为项(Term类的实例,如最小项或最大项): val dTerm = term(default)
4) 把映射表mapping解为一组keys和一组values:val (keys, values) = mapping.unzip
5) 分别求出keys和values的最大宽度:
??
6) 把keys和values转变成为Term:
??
7) 检查kTerms是否存在重叠的情况,即各个指令的编码是否存在重叠的情况:
??
执行示例如下:
??
??
intersects实现如下:
??
(value ^ x.value) &~ mask &~ x.mask 可以转换为更容易理解的形式:(value ^ x.value) & (~mask) & (~x.mask)
a. (~mask) & (~x.mask)意为:this和x共同的变量;
b. (value ^ x.value) & (~mask) & (~x.mask)意为:this和x共同的变量值都相同;
8) 逐个解出信号value的每一位:(0 until vMaxWidth).map(...),然后组合成为所对应的信号:Cat(...)
因为前者LSB在前,后者MSB在前,所以需要使用reverse逆序。
3. 解码单个位
先提一下项(Term)的mask中为1的位对应的变量为忽略(dont care)的变量,其对应的位在value中的值为0。mask中为0的位对应的变量为项(最大项、最小项)中包含的变量,其对应的位在value中的值可以为0或1。
如由四个变量(A/B/C/D)组成的项AB,则AB对应的mask位为0,CD对应的mask位为1。
生成解码单个位的逻辑的代码如下:
??
1) 取出最小项
??
k对应的为key,即指令编码;
t对应的为要解码的信号;
mint即minTerms,即信号的第i位为1的key的集合,也就是指令的集合。
2) 取出最大项
??
maxt即maxTerms,即信号的第i为为0的key的集合,也是指令的集合。
之所以称为maxTerms,是因为其对应的值为0,与minTerms对应的值1相反。根据反演律亦即德摩根定律,最小项取反即为最大项。
3) 取出无关项
??
mask为1的变量为无关项。
4) 根据默认值选择要参与解码的项
译码的结果有三种:
a. 0
b. 1
c. x/dc,不关心
默认值为其中一种,则只需要把 要解码的指令 到 另外两种解码结果的指令集合 中查找即可。
a. 默认值为不关心:((dTerm.mask >> i) & 1) != 0
使用minTerms和maxTerms进行查找:
??
SimplifyDC使用类似卡诺图化简的方法进行化简,返回Seq[Term]。logic中生成逐个比较并返回的逻辑。
b. 默认值为0:val dBit = (dTerm.value.toInt >> i) & 1
默认值dBit=0,使用minTerms和dc进行查找:
??
bit为查找结果,找到为1,找不到为0,即默认值。与译码结果一致。
c. 默认值为1:val dBit = (dTerm.value.toInt >> i) & 1
默认值dBit=1, 使用maxTerms和dc进行查找:
??
bit为查找结果,找到为1,找不到为0。与译码结果相反,需要取反。
4. logic
??
把addr与terms中的所有项逐个比对,返回比对结果。
5. term
??
term方法把BitPat,转换为Term。
a. Term的值即为BitPat的值;
b. Term的mask为BitPat的mask取反;
mask补码 = 2^n - mask = ~mask + 1
即:~mask = 2^n - mask - 1 = 2^n - (mask + 1)
以上是关于Rocket - decode - 解码单个信号的主要内容,如果未能解决你的问题,请参考以下文章
Rocket - decode - Simplify
Rocket - decode - SimplifyDC
Rocket - debug - TLDebugModuleInner - Abstract Command Decoding & Generation
Rocket - decode - Term
Rocket - decode - 最小项与最大项
'is' '==' 编码,解码