Chisel | Arbitor

chisel3

Chisel3 的 GitHub 仓库中找到它的源代码:GitHub - chipsalliance/chisel: Chisel: A Modern Hardware Design Language

Chisel3文档地址:chisel_2.13 6.0.0-M2 javadoc (org.chipsalliance)

Arbiter

https://github.com/chipsalliance/chisel/blob/main/src/main/scala/chisel3/util/Arbiter.scala

Arbiter模块位于Chiel3的util包中,util包提供了一些常用的工具类和函数。如:

  • 数据结构,如Decoupled、Valid等。
  • FIFO和队列,如Queue、Pipe等。
  • 握手协议,如DecoupledIO、ValidIO等。
  • 时钟和复位,如:withClock、withReset等。
  • 多路选择,如Mux1H、MuxLookup等。

提供四种仲裁:

  • Arbiter,普通Arbiter,根据优先级选择,该模块里优先级按照索引从大到小排列。
  • RRArbiter,使用轮询调度算法的Arbiter,每次仲裁会确保下一次的授权比上一次的授权id大。
  • LockingArbiter
  • LockingRRArbiter

Arbiter

1、ArbiterIO类:

classArbiterIO[T <: Data](private val gen: T, val n: Int) extendsBundle{}

该类定义仲裁器的端口。参数gen数据类型的数据,n为输入数量。

val in = Flipped(Vec(n, Decoupled(gen)))

val out = Decoupled(gen)

val chosen = Output(UInt(log2Ceil(n).W))

Decoupled表示带有有效位(ready-valid)和数据的流式接口。

2、ArbiterCtrl

该方法根据请求的信号,计算出相应的一组控制信号。确定哪个输入信号有权访问资源。

具体:

  • 如果请求长度为0,则返回空的seq,表示没有请求。
  • 如果请求长度为1,则返回一个包含true值的seq,表示只有一个请求信号,该信号有权访问资源。
  • 如果请求长度大于1,使用.tail.init得到request去除第一个和最后一个元素外的所有元素,并使用scanLeft方法依次对这些元素执行或操作。该方法是对序列进行迭代操作,从request第一位开始,即request.head,每次计算都使用当前元素与前一次计算结果进行逻辑或运算。然后,.map对每一个元素取反。最后,序列前面加上true。计算结果是第一位和除第一位外的request第一个一的位置为一,其他位为0.

3、Arbiter

第一个请求始终仲裁成功,之后的请求根据valid值依次判断。

in.ready := g && io.out.ready

io.out.valid := !grant.last || io.in.last.valid

LockingArbiter

class LockingArbiter[T <: Data](gen: T, n: Int, count: Int, needsLock: Option[T => Bool] = None) extends LockingArbiterLike[T](gen, n, count, needsLock){}

参数包括:

  • gen:T(表示数据类型)
  • n:Int(表示输入的数量)
  • count:Int(锁定计数)
  • needsLock: Option[T => Bool] = None(根据需求来控制仲裁器的锁定行为)

带锁定的Arbiter会根据count计数器来进行条件分支的处理:

  • 如果count>1,则为锁定仲裁器。首先,会创建一个计数器lockCount和一个寄存器lockIdx来记录锁定的的输入端口。然后,根据根据wantsLock来确定是否进行锁定。满足锁定条件时,更新计数器和lockIdx。最后,锁定状态和授权信号来设置输入端口的ready状态,锁定的话就只赋予lockIdx值的端口输入ready。
  • count<1,则根据授权信号和io.out.ready来决定in.ready。

RRArbiter

lazy val是 Scala 语言中的一个特性,用于声明延迟计算的值。延迟计算意味着该值只有在需要时才会被计算,而不是立即计算。这样可以提高性能和效率,因为只有在真正需要使用该值时才进行计算,避免了不必要的计算开销。

1、RegEnable

RegEnable是chisel中的一个函数:

defRegEnable[T <: Data](next: T, enable: Bool): T

参数说明:

  • next:下一个时钟周期要写入寄存器的值,类型为T<:Data,表示Chisel的数据类型。
  • enable:使能信号,类型为bool。

函数功能:

  • 在时钟上升沿时,如果 enable 为真,则将 next 的值写入到寄存器中;否则保持原来的值不变。
  • 返回值为 T 类型,表示输出的寄存器值。

2、grantMask,通过比较索引值(0到n-1)和lastGrant来生成true或false。

3、validMask,使用zip将信号io.in和grantMask进行配对,然后通过map函数对配对组进行计算in.valid&&g。

