【Chisel入门——数据类型与操作符号】

2023-11-01


前言

前面的部分简单介绍了Chisel——新型敏捷硬件开发语言,也简单说明了开发环境部署以及示例项目的运行。接下来学习Chisel入门,数据类型与操作符号。

对于操作系统要求较低,IDEA适用于多个平台,但在验证阶段会根据不同的操作系统适配不同的EDA工具。

操作系统:Linux、mac OS、Windows 10
开发工具:IDEA、CLion、Verilator、GTKWave


Chisel开发环境部署

安装步骤

  1. 安装SBT

SBT(Simple Build Tool,简单构造工具)是一种用于构建 Scala 项目的构建工具。SBT 具有以下功能:

  1. 依赖管理:SBT 可以管理项目所需的依赖库和插件。它使用类似于 Maven 的方式来定义和解析依赖关系,可以自动下载和管理所需的库。

  2. 构建定义:通过 SBT 的构建定义文件(通常是 build.sbt),可以定义项目的结构、编译选项、测试配置等。这些构建定义可以用于编译、运行和测试项目。

  3. 任务管理:SBT 具有丰富的任务管理功能,可以定义和执行各种任务。例如,可以使用 SBT 执行编译、运行、测试、打包等操作。

  4. 插件支持:SBT 允许使用插件来扩展构建过程和功能。可以使用现有的插件或编写自定义插件,以满足特定项目的需求。

SBT 是 Scala 社区广泛使用的构建工具,它简化了 Scala 项目的构建和管理过程,并提供了强大的工具和功能,以提高开发效率。

使用brew、apt-get安装均可

安装后查看SBT

MacBook-Pro ~ % sbt sbtVersion

[info] welcome to sbt 1.8.3 (Homebrew Java 20.0.1)
[info] loading global plugins from /Users/.sbt/1.0/plugins
[info] loading project definition from /Users/project
[info] set current project to zhuketong (in build file:/Users/)
[info] 1.8.3
  1. 安装Git

Git 是一个分布式版本控制系统,用于跟踪和管理文件的变化。现已成为开源软件开发中最流行的版本控制系统之一。

Git 的主要功能包括:

  • 版本控制:Git 可以跟踪文件的所有修改历史,并记录每个版本的变化。这使得开发团队可以轻松地查看、比较和恢复文件的不同版本。

  • 分支管理:Git 具有强大的分支管理功能,允许用户创建、合并和删除分支。这使得多人协作开发更加灵活,并能够同时进行多个功能的开发和测试。

  • 协作与远程仓库:Git 支持与远程仓库的交互,可以将本地仓库的变更推送到远程仓库,或者从远程仓库拉取最新的代码。这样多人协作开发时可以方便地分享和同步代码。

  • 代码审查:Git 提供了代码审查的功能,开发人员可以轻松地在不影响主代码库的情况下创建和管理代码审查请求,以便团队成员对代码进行评审和讨论。

  • 撤销和修改:Git 允许用户撤销修改并回滚到之前的版本。它还提供了修改历史记录、修改合并和修改冲突解决等功能,帮助开发人员更好地管理代码变更。

MacBook-Pro ~ % git -v
git version 2.40.1
  1. 安装Verilator

Verilator 是一个开源的硬件描述语言(HDL)仿真和验证工具,用于对 Verilog 和 SystemVerilog 代码进行静态分析和编译,并生成高性能的仿真模型。

MacBook-Pro ~ % verilator -version 
Verilator 5.006 2023-01-22 rev UNKNOWN.REV

Windows平台可以使用其他仿真工具:

  • ModelSim:ModelSim 是 Mentor Graphics 公司推出的一款广泛使用的 HDL 仿真器。它支持 Verilog和 VHDL 两种硬件描述语言,并提供了丰富的仿真和调试功能,如波形查看、代码覆盖率分析等。
  • Xilinx Vivado Simulator:Xilinx Vivado 是 Xilinx 公司的一套集成开发环境,其中包含了 Vivado Simulator 作为默认的仿真工具。Vivado Simulator 支持Verilog、VHDL 和 SystemVerilog,具有较好的性能和调试能力。
  1. 安装g++

