吃透Chisel语言.08.Chisel基础(五)——Wire、Reg和IO,以及如何理解Chisel生成硬件

Chisel基础(五)——Wire、Reg和IO,以及如何理解Chisel生成硬件

上一篇的结语中提到,UIntSIntBits都是Chisel类型,它们本身是不直接表示硬件的,只有把它们封装成为WireRegIO才会生成电路。这件事可以这么理解,数字逻辑电路是由连线、逻辑门、寄存器和输入输出(包括时钟和复位信号)等组成的,其中连线对应Wire,逻辑门对应运算符,寄存器对应Reg,输入输出对应IO。那么在Chisel中它们到底怎么使用呢?又如何理解Chisel生成电路呢?这一篇文章一起学习一下。

WireRegIO

在Chisel中,Wire用于表示组合逻辑,Reg用于表示寄存器(D-触发器的集合),而IO则用于表示一个模块的接口(比如某个具体的集成电路的引脚)。前面也提到,WireRegIO可以封装任何Chisel类型,当然也包括BundleVec

在Scala中,变量分为varval两种类型,前者是可变的,后者是不可变的。而在Chisel中,我们只需要使用val来描述电路,即不可变的Scala变量,比如:

val number = Wire(UInt())
val reg = Reg(SInt())

我们可以在声明后再将值或表达式赋值或重新赋值给WireRegIO,用到的Chisel操作符是:=

number := 10.U
reg := value - 3.U

这里显然和Scala中的赋值操作符=是不一样的。这两种操作符怎么用呢?很简单,在创建一个硬件对象的时候我们使用Scala操作符=,而在给已经存在的硬件对象赋值或重新赋值的时候,就使用Chisel操作符:=

组合逻辑值也是可以条件赋值的,但是需要在条件的每个分支都赋值。否则的话,会引入锁存器(latch),这是Chisel编译器不接受的。最好的办法就是在创建Wire的时候就给定一个默认值,因此,前面的代码这样写更好:

val number = WireDefault(10.U(4.W))

同理,之前提到过,Chisel会为信号和寄存器推断需要的位宽,但是最好还是在创建硬件对象的时候指定想要的位宽。在大多数场合,给寄存器一个已知的复位初始化值也是最好的:

val reg = RegInit(0.S(8.W))

RegInitWireDefault稍有不同,前者指的是复位时的值,而后者指的是默认连接。

至于IO,用于声明一个模块的接口,用法通常如下:

val io = IO(new Bundle {
    val in_a = Input(UInt(8.W))
    val out_b = Output(UInt(8.W))
})

IO()里面是个bundle的实例,bundle内是输入输出接口,分别用InputOutput封装。这里仅简单介绍,后面会展开讲述。

如何理解Chisel生成硬件

我们到现在为止,已经解除了一些Chisel的基本代码,看起来跟传统的编程语言比如C和Java这种差不多。但是,Chisel和其他硬件描述语言一样,确实是定义硬件组件的。区别在哪里呢?在软件中,代码是一行一行按顺序执行的,而在硬件中所有的代码行是并行执行的。

写Chisel的时候一定要牢记Chisel确实是生成硬件的。你可以想象,或者在纸上画,一个个由我们写的Chisel电路描述生成的模块。每次创建一个组件,都会添加一个硬件,每条赋值语句,都会生成一个门电路和/或触发器。

那么从技术上来讲,Chisel在执行代码的时候,是执行的Scala程序,然后通过执行Chisel语句,集合(collect)所有的硬件组件并把这些节点连接起来。这些硬件节点构成的网络就是Chisel生成的硬件,可以生成为Verilog代码用于ASIC或FPGA综合,也可以用Chisel tester进行测试。这些硬件节点构成的网络就是完全并行执行的

对于之前写软件的人来讲理解这种并行执行可能有点困难,因为它跟软件的并行程序还不一样,硬件就是天然并行的,不需要把程序分配给各个线程,也不需要为线程间通信搞什么加锁,就是很简单的并行执行,电流在硬件的每一部分同时运转,仅此而已。

结语

刚接触硬件描述语言的时候,我也很困惑,经常用写软件的思维来写硬件,最后写完的东西完全不是想象中的样子。只能把写软件的思维收一收,简单地把写硬件理解为搭积木,我们要做的工作就是把它们有逻辑地连接起来。

到目前为止,我们还没运行过代码,只是学习了基础的Chisel语法。下一篇文章,我们会学习如何利用sbt构建我们的Chisel项目并运行,同时也简单介绍Chisel的工具流,敬请期待。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值