a[0+:8] 、b [15-:8] 什么意思?怎么用?

2020-06-30 13:56:52 浏览数 (1)

之前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有时分享代码编写技巧,不是推崇沉迷于技巧,功能实现才是根本目的哈,黑猫白猫,抓住一只耳的才是好警长~

0 人点赞