之前jerry讲过怎么最方便的把一个128bit位宽的数,拆成字节使用的技巧(不知道的可以复习下前面的文章哦~)。今天反过来讲讲怎么把字节为单位的数拼成128bit?
这个问题其实也是很简单的,相信关注Jerry的同学都会,比如最容易想到的移位来解决这个问题:
可以这样写:
代码语言:javascript复制bit [7:0] jerry_byte[16];
bit [127:0] data;
for(int i=0; i<15 ; i )
begin
data[127:0] ={data_mid[119:0],jerry_byte[i]};
end
如果是对应关系相反,我们可以把移位那句话这样写:
代码语言:javascript复制data[127:0] ={jerry_byte[i],data_mid[127:8],};
这些都是没问题的,但是今天jerry重点想给大家说一个新的写法:
代码语言:javascript复制bit [7:0] jerry_byte[16];
bit [127:0] data;
for(int i=0; i<15 ; i )
begin
data[i*8 : 8] = jerry_byte[i];
end
如果对应关系相反,我们可以循环这样写:
for(int i=0; i<15 ; i )
begin
data[(127-i*8) -: 8] = jerry_byte[i];
end
我们观察下这种写法和前面说的直接区别:首先是代码少写了几个字,然后是我们不使用移位的方式,移位的位数可以不用计算了。(这样写的优势j其实还好吧,就主要介绍下这个方法给大家装X用吧~)
好了,对于很多初学者可能还不太清楚这个写法什么意思吧,
我们来介绍下:
拿刚才例子中:
代码语言:javascript复制data[0 : 8] 含义就是data[7:0]
data[8 : 8] 含义就是data[15:8]
data[127 -: 8] 含义就是data[127:120]
data[119 -: 8] 含义就是data[119:112]
原来是这样啊,加号冒号、减号冒号的前面就是起始的bit数,后面的数就是往前后找几位。如果是加号冒号,就是往增大的方向找后面数字的位数。减号就是往减小的方向找后面数字的位数!
但是Jerry又要说一个重点细节,data[0 : 8] 含义是data[7:0],为什么不是指的是data[0:7] 呢??这个也完全符合定义啊!
告诉各位原因:因为我们刚才这样定义的: bit [127:0] data;
我们定义的就是[127:0] 而不是[0:127] !!!
如果我们定义的是 bit [0:127] data;
代码语言:javascript复制data[0 : 8] 含义就是data[0:7]
data[8 : 8] 含义就是data[8:15]
data[127 -: 8] 含义就是data[120:127]
data[119 -: 8] 含义就是data[112:119]
好了相信现在大家对这个知识点应该是清楚了,最后再啰嗦的总结一遍,大家可以朗读下jerry的心法注释,强化理解和记忆:
data[0 : 8]
代表从0bit开始,向上加8bit的数,也就是0:7。
data定义如果是高位到低位,那这个数就代表data[7:0],反之则代表data[0:7];
data[8 : 8]
代表从8bit开始,向上加8bit的数,也就是8:15。
data定义如果是高位到低位,那这个数就代表data[15:8],反之则代表data[8:15];
data[127 -: 8]
代表从127bit开始,向下减8bit的数,也就是127:120。
data定义如果是高位到低位,那这个数就代表data[127:120],反之则代表data[120:127];
data[119 -: 8]
代表从119bit开始,向下减8bit的数,也就是112:119。
data定义如果是高位到低位,那这个数就代表data[119:112],反之则代表data[112:119];
好了,今天Jerry就聊到这里,还是那句话,Jerry有时分享代码编写技巧,不是推崇沉迷于技巧,功能实现才是根本目的哈,黑猫白猫,抓住一只耳的才是好警长~