凿子3.功能模块Mux4

2023-12-24

我正在按照文档学习 Chisel在 Github 上 https://github.com/ucb-bar/chisel3/wiki/Short%20Users%20Guide%20to%20Chisel

到目前为止,一切都完美无缺。但我还是卡在了第13章《功能模块创建》 https://github.com/ucb-bar/chisel3/wiki/Functional%20Module%20Creation

I 无法让代码工作。我在 chisel-template-project 的副本中创建了所有 .scala 类。这是我写/复制来创建的具有可变位宽的 Mux4:

/凿子模板/src/main/scala/Mux4.scala

import Chisel._

class Mux4(w: Int) extends Module {
  val io = IO(new Bundle {
        val sel = UInt(INPUT, 2)
        val in0 = UInt(INPUT, w)
        val in1 = UInt(INPUT, w)
        val in2 = UInt(INPUT, w)
        val in3 = UInt(INPUT, w)
        val out = UInt(OUTPUT, w)
  })

  io.out := Mux2(io.sel(1), 
                    Mux2(io.sel(0), io.in0, io.in1),
                    Mux2(io.sel(0), io.in2, io.in3))
}


class Mux2(w: Int) extends Module {
  val io = IO(new Bundle {
        val sel = Bool(INPUT)
        val in0 = UInt(INPUT, w)
        val in1 = UInt(INPUT, w)
        val out = UInt(OUTPUT, w)
  })

  when(io.sel) {
    io.out := io.in0
  }.otherwise {
    io.out := io.in1
  }
}


object Mux2 {
  def apply(sel: UInt, in0: UInt, in1: UInt): UInt = {
    val m = new Mux2(in0.getWidth) 
    m.io.sel := sel.toBool()
    m.io.in0 := in0
    m.io.in1 := in1
    m.io.out
  }
}

我写的 Tester scala 类:

/凿子模板/src/test/scala/Mux4Test.scala

import Chisel.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}

class Mux4Test(c: Mux4) extends PeekPokeTester(c) {

      val sel = 3
      val (in0, in1, in2, in3) = (5, 7, 11, 15)

      poke(c.io.sel, sel)
      poke(c.io.in0, in0)
      poke(c.io.in1, in1)
      poke(c.io.in2, in2)
      poke(c.io.in3, in3)
      step(1)
      System.out.println("Circuit: "+peek(c.io.out)
          +"  Expected: "+TestMux4.result(sel, in0, in1, in2, in3))
}

object TestMux4{
  def result(sel: Int, in0: Int, in1: Int, in2: Int, in3: Int): Int = {
    val out = sel match{
      case 0 => in3
      case 1 => in2
      case 2 => in1
      case 3 => in0
    }
    out
  }
}

class Mux4Tester extends ChiselFlatSpec {
  behavior of "Mux4"
  backends foreach {backend =>
    it should s"do Mux4 $backend" in {
      Driver(() => new Mux4(4), backend)(c => new Mux4Test(c)) should be (true)
    }
  }
}

重要的部分来自output

STEP 0 -> 1
Circuit: 0  Expected: 5

Mux4 类(Circuit)返回 0 作为输出,而它应该是 5,因为选择过程如下:

00 -> io.out = in3 = 15

01 -> io.out = 输入2 = 11

10 -> io.out = 输入1 = 7

11 -> io.out = in0 = 5

在我写的 Mux4Test.scala 类中值选择 = 3。它的位表示是11因此我期望in0 = 5.

我哪里错了?


感谢您对凿子的兴趣!

我运行了你的示例,在挠头一段时间后我发现了问题:当你实例化 Chisel 模块时,你需要确保将其包装在Module(...)(编辑:维基上的代码省略了这个包装器。这已被修复)。因此,对象 Mux2 应该是:

object Mux2 {
  def apply(sel: UInt, in0: UInt, in1: UInt): UInt = {
    val m = Module(new Mux2(in0.getWidth)) // <- See Here
    m.io.sel := sel.toBool()
    m.io.in0 := in0
    m.io.in1 := in1
    m.io.out
  }
}

通过此更改,代码看起来可以工作了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

凿子3.功能模块Mux4 的相关文章