仲裁按照此两个循环进行,第一个循环是保证在没有合适的validMask(i)时,选择一个valid值对应的i进行输出。正常来说是,validMask(i)来决定choice。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Chisel是一种用于硬件描述语言(HDL)的工具,可用于设计和验证硬件电路。要安装Chisel,首先需要在计算机上安装Scala编程语言和SBT构建工具。 首先,我们需要安装Scala。打开终端或命令提示符,并输入以下命令: ``` sudo apt-get update sudo apt-get install scala ``` 这将更新软件包列表并安装Scala。 接下来,我们需要安装SBT。继续在终端或命令提示符中输入以下命令: ``` echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list sudo apt-get update sudo apt-get install sbt ``` 这将添加SBT存储库并安装SBT。 一旦Scala和SBT安装完成,我们就可以开始安装Chisel了。打开终端或命令提示符,进入您希望安装Chisel的目录,并输入以下命令: ``` sbt new freechipsproject/chisel-template.g8 ``` 这将从Github下载Chisel模板。下载完成后,进入新创建的目录,并输入以下命令: ``` sbt run ``` 这将编译并运行Chisel项目。现在您已成功安装Chisel并可以开始使用它来设计和验证硬件电路了。 总结起来,安装Chisel需要先安装Scala和SBT,然后使用SBT下载Chisel模板并编译运行项目。 ### 回答2: Chisel是一种用于硬件描述语言(HDL)的开源工具,它允许我们使用高级别语言编写硬件电路并生成相应的Verilog代码。安装Chisel可以帮助我们更方便地进行硬件设计和开发。 首先,我们需要确保我们的计算机上已经安装了几个必要的软件和工具。这些包括Java Development Kit(JDK)、Scala和sbt(一个构建工具)。 然后,我们可以从Chisel的官方GitHub存储库中下载代码。我们可以通过克隆存储库或直接下载ZIP文件来获取它。 接下来,我们需要设置环境变量来引用下载的Chisel代码。我们可以通过在终端中执行以下命令来设置环境变量: export CHISEL_HOME=/path/to/chisel 确保将"/path/to/chisel"替换为实际存储Chisel代码的文件夹的路径。 然后,我们需要进入Chisel代码文件夹并构建工具链。我们可以在终端中执行以下命令: cd $CHISEL_HOME sbt compile 这将编译Chisel并生成运行所需的工具。 最后,我们可以通过运行一个示例项目来验证Chisel是否成功安装。我们可以在终端中执行以下命令: sbt "runMain edu.chisel.example.<ExampleClassName>" 确保将"<ExampleClassName>"替换为实际示例项目的类名。 如果一切顺利,我们将在终端中看到示例项目的输出。 总结来说,Chisel的安装过程涉及下载代码、设置环境变量、构建工具链,并验证安装是否成功。这样,我们就可以开始使用Chisel进行硬件设计和开发了。 ### 回答3: Chisel 安装指的是在计算机上安装并配置 Chisel 编程语言的过程。以下是关于 Chisel 安装的一些说明。 首先,要安装 Chisel,你需要确保你的计算机上已经安装了 Java Development Kit(JDK),因为 Chisel 是基于 Java 开发的。你可以从 Oracle 官方网站下载并安装最新版本的 JDK。 一旦你完成了 JDK 的安装,你可以开始安装 ChiselChisel 最简单的安装方法是通过 sbt(Simple Build Tool)进行。sbt 是用于构建和管理 Scala 项目的工具。你可以从 sbt 的官方网站下载并安装最新版本的 sbt。 当你完成了 sbt 的安装后,你可以创建一个 Chisel 项目。首先,你需要使用 sbt 命令行工具进入项目保存的目录。然后,你可以使用 "sbt new freechipsproject/chisel-template.g8" 命令来创建一个新的 Chisel 项目。 一旦项目创建成功,你可以进入项目文件夹并编辑 src/main/scala 目录下的 .scala 文件来编写 Chisel 代码。Chisel 提供了许多工具和库来帮助你创建硬件描述。 编写完代码后,你可以使用 sbt 命令来编译和运行你的 Chisel 项目。你可以使用 "sbt compile" 命令来编译项目,使用 "sbt run" 命令来运行项目。 总结来说,Chisel 的安装过程包括安装 JDK、安装 sbt、创建 Chisel 项目、编写 Chisel 代码以及使用 sbt 编译和运行项目。安装完成后,你就可以开始使用 Chisel 编程语言来创建硬件描述和进行硬件设计了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值