chisel常用函数备忘录

编码器

PriorityEncoder

PriorityEncoder 是 Chisel 中一个用于优先编码的函数。它接受一个布尔向量,返回其优先级最高(即索引最小)的高位的索引值。其常见用法包括处理多路选择器、优先级调度等场景。

点击查看代码
import chisel3._
import chisel3.util._

class PriorityEncoderExample extends Module {
  val io = IO(new Bundle {
    val in  = Input(UInt(8.W))  // 8位输入
    val out = Output(UInt(3.W)) // 输出优先级编码的索引
  })

  io.out := PriorityEncoder(io.in)
}

  • 输入 io.in = "b00100100".U 时:
    • PriorityEncoder 返回值是 2(因为第 2 位的 1 是优先级最高的高位)。

PriorityEncoderOH

PriorityEncoderOH 是 Chisel 提供的一个优先编码器的变体,与 PriorityEncoder 类似,但输出的是 One-Hot 编码。这意味着输出的结果中只有一个位是 1,表示输入向量中优先级最高的高位,而其他位为 0。

点击查看代码
import chisel3._
import chisel3.util._

class PriorityEncoderOHExample extends Module {
  val io = IO(new Bundle {
    val in  = Input(UInt(8.W))  // 8 位输入
    val out = Output(UInt(8.W)) // 输出 One-Hot 编码
  })

  io.out := PriorityEncoderOH(io.in)
}

输入和输出示例如下:

  • 输入 io.in = "b00100100".U 时:
    • PriorityEncoderOH 返回 0b00000100.U(表示索引 2)。
  • 输入 io.in = "b00000000".U 时:
    • 返回 0b00000000.U(没有优先级高的位)。

仲裁器

Arbiter

Arbiter 是 Chisel 中一个用于仲裁多个请求(requests)的模块。它会根据指定的优先级(默认为固定优先级)选择一个请求,将其授予(grant),同时输出该请求对应的数据。Arbiter 的常见用途是资源共享场景,例如多个模块竞争一个总线或处理器的访问权。

Arbiter 的工作原理
输入仲裁:

  • 根据优先级选择一个有效请求(valid 为真)。
  • 默认优先级是固定的,从编号 0 开始,编号越小优先级越高。
    输出:
  • 输出被授予的请求数据到 io.out.bits。
  • 将授予的请求编号输出到 io.chosen。

示例代码:

点击查看代码
import chisel3._
import chisel3.util._

class ArbiterExample extends Module {
  val io = IO(new Bundle {
    val reqs = Input(Vec(4, DecoupledIO(UInt(8.W)))) // 4 个输入请求
    val grant = Output(DecoupledIO(UInt(8.W)))      // 输出授予的请求
    val chosen = Output(UInt(2.W))                 // 授予请求的索引
  })

  val arbiter = Module(new Arbiter(UInt(8.W), 4))  // 4 路仲裁器

  // 连接输入请求到 Arbiter
  arbiter.io.in <> io.reqs

  // 连接 Arbiter 输出
  io.grant <> arbiter.io.out
  io.chosen := arbiter.io.chosen
}

  • 如果输入请求为:
点击查看代码
reqs(0).valid = true,  reqs(0).bits = 42
reqs(1).valid = false
reqs(2).valid = true,  reqs(2).bits = 100
reqs(3).valid = true,  reqs(3).bits = 7

则:

  • 输出 grant.bits = 42(优先级最高的请求是第 0 路)。
  • 输出 chosen = 0。

动态优先级(RoundRobinArbiter)

与Arbiter类似,会轮流授予每个请求优先权。

队列

posted @ 2024-11-26 22:36  史茗宇  阅读(100)  评论(0)    收藏  举报