随机推荐

  • 在 Woocommerce 3 中的客户电子邮件通知上设置跟踪号码链接

    我已经设法将其整合在一起 现在我正在尝试将输入到自定义字段 保存到订单 中的数字链接到订单电子邮件中 这是代码 create the metabox add action add meta boxes bdev add postnord m
  • 从向量中的每个字符串中提取前 N 个字符

    我有一个字符串向量 v string lt c abc beb lol heh hah 有没有办法从向量中提取前 N 个元素 所以在上面如果我想提取前 2 个 我会得到 ab be lo he ha 或者我必须做一个循环并使用substr功
  • readonly =“true”和readonly =“readonly”之间有什么区别?

    有什么区别
  • MediaCodec 从 RTSP 解码 AAC 音频块并播放

    我正在接收包含由以下编码的 aac 音频块的 rtp 数据包libvo aacenc 44100hz 128kbps 2ch 来自 FFServer 实例 我正在尝试在 Android 中使用 MediaCodec 对它们进行一一解码 并在
  • Java 执行流程 - 重写的方法比构造函数先执行

    我在同一个 java 文件中有以下代码 import javax swing SwingUtilities import java io File public class MainClass2 public static void mai
  • 为什么在 Python 中我需要复制类实例而不是其他对象类型?

    当我需要在 Python 中显式复制一个对象以便在不改变原始对象的情况下进行更改时 我有点困惑 这Python 文档页面 https docs python org 3 4 library copy html没有太多细节 只是说 赋值语句不
  • 无法初始化视频获取属性(Matlab 中的 videoreader)

    我可以在 Windows 中使用 Matlab 读取一个视频 但无法在 ubuntu 14 04 中从 Matlab 读取相同的视频 错误如下 gt gt aa VideoReader s12 32 xvid avi Error using
  • Flutter插件开发未解决参考:io

    这是我第一次尝试创建一个flutter插件 我从android studio创建了flutter插件项目并且运行良好 当我尝试为android添加平台特定代码时我遇到了一些问题 在同一个项目中平台特定代码编辑几乎死了 没有掉毛 我在andr
  • .NET 对象大小限制

    NET 中的对象似乎有 2 GB 的大小限制 如何在 64 位下运行 Fsi exe https stackoverflow com questions 4284381 how to run fsi exe in 64 bits 有解决这个
  • 如何对 WCF 服务进行单元测试?

    我们有一大堆 DLL 可以让我们访问数据库以及其他应用程序和服务 我们用一个薄的 WCF 服务层包装了这些 DLL 然后我们的客户端可以使用它 我有点不确定如何编写仅测试 WCF 服务层的单元测试 我应该只为 DLL 编写单元测试 为 WC
  • 写入node-fetch返回的流

    自述文件包含以下代码作为编写获取的文件的示例 fetch https assets cdn github com images modules logos page Octocat png then res gt const dest fs
  • 连续获取 Paramiko SSH exec_command 的输出

    我正在使用 paramiko 在远程计算机上通过 ssh 执行长时间运行的 python 脚本 工作起来就像一个魅力 到目前为止没有任何问题 不幸的是 stdout 分别是stderr 仅在脚本完成后显示 但是 由于执行时间的原因 我更喜欢
  • 在父进程中捕获子进程异常

    我正在创建多个单独运行爬虫的进程 我想确保如果爬虫进程中有一些异常 我能够在父进程中捕获它 下面是进程创建代码 try caching process Process target run crawler process args Conf
  • 停止执行 ASP.NET 应用程序

    在我的 Application Start 方法中 当某些条件不满足时 如何停止 ASP NET 应用程序的执行 抛出异常似乎不起作用 我认为这是不可能的 即使您可以 中止 启动 下次尝试从该站点访问 URL 时也会尝试再次启动它 也许静态
  • Vue 中的 TreeView 未正确渲染子文件夹内容

    我正在尝试建立一个TreeView在 Vue 中从头开始 This https codesandbox io s optimistic wilbur 8dreq到目前为止是我的代码 我遇到的第一个问题是子文件夹的内容 例如child fol
  • CakePHP 2.0 账户激活后自动登录

    我正在研究我们新项目的用户管理组件 计划是 用户使用最少量的帐户数据 用户名 密码 电子邮件 在页面上注册 用户收到一封电子邮件 其中包含用于激活帐户的激活链接 用户点击链接并激活他的帐户 系统在激活后自动登录用户 并将其重定向到带有帐户信
  • 如何在页面加载时动态更改aspx页面的标题

    我有一组 ASPX 页面 其中每个页面都有不同的标题 但我想为没有标题的页面设置默认标题 默认标题必须是可配置的 如果这是经典的 ASP NET 不是 MVC 并且您正在使用MasterPage然后你可以设置默认标题Page Load事件在
  • PHP sqlsrv 查询数据库

    我从 MySQL 迁移到 MS SQL Server 并尝试从例程表中获取所有数据 我已连接 但不确定如何使用 sqlsrv 获取数据 这就是我已经走了多远 conn array array UID gt sa PWD gt root Da
  • 在选中列表框中创建选中项目的字符串数组

    如何使用 foreach 循环 或任何其他方式 创建一个包含 checklistbox 中选中项目的数组 我无法知道列表中的项目数量 假设您使用 3 5 或更高版本 object items lb CheckedItems OfType T
  • 凿子3.功能模块Mux4

    我正在按照文档学习 Chisel在 Github 上 https github com ucb bar chisel3 wiki Short 20Users 20Guide 20to 20Chisel 到目前为止 一切都完美无缺 但我还是卡