两个数据变量进行某个操作(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. 线段树的区间合并 B - LCIS

    B - LCIS HDU - 3308 这个是一个很简单很明显的线段树的区间合并,不过区间合并的题目都还是有点难写,建议存个板子. #include <cstdio> #include & ...

  2. 自动化运维工具Ansible之Roles测验详解

    Ansible Roles 详解与实战案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  3. Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组

    需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...

  4. 自动化测试工具-Selenium IDE 教程一

    引言:这里介绍的是谷歌浏览种的插件,安装教程这里不再描述,网上有很多, 使用教程不是特别多,所以特地花时间整理此篇内容: 一:打开插件,欢迎界面 启动IDE后,将显示一个欢迎对话框. 如果这是您第一次 ...

  5. [acdream_oj1732]求1到n的最小公倍数(n<=1e8)

    题意:如标题 思路:如果n在10^6以内则可以用o(nlogn)的暴力,题目给定的是n<=1e8,暴力显然是不行的,考虑到1到n的最小公倍数可以写成2^p1*3^p2*5^p3*...这种素数的 ...

  6. Linux设定系统变量和单个用户的环境变量问题

    环境为Ubuntu. 设定系统变量意思就是所有用户都可以使用设定的环境变量,而设定用户的单个环境变量意思就是只有设定环境的该用户才可以使用这个环境变量. 这里以java的jdk环境变量JAVA_HOM ...

  7. 9.1 Go 反射

    9.1 Go 反射 反射:可以在运行时,动态获取变量的信息,比如变量的类型,类别 1.对于结构体变量,还可以获取到结构体的字段,方法 2.实现这个功能的是 reflect包 reflect.TypeO ...

  8. 8.2 Go 锁

    8.2 Go 锁 案例(坑):多个goroutine操作同一个map. go提供了一种叫map的数据结构,可以翻译成映射,对应于其他语言的字典.哈希表.借助map,可以定义一个键和值,然后可以从map ...

  9. asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction

    asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction 1.带有Render的方法返回值是v ...

  10. BZOJ1017 树形DP

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2308  Solved: 919[Submit][S ...