Verilator 是一个基于 C++ 的开源项目,用于将 Verilog 代码转换为高速模拟器。在编译 Verilator 时,它会使用 g++ 编译器来处理 C++ 代码,并生成可执行的仿真器。

MacBook-Pro ~ % g++ -v
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
  1. 安装GTKWave

GTKWave 是一个开源的波形查看器,用于显示和分析数字电路仿真的波形数据。它支持多种不同的波形文件格式,包括 VCD (Value Change Dump)、LXT、FST 等,可以在图形界面中以直观的方式展示波形信号的变化。

Windows下可以使用ModelSim、Vivado等工具


环境测试

  1. 项目部署

在第一部分已经导入了git项目,接下来在此基础上进行开发。(没有完成项目导入的读者可以查看本专栏第一篇博文)

> test
[IJ]test
[info] compiling 1 Scala source to /Users/IdeaProjects/chisel-template-main/target/scala-2.13/classes ...
[info] done compiling
[info] compiling 2 Scala sources to /Users/IdeaProjects/chisel-template-main/target/scala-2.13/test-classes ...
[info] done compiling
[info] GCDSpec:
[info] - Gcd should calculate proper greatest common denominator
[info] Run completed in 2 seconds, 584 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 7 s, completed 2023-5-31 15:04:31
  1. 编写代码

/chisel-template-main/src/main/scala目录下创建文件 AND.scala,以下为文件内容:

import chisel3._

class AND extends RawModule {
  val io = IO(new Bundle() {
    val a = Input(UInt(1.W))
    val b = Input(UInt(1.W))
    val c = Output(UInt(1.W))
  })
  io.c := io.a & io.b
}

/chisel-template-main/src/test/scala目录下创建文件 ADNtest.scala,以下为文件内容:

import chisel3.stage.{ChiselGeneratorAnnotation, ChiselStage}

object testMain extends App{
  (new ChiselStage).execute(Array("--target-dir","generated/and"),Seq(ChiselGeneratorAnnotation(()=>new AND)))
}
  1. 运行代码

在testMain处运行代码,项目目录/chisel-template-main/generated/and中生成文件AND.v,内容如下:

module AND(
  input   io_a,
  input   io_b,
  output  io_c
);
  assign io_c = io_a & io_b;
endmodule
  1. 仿真代码

使用CLion编写main.cpp仿真驱动代码,项目名为 simulate,同时将 .v 文件放置于同一目录结构下。仿真代码如下:

#include "VAND.h"  // Verilator生成的头文件

#include <iostream>
#include <verilated.h>
#include <verilated_vcd_c.h>

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);

    // 实例化模块
    VAND* andModule = new VAND;

    // 初始化仿真时钟
    andModule->io_a = 0;
    andModule->io_b = 0;

    // 创建波形文件
    Verilated::traceEverOn(true);
    VerilatedVcdC* vcd = new VerilatedVcdC;
    andModule->trace(vcd, 99);
    vcd->open("sim.vcd");

    // 运行仿真
    for (int i = 0; i < 10; ++i) {
        // 更新输入信号
        andModule->io_a = i % 2;
        andModule->io_b = (i + 1) % 2;

        // 执行一个时钟周期
        andModule->eval();

        // 记录波形
        vcd->dump(i);

        // 输出结果
        std::cout << "io_c = " << andModule->io_c << std::endl;
    }

    // 关闭波形文件
    vcd->close();

    // 清理资源
    andModule->final();
    delete andModule;
    delete vcd;

    return 0;
}

注意:VAND.h 头文件是后续执行Verilator命令生成的,若缺失其他头文件自行填充即可

