两个数据变量进行某个操作(op),产生一个输出,这个输出存在一个匿名变量中。这个匿名变量就是以OpBinding的形式绑定到hardware graph中的。
 
0. 这里先简单对 "=" 和 ":="做一个讨论。
 
假设 a & b 的结果输出到一个匿名变量,记为anonymousVariable。
 
a & b的用法有两种:
 
1) c := a & b
 
":="的意思为连接。变量c作为下游,连接到anonymousVariable,接收其值。即anonymousVariable的值的变化会传播到下游c中。
 
2) c = a & b
 
"="的意思是赋予。之所以不说赋值,是因为更多情况下赋予的不是值,而是引用。
 
这里就是把anonymousVariable赋给c。就相当于给a & b的输出这个匿名变量取了一个名字,叫做c。
 
因为anonymousVariable是匿名的,所以这里使用c来简化引用也是有意义的。
 
总结下来:
1) 两者的区别在于,一个是匿名变量本身,一个是匿名变量的下一级连接。
2) ":="是连接到的意思(connect to);
3) "="也不是赋值,而是赋引用,取名字或者起别名的意思;
 
 
1. OpBinding
 
1) 两个操作数:a op b
 
以a & b为例,方法&定义在UInt中:
这里a是this,b是that。&的结果为UInt(this.width max that.width),这是一个匿名变量。
 
binop定义在Bits中:
其中a是this, b是other,dest为匿名变量。
 
这里要求this, other亦即a, b都是已经绑定了的(设想一下,输入输出端口已经绑定了,内部变量使用Wire/Reg绑定了)。dest是新创建的变量,还没有绑定。
 
DefPrim定义了一个Definition,无关绑定。其id为dest。
case class DefPrim[T <: Data](sourceInfo: SourceInfo, id: T, op: PrimOp, args: Arg*) extends Definition
 
pushOp定义于Builder中:
这里cmd.id即为dest,调用其bind进行绑定。绑定类型为OpBinding。
 
 
2) 一个操作数:取反
 
与1)类似。
 
 
 
3) 一个操作数:截取部分位
 
如ByteSelector中:
io.in(7, 0)这个截取定义于Bits类中:
其中,UInt(Width(w))为匿名变量。
pushOp与之前定义一致。
 
可见位截取生成的临时变量也是使用OpBinding绑定到hardware graph中的。
 
 
2. ReadOnlyBinding
 
OpBinding为只读绑定,即ReadOnlyBinding。
 
只读绑定的变量,只能被读取,而不能被赋值。换一种说法:在硬件模型(hardware graph)中,只读绑定的变量,只能作为上游输出值(传播值),而不能作为下游,接收值(被传播)。
 
3. 连接的左值
 
只读绑定的变量只能作为右值,而不能作为左值。这里的左右是针对连接符号“:=”而言的。也是在连接方法中进行限制的。
 
连接符号定义于Data类中,
单个连接和批量连接,这里不做进一步区分解析。
 
 
这里如果this.topBinding为ReadOnlyBinding,则跑出异常。
 
所以this可以是WireBinding/RegBinding/PortBinding/MemPortBinding等的变量,而不能是OpBinding的变量。亦即,可以是模块的输出端口,内部定义的Wire()/Reg()临时变量,而不能是op的结果,也不能是比特截取的结果。
 
 

Chisel3 - bind - Op, ReadOnly, 左值的更多相关文章

  1. [C++11]_[0基础]_[左值引用声明和右值引用声明]

    场景: 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢? 常常也发现int& 和int&& 这两种 ...

  2. C++ lvalue(左值)和rvalue(右值)

    lvalue(左值)和rvalue(右值) 昨天写代码遇见一个这样的错误:{ "cannot bind non-const lvalue reference of type 'int& ...

  3. 话说C++中的左值、纯右值、将亡值

    写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...

  4. c++左值和右值

    c++编程中如果出现把一个函数的返回值.强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况.这时候就该注意了,你需要把该函数的参数类型前加上const修饰. 原因在于c++的左值和右值有所区 ...

  5. C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值

    解决该问题的方法:使用strcpy函数进行字符串拷贝   原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...

  6. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  7. c++ 左值 和 右值

    什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...

  8. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  9. C++变量的左值和右值

    变量和文字常量都有存储区,并且有相关的类型. 区别在于变量是寻址的,对于每一个变量,都有两个值与其相关联 1  它的数据值,存储在某个内存地址中.有时这个值也被称为对象的右值 文字常量和变量都可被用作 ...

随机推荐

  1. qgis控制滚轮转动地图比例尺的变化幅度

    需求:在比例尺1万-10万之间,鼠标滚轮转动比例尺的变化幅度为1万重写滚轮事件 void Xx::wheelEvent(QWheelEvent*event){ double curScale = sc ...

  2. 消息队列之Kafka——从架构技术重新理解Kafka

    Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢? 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的 ...

  3. CSS3 拯救我的布局吧box-sizing

    一.CSS常见的两栏布局 如上图,是一个很简单的两栏布局,就是一个宽度为960px:并且页面居中显示,侧边栏栏宽度为220px:主内容宽度720px:两者有一个20px的间距,并且有页眉和页脚. 代码 ...

  4. css3 常用。

    CSS3 边框 通过 CSS3,您能够创建圆角边框,向矩形添加阴影,使用图片来绘制边框 - 并且不需使用设计软件,比如 PhotoShop. 在本章中,您将学到以下边框属性: border-radiu ...

  5. Python 图像处理 OpenCV (1):入门

    引言 又开一个新的系列分享,对图像处理感兴趣的同学可以关注这个系列. 更新频率尽量保持一周两到三次推送. 新系列第一件事儿当然是资源推荐,下面是一些有关 OpenCV 的资源链接: 资源链接: 官方网 ...

  6. 不卸载Nginx隐藏版本号

    [修改配置文件](不卸载Nginx隐藏版本号,直接修改配置文件) Linux环境: [root@localhost nginx-1.16.1]# curl -I http://10.56.1.115  ...

  7. ql的python学习之路-day1

    写在前面的话:万事开头难,算是系统学习python的一个月了吧,总该写点什么来记录一下,之前看老男孩day1的视频没有开通博客,这次给补上,对于学python还是要好好努力,不能半途而废,还是那句老话 ...

  8. tomcat 添加 ssl 证书

    1. 将证书提供方给的证书(server.crt)及密钥文件(server.key)上传到服务器 tomcat 的 conf 目录 2. 在tomcat conf 目录下执行如下命令 (1) 生成P1 ...

  9. 【雕爷学编程】Arduino动手做(42)---PM2.5粉尘传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  10. 微信小程序入门知识点总结

    微信小程序入门知识点总结 前情介绍 ​ 微信小程序就不多介绍了,我们想要开发微信小程序首先得到微信公众平台 下方的小程序处注册相关账号并登录,接着填写小程序相关资料.在设置处可找到AppID用以开发微 ...