#systemverilog# 关于流操作符>>和<<引发的思考

news/2024/5/19 17:36:33 标签: systemverilog

前言

对于流操作符,相比大家都不陌生,在实际项目中运用特别广泛。今天我们通过几个小例子,来回顾和深层认识一下该操作符。

概念

流操作符(bit-stream),表示方式为{>>{}} 和 {<<{}}。前者会把数据块按照从左到右的形式转化成bit流(stream),后者相反,则是从右到左形成一串数据流。

语法:

streaming_concatenation ::= { stream_operator [ slice_size ] stream_concatenation } // from A.8.1
stream_operator ::= >> | <<
slice_size ::= simple_type | constant_expression
stream_concatenation ::= { stream_expression { , stream_expression } }
stream_expression ::= expression [ with [ array_range_expression ] ]

下面这个例子:实现了对数组内数据的逆序,并且将该数组打包为一个int。通过这句话我们知道,首先输入是一个数组,数组内含有多个元素;最终输出为一个int 数据。

 语法解释:a = {<<byte{array}}

<1> {array} : 表示操作的对象是 一个数组指针

<2> << : 表示自右向左形成bit 数据流

<3>byte : 表示操作的对象的以byte == 8bit 为单位进行截取

原理图解释如下:

 更多练习:

    //a = {<<byte{array}};    // 例子默认以8 bit 为整体
    //a = {<<{array}};        //0xff250031, 默认以单bit为整体
    //a = {<<bit{array}};     //0xff250031, 以单bit为整体

    //a = {<<bit[4]{array}};      //0xff4a00c8, 以4bit为整体
    //a = {<<bit[3:0]{array}};    //0xff4a00c8, 以4bit为整体
    //a = {<<bit[0:3]{array}};    //0xff4a00c8, 以4bit为整体
    //a = {<<bit[0:2]{array}};    //0xfda44086, 以3bit为整体

    //a = {<<logic[0:3]{array}};  //0xfda44086, 以4bit为整体
    //a = {<<reg[0:3]{array}};    //0xfda44086, 以4bit为整体
    //a = {<<bit[0:3]{array}};    //0xfda44086, 以4bit为整体
    //a = {<<bit[16]{array}};     //0x0xa4ff8c00, 以16bit为整体

    //a = {>>{array}}; //0x8c00a4ff  , 以单bit为整体
    //a = {>>bit{array}}; //0x8c00a4ff , 以单bit为整体
    //a = {>>bit[4]{array}}; //0x8c00a4ff, 以4bit为整体
    //a = {>>bit[8]{array}}; //0x8c00a4ff, 以8bit为整体
    //a = {>>bit[2]{array}}; //0x8c00a4ff, 以2bit为整体
    //a = {>>bit[3]{array}}; //0x8c00a4ff, 以3bit为整体
    //a = {>>bit[5]{array}}; //0x8c00a4ff, 以5bit为整体

思考延伸 

例子变形:

仿真输出结果如下: 

因为我使用的计算机是64位的,所有对于int 数据类型内存占据 32bit, 而声明为 shortint 之后,变量内存占据16bit。故:

8'h11 -> 16'h0011

8'h22 -> 16'h0022

8'h33 -> 16'h0033

8'h44 -> 16'h0044

经过<<int(32bit)操作符之后,会以32bit 的方式形成bit 数据流。 


http://www.niftyadmin.cn/n/408568.html

相关文章

修改docker容器端口映射到主机的方法

修改docker容器端口映射的方法 如何修改已经创建好的容器的映射端口 大家都知道docker run可以指定端口映射&#xff0c;但是容器一旦生成&#xff0c;就没有一个命令可以直接修改。万一我们已经对容器里面的内容已经做了一定更改&#xff0c;不能删除重建&#xff0c;怎么办呢…

JavaSE_day45-46(网络编程、UDP/TCP)

1 了解了网络通讯中的三个要素&#xff1a; IP地址、端口号、通讯协议 * Java中有一个类就可以来表示IP地址 * * InetAddress: 此类表示互联网协议&#xff08;IP&#xff09;地址. * * ipconfig: 可以获取当前计算机的网卡 和 IP地址 * * */ public class A_netA…

第四十九回:DefaultTabBarController Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了TabBar Widget相关的内容,本章回中将介绍 DefaultTabBarController Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的DefaultTabBarController Widget没有具体的物理形态&#xff0…

基于RK3399/RK3588 H.265/HEVC的低延迟视频传输系统设计与实现

近年来&#xff0c;随着短视频直播的兴起&#xff0c;视频传输设备在生活中的应用越发普及。人们对图像 清晰度、帧率、码率等技术指标的要求不断提高&#xff0c;视频帧所包含的数据量也在急速增加。在 有限的网络带宽下&#xff0c;传统的视频采集设备面临压缩率不足、帧率…

Vulnhub 靶机渗透:SICKOS: 1.2

SICKOS: 1.2 一级目录二级目录三级目录 nmap 扫描端口扫描详细扫描漏洞扫描 web渗透gobuster扫描nikto漏洞扫描思考继续 获得立足点提权总结 一级目录 二级目录 三级目录 https://www.vulnhub.com/entry/sickos-12,144/ 靶机IP&#xff1a;192.168.54.30 kali IP: 192.168.5…

基于Faster RCNN时间钢铁表面的缺陷检测

目标检测在许多行业中都有许多实际应用。大多数时候,在工业环境中,物体检测目标很小。因此,有效地训练目标检测模型变得非常困难。其中一个问题是钢材表面缺陷检测。即使使用深度学习,也很难高精度地解决问题。在本文中,我们将使用 PyTorch 库训练 Faster RCNN 对象检测模…

案例34:基于Springboot在线互动学习网站开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

算法提高-图论-单源最短路的建图方式

单源最短路的建图方式 单源最短路的建图方式AcWing 1129. 热浪AcWing 1128. 信使AcWing 1127. 香甜的黄油AcWing 1126. 最小花费AcWing 920. 最优乘车AcWing 903. 昂贵的聘礼 单源最短路的建图方式 AcWing 1129. 热浪 #include <iostream> #include <cstring>usi…