例如:缺失 verilated_vcd_c.h 头文件,在 CMakeLists.txt 添加如下内容

include_directories(/opt/homebrew/Cellar/verilator/5.006/share/verilator/include)

include_directories(obj_dir)
  1. 编译代码

在终端中运行命令

MacBook-Pro simulate % verilator -Wall --cc -trace AND.v --exe main.cpp

目录结构中会产生 obj_dir 文件夹

生成编译仿真模型:

MacBook-Pro simulate % make -C obj_dir -j -f VAND.mk VAND

运行测试代码:

MacBook-Pro simulate % ./obj_dir/VAND

在目录结构中会生成 sim.vcd 波形文件

  1. GTKWave波形图

在终端中执行如下命令,打开GTKWave查看波形图

MacBook-Pro simulate % gtkwave sim.vcd

在这里插入图片描述


实验环境问题说明

实验环境中涉及到的工具繁多,初学者可能会被各种环境问题绊倒,但所幸macOS、Linux中集成的工具包功能强大,能解决多数问题。而对于环境配置问题大部分也可以在网络中找到答案,读者可以查阅资料解决相关问题。

欢迎读者在评论区互动交流,同时补充实验过程未能提及的细节。


数据类型

UInt、SInt、Bool

UIntSIntBool 是表示不同数据类型的类,用于在硬件设计中表示无符号整数、有符号整数和布尔值。

  1. UInt(无符号整数):用于表示非负整数。可以通过指定位宽来创建 UInt 变量。
  • 用于表示非负整数,适用于计数器、地址、数据宽度等无符号整数值的表示。
    • 可以通过指定位宽来创建 UInt 变量。
    • 支持常见的算术和逻辑运算,如加法、减法、乘法、除法、与运算、或运算、位移等。
    • 可以使用 := 操作符进行赋值,也可以使用 Wire 来声明和连接 UInt 信号。
   val myUInt: UInt = UInt(8.W) // 创建一个 8 位无符号整数变量
  1. SInt(有符号整数):用于表示有符号整数。和 UInt 类似,可以通过指定位宽来创建 SInt 变量。
  • 用于表示有符号整数,适用于需要表示正负整数值的场景。
    • 可以通过指定位宽来创建 SInt 变量。
    • 支持常见的算术和逻辑运算,如加法、减法、乘法、除法、与运算、或运算、位移等。
    • 可以使用 := 操作符进行赋值,也可以使用 Wire 来声明和连接 SInt 信号。
  val mySInt: SInt = SInt(8.W) // 创建一个 8 位有符号整数变量
  1. Bool(布尔值):用于表示逻辑值,即 true 或 false。
  • 用于表示逻辑值,即 true 或 false。
  • 可以通过 Bool() 创建布尔值变量。
  • 支持常见的逻辑运算,如与运算、或运算、非运算、异或运算等。
  • 可以使用 := 操作符进行赋值,也可以使用 Wire 来声明和连接 Bool 信号。
   val myBool: Bool = Bool() // 创建一个布尔值变量

Vec[T]

Vec[T] 是一种表示具有固定大小的向量(数组)的数据类型,其中 T 是元素的类型。Vec[T] 可以用于在硬件设计中表示具有固定长度的数据集合。

以下是 Vec[T] 的一些常见用法和特性:

  1. 声明 Vec[T] 变量:
   val myVec: Vec[UInt] = Vec(Seq.fill(4)(0.U(8.W))) 
   // 声明一个具有 4 个 8 位无符号整数的向量
  1. 获取 Vec[T] 的长度:
   val length: Int = myVec.length // 获取向量的长度,这里为 4
  1. 访问 Vec[T] 中的元素:
   val element: UInt = myVec(0) // 访问向量中索引为 0 的元素
  1. 更新 Vec[T] 中的元素:
   myVec(1) := 10.U // 更新向量中索引为 1 的元素为 10
  1. 使用 Vec[T] 进行循环操作:
   for (i <- 0 until myVec.length) {
     // 对向量中的每个元素执行操作
     // 例如:myVec(i) := myVec(i) + 1.U
   }

