SystemVerilog: Dynamic part-select and array slicing
目录
1. What is part select and array slicing?
2. Dynamic part select
2.1 错误的写法
2.2 直观的正确写法
2.3 简明的写法
3. Dynamic array slicing
1. What is part select and array slicing?
Slicing是指从数组中选择一个连续区间的元素,比如说,a[3:5],表示选择数组a中的索引为3,4,5的元素。Slice is a selection of one or more contiguous elements of an array, whereas part select is a selection of one or more contiguous bits of an element.
需要注意的是,SystemVerilog与Python在Slicing处理方面有细微差别,Python中是不包含上界的,而SystemVerilog中则是包含上界。比如说在Python中a[3:5]是指选择数组中索引为3和4的元素,不包括索引为5的元素。
part-select是指对一个多比特数据选择其中一段连续区间内的数据,比如说对于32比特的整型数a,a[3:5]表示选择a[3],a[4],a[5]。
2. Dynamic part select
2.1 错误的写法
在普通用法中,不管是part-select还是array slicing,上界和下界应该都是常数。而不能是变量,比如说,你不能像下面这么用:
program partselect_arrayslice;bit [63:0] data;byte byte_data[8];byte byte_data2[3];initial begin : example1void'(std::randomize(data));for(int k=0; k<8; k++)beginbyte_data[k] = data[k*8+7 : k*8];end
endendprogram
这段代码编译后会报告错误:
最直观的做法就是不用for-loop,直接逐个赋值就是了,如下所示:
2.2 直观的正确写法
program partselect_arrayslice;bit [63:0] data;byte byte_data[8];byte byte_data2[3];initial begin : example2void'(std::randomize(data));$display("Value of data is %h",data);// Using part select to copy data from data to byte_data.byte_data[0] = data[07:0];byte_data[1] = data[15:8];byte_data[2] = data[23:16];byte_data[3] = data[31:24]; byte_data[4] = data[39:32]; byte_data[5] = data[47:40]; byte_data[6] = data[55:48]; byte_data[7] = data[63:56]; $display("After the part select...");foreach(byte_data[i])$display("\t byte_data[%0d] = %h",i,byte_data[i]);
end endprogram
运行后会得到(当然由于以上data是随机生成的,所以每次运行可能得到不同结果):
2.3 简明的写法
在比特数比较少的时候自然这样做也可以,但是比特数很多的时候,比如说256比特的数据像以上这样拆分要写32条语句,这就有点郁闷了。甚至在验证环境中这个比特数是可变的,像以上这样确定性的分拆本身就不可能了。该怎么办呢?
SystemVerilog提供了如下所示的简明的写法(但是,老实讲为什么就不能按照直观的方式定义成a[k:j]之类的写法我也不甚了了,还要进一步学习):
+: Notation
byte = data[j +: k];
j -> bit start position
k -> Number of bits up from j’th position
如上所述,j表示起点位置,k表示从起点位置开始的连续区间的长度。“+:”是用于索引上升区间,类似的还有索引下降区间的写法,如下所示:
-: Notation
byte = data[j -: k];
j -> bit start position
k -> Number of bits down from the j’th position
利用这个语法,以上例子可以改写为:
program partselect_arrayslice;bit [63:0] data;byte byte_data[8];byte byte_data2[3];initial begin : example3void'(std::randomize(data));$display("Value of data is %h",data);// Using part select to copy data from data to byte_data. $display("After the ascending part select...");foreach(byte_data[i])beginbyte_data[i] = data[8*i +: 8];$display("\t byte_data[%0d] = %h",i,byte_data[i]); end $display("After the descending part select...");foreach(byte_data[i])beginbyte_data[i] = data[8*i+7 -: 8];$display("\t byte_data[%0d] = %h",i,byte_data[i]); end
endprogram
3. Dynamic array slicing
与part-select相似,array slicing也可以用以上这种语法来实现动态的区间选择。
如下例所示为纯行为级的模拟一个信号处理中常用的滑动窗的数据窗移动的处理过程。如果这个数据窗宽度非常大,用直接赋值的方法就会非常繁琐,而用"+:"或者"-:"则非常简单明了。
program partselect_arrayslice;bit [63:0] data;byte byte_data[8];byte byte_data2[3];initial begin : example4foreach(byte_data[i]) begin//void'(std::randomize(byte_data[i])); // NG.byte tmp;void'(std::randomize(tmp));byte_data[i] = tmp;$display("byte_data[%d] = %h",i,byte_data[i]);end// Dynamic array slicing to simulate sliding windowfor(int k=0; k<5; k++)beginbyte_data2 = byte_data[k +: 3];$display("byte_data2 = %h %h %h",byte_data2[0],byte_data2[1],byte_data2[2]);end
end
endprogram
运行结果如下,可以看出byte_data2中存储的3个字节的数据是byte_data中的一个宽度为3的窗口内的数据。
Ref: SystemVerilog Array Slice - Verification Guide
SystemVerilog: Dynamic part-select and array slicing相关推荐
- [SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)
SystemVerilog压缩数组和非压缩数组 The term packed array is used to refer to the dimensions declared before the ...
- ruby array_Ruby中带有示例的Array.select方法
ruby array Array.select方法 (Array.select Method) In the last articles, we have seen how to iterate ov ...
- SystemVerilog: 仿真验证知识点点滴滴
目录 1. 软件世界和硬件世界 2. 什么是package 3. import pkg::*是将pkg的所有都导入进来吗? 4. import vs include 5. 仿真时间和无限死循环 6. ...
- SystemVerilog: 动态数组
目录 1. 概要 2. 动态数组的声明 3. 内存分配和初始化 4. 容量扩张 5. 动态数组的复制 6. 动态数组的删除 7. 代码例 1. 概要 动态数组(Dynamic array),顾名思义, ...
- IE6/7/8/9中Table/Select的innerHTML不能赋值
IE6/7/8/9中Table/Select的innerHTML赋值会报错,如下 <!DOCTYPE HTML> <html> <head><meta cha ...
- html多选框 jquery,jQuery Select多选
插件描述:jquery.multi-select是一款jQuery开发的美化Select多选插件,界面上存在未选和已选两个框方便选择,支持分组. HTML elem 1 elem 2 elem 3 e ...
- c++ select函数_PySpark 操作函数一览
PySpark 操作函数一览 Created: Sep 14, 2020 10:28 AM Tags: Big Data, PySpark, Python, Spark Pyspark.sql.fun ...
- maxcompute 2.0复杂数据类型之array
2019独角兽企业重金招聘Python工程师标准>>> 1. 含义 类似于Java中的array.有序.可重复. 2. 场景 什么样的数据,适合使用array类型来存储呢?这里列举了 ...
- ruby中、.reject_Ruby中带有示例的Array.reject方法
ruby中..reject Ruby Array.reject方法 (Ruby Array.reject Method) In the last article, we have seen how w ...
最新文章
- 【WWW2021】高效的非抽样知识图谱嵌入
- GitHub 的项目徽章
- mysql 关键字 status_Mysql show status命令详解
- 写作—开启技术成长之路
- 关于数据库隔离问题说明及解决
- leetcode 509. 斐波那契数
- ThinkPHP入门
- 汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案...
- AIX5.3安装oracle10g
- 云计算的云数据安全与加密技术
- Linux 系统调优相关工具
- 动态规划(树形DP):HDU 5886 Tower Defence
- 946. Validate Stack Sequences验证栈序列
- python高通滤波_图像处理之高通滤波及低通滤波
- linux打印信息命令行,从 Linux 命令行进行打印
- ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册
- JSD-2204-JavaScript-Vue-Day05
- linux 桌面 v2ex,程序员:他人笑我桌面太凌乱,我笑他人看不穿
- MySQL数据库安全
- initrd和initramfs的区别