Bundle

Bundle 是一种数据类型,用于组合多个信号或数据成为一个复合类型。它类似于结构体或记录,在硬件设计中用于组织和传递多个相关的信号。

使用 Bundle,可以创建自定义的数据结构,其中包含多个字段或成员,每个字段可以是不同的数据类型。通过将相关信号组合到一个 Bundle 中,可以更好地组织和管理设计中的复杂信号关系。

以下是使用 Bundle 的常见用法:

  1. 定义 Bundle 类型:
   import chisel3._

   class MyBundle extends Bundle {
     val field1 = UInt(8.W)
     val field2 = Bool()
     val field3 = UInt(4.W)
   }

在上述示例中,我们定义了一个名为 MyBundleBundle 类型,其中包含了三个字段:field1(8 位无符号整数)、field2(布尔值)和 field3(4 位无符号整数)。

  1. 创建 Bundle 实例:
   val myBundle = Wire(new MyBundle)

通过使用 new 关键字创建一个 MyBundle 的实例,可以声明一个 myBundle 变量来表示该 Bundle

  1. 访问 Bundle 字段:
   myBundle.field1 := 42.U
   myBundle.field2 := true.B
   myBundle.field3 := 8.U

可以使用点运算符访问 Bundle 的各个字段,并对其进行赋值。


操作符

下表列出了一些常用的 Chisel 操作符及其在硬件设计中的作用:

操作符 描述
:= 用于信号赋值
:= (连接符号) 用于连接多个信号或连接信号和常数
Wire 声明一个信号变量
Reg 声明一个寄存器变量
Module 声明一个硬件模块
when / elsewhen / otherwise 用于条件语句的建立
printf 在仿真中打印调试信息
Vec 声明一个向量(数组)
Cat 连接多个信号或常数形成一个更大的信号
RegNext 在时钟边沿将当前值传递给下一个时钟周期的寄存器
Mux 用于多路选择
valid / bits 用于处理带有效性和数据的接口
WireDefault 设置信号的默认值
Fill 复制一个信号多次以形成更大的信号
Counter 声明一个计数器
Switch / Case 用于多路选择的建立
MuxCase 用于多路选择的建立(更灵活的版本)
PriorityMux 用于优先级多路选择
OHToUInt 用于将单热编码转换为无符号整数
UIntToOH 用于将无符号整数转换为单热编码

下表列出了一些常用的 Chisel 运算符及其在硬件设计中的作用:

位运算符 描述
& 位与运算符,对两个信号执行位与操作
| 位或运算符,对两个信号执行位或操作
^ 位异或运算符,对两个信号执行位异或操作
~ 取反运算符,对信号执行位取反操作
<< 左移运算符,将信号向左移动指定的位数
>> 右移运算符,将信号向右移动指定的位数
<< UInt 无符号左移运算符,将信号向左移动指定的位数
>> UInt 无符号右移运算符,将信号向右移动指定的位数
<< SInt 有符号左移运算符,将信号向左移动指定的位数
>> SInt 有符号右移运算符,将信号向右移动指定的位数
缩减位运算符 描述
& 缩减位与运算符,对位向量执行位与操作并缩减为单个位
| 缩减位或运算符,对位向量执行位或操作并缩减为单个位
^ 缩减位异或运算符,对位向量执行位异或操作并缩减为单个位
~& 缩减位与非运算符,对位向量执行位与非操作并缩减为单个位
~| 缩减位或非运算符,对位向量执行位或非操作并缩减为单个位
~^ 缩减位异或非运算符,对位向量执行位异或非操作并缩减为单个位
比较运算符 描述
=== 等于运算符,用于比较两个信号或数据是否相等
=/= 不等于运算符,用于比较两个信号或数据是否不相等
< 小于运算符,用于比较两个信号或数据的大小关系
<= 小于等于运算符,用于比较两个信号或数据的大小关系
> 大于运算符,用于比较两个信号或数据的大小关系
>= 大于等于运算符,用于比较两个信号或数据的大小关系
移位运算符 描述
<< 左移运算符,将信号或数据向左移动指定的位数
>> 右移运算符,将信号或数据向右移动指定的位数
<< UInt 无符号左移运算符,将信号或数据向左移动指定的位数
>> UInt 无符号右移运算符,将信号或数据向右移动指定的位数
<< SInt 有符号左移运算符,将信号或数据向左移动指定的位数
>> SInt 有符号右移运算符,将信号或数据向右移动指定的位数
部分位运算符 描述
val t = a(n) 抽取第 n 位
val t = a(m,n) 抽取第 n ~ m 位
Fill(n: Int, value: UInt): UInt 接受两个参数,n 表示生成的向量的位数,value 表示要填充的值。
Cat(vals: Seq[Data]): UInt 表示将所有输入信号按照顺序连接起来的结果

总结

学习Chisel设计硬件的开发过程,从环境部署到编译运行,再到模拟仿真,其中细节甚多,且都是不可避免的步骤,今后的实验中也需要反复进行这些步骤,所以针对过程中产生的问题要及时发现解决,积累经验。

此外也了解了Chisel硬件开发的基本数据类型与操作符运行,为以后的开发设计完成铺垫。

本文到此结束

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

【Chisel入门——数据类型与操作符号】 的相关文章

随机推荐

  • R语言学习:数据结构5-因子

    因子 factor 是用来处理分类数据的 分类数据又分为有序和无序 有序 年级 低中高 性别 男女 整数向量 标签label 因子优于整数向量 在线性和线性模型中经常会用到 创建因子 基线水平 factor x lt factor c fe
  • taro安装过程出现的问题

    正常安装流程 安装命令 npm install g tarojs cli 创建项目 taro init 文件名 安装异常 清除缓存 npm cache clean force 或 npm cache verify 使用淘宝镜像 cnpm i
  • uni app 录音结束监听_Taro vs uni-app选型对比

    公司新产品要求发布到各家小程序 最近研究对比了社区主流的几家小程序开发框架 独坑不如拉人众坑 分享给各位 欢迎和我一起入坑 背景 最近老板不知怎的很重视各种小程序平台 感觉要靠小程序完成今年大半kpi 产品和运营自然找我们要方案 一方面要快
  • 海思3559A上编译FFmpeg源码操作步骤

    1 从https github com FFmpeg FFmpeg releases 下载你需要的版本 2 因为ffmpeg编译选项较多 为了更方便的了解有哪些选项 可将编译选项写入到一个文本文件configure help txt中 执行
  • 在 Python 中逐行打印字典的项目

    Python 中逐行打印字典的项目 使用 dict items 方法获取字典项目的视图 使用 for 循环遍历视图 使用 print 函数逐行打印字典的项目 my dict id 1 name jiyik age 30 for key va
  • hive 压缩编码

    文章目录 1 hadoop 压缩编码 1 1 MR支持的压缩编码 2 编码 解码器 3 压缩性能的比较 4 压缩配置参数 2 hive压缩编码 2 1 如何查看hive支持的压缩 2 1 hive编码的选择 2 2 配置 1 hadoop
  • 解决问题Caused by: java.net.UnknownHostException

    在Java中 java net UnknownHostException 异常表示无法解析主机名 这意味着你尝试连接的主机名无法解析为 IP 地址 可能的原因有 主机名错误 请确保输入的主机名正确 网络连接问题 请检查网络是否连接正常 DN
  • Maven的安装以及环境的配置

    一 准备工作 1 确定电脑上已经成功安装jdk7 0以上版本 2 win10操作系统 win7操作系统 3 maven安装包 下载地址 http maven apache org download cgi 二 解压Maven安装包 在上述地
  • Django连接数据库出错

    pymysql可能出现的版本不匹配问题 第一个问题 File D virtualenv wx lib site packages django db backends mysql base py line 36 in
  • 最新Tesseract-OCR源码编译1——leptonica编译

    上次写了Tesseract OCR 3 02命令行程序的简单使用 同时官网上给出了3 02版本基于VS2008平台的编译工程 但对于最新源码只是说了在VS2015 3 05 和VS2013 3 04 的编译 还是英文的 且网上关于最新源码的
  • iOS各版本发布时间和特点

    iOS各版本发布时间和特点 iOS9 发布时间2015年6月9日 特性 更新于开发的内容 1 iOS9系统发送的网络请求将统一使用HTTPs 将不再默认使用HTTP等不安全的网络协议 而默认采用TLS 1 2 服务器因此需要更新 以解析相关
  • errno 104:connetction reset by peer的错误分析

    https blog csdn net alibo2008 article details 45694845 errno 104错误表明你在对一个对端socket已经关闭的的连接调用write或send方法 在这种情况下 调用write或s
  • Meta为全天候AR眼镜设计了AI系统的八大指导方针

    众所周知 Meta不仅局限在Quest这类VR头显上 同时还在打造更轻量化的AR眼镜 目标就是让产品更好的融入到人们的日常生活中去 除了硬件上轻量化以外 在功能和交互体验上也至关重要 例如自然交互方式 比如手势输入 以及AI视觉助手等 这其
  • Ros中可视化工具rqt 命令

    rqt工具箱可视为ROS数据的界面调试工具 rosrun rqt 按tab键 可以查看所有的rqt工具 以下介绍为常用的命令 目录 1 rqt tf tree 2 rqt graph 3 rqt plot 4 rqt topic 1 rqt
  • vue-cli 方式创建 uni-app 项目(支持快捷键)

    文章目录 1 前言 2 创建 uni app 3 删除多余依赖 4 支持快捷键 5 安装 uni ui 及 sass 6 配置 easycom 7 运行 1 前言 由于习惯了 VSCode 的使用 本着快速交付 不需要转换开发思维 不需要更
  • 跟ChatGPT同源插件,专为测试人的开放,快来看看吧

    3 月 23 日 OpenAI 又投出了一枚重磅炸弹 为 ChatGPT 推出插件系统 此举意味着 ChatGPT 将迎来 APP Store 时刻 也就是围绕它的能力 形成一个开发者生态 打造出基于 AI 的 操作系统 插件系统将为 Ch
  • [知识图谱实战篇] 八.HTML+D3绘制时间轴线及显示实体

    前面作者讲解了很多知识图谱原理知识 包括知识图谱相关技术 Neo4j绘制关系图谱等 但仍缺少一个系统全面的实例 为了加深自己对知识图谱构建的认识 为后续创建贵州旅游知识图谱打下基础 作者深入学习了张宏伦老师的网易云课程 星球系列电影 并结合
  • Linux系统版本信息查看

    一 查看Linux内核版本命令 方法1 cat proc version root localhost cat proc version Linux version 3 10 0 957 el7 x86 64 mockbuild kbuil
  • 型号不同的计算机内存条可以通用么,笔记本内存条和台式机通用吗

    电脑分为笔记本和台式机 这两者里面都有一个很重要的部件就是内存条 虽然作用都是相同的 但两者却是不一样的 那么笔记本内存条和台式机通用吗 答案是不可以 下面小编会给大家详细介绍不能通用的原因 以及笔记本内存条怎么装 看型号等等问题 笔记本内
  • 【Chisel入门——数据类型与操作符号】

    文章目录 前言 Chisel开发环境部署 安装步骤 环境测试 实验环境问题说明 数据类型 UInt SInt Bool Vec T Bundle 操作符 总结 前言 前面的部分简单介绍了Chisel 新型敏捷硬件开发语言 也简单说明